Я реализую класс, который пытается обнаружить стоп-слова в корпусе. Один из методов в указанном классе, конечно, idf()
:
public function idf(){
// 1) In how many articles does each term appear
$tokensFreq = $this->computeTokensFreq();
// 2) Applies the IDF formula (array format : $term => $idf)
$tokensIDF = $this->computeIDF($tokensFreq);
// 3) Sort array so that 'stopwords' (smaller idfs) appear at the top
arsort($tokensIDF);
return $tokensIDF;
}
Проблема в том, что эта функция очень медленная: для прохождения относительно небольшого массива из 4 006 токенов требуется более 5 минут.
Сначала я думал, что неправильно реализовал алгоритм (я даже заменил все array_key_exists
с isset
). Но после дальнейшей проверки выяснилось, что это arsort
Позвоните, кто берет льва часть времени выполнения.
Чтобы уменьшить нагрузку, я добавил SORT_NUMERIC
флаг к arsort
функционировать, но зря.
Прежде всего, это нормально, что сортировка такого массива занимает все это время?
Во-вторых, и самое главное, что я могу сделать, чтобы все стало гладко?
Задача ещё не решена.
Других решений пока нет …