Как эффективно подсчитывать кортежи символов в PHPPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как эффективно подсчитывать кортежи символов в PHP

Сообщение Anonymous »


Мне нужно быстро посчитать кортежи символов (или N-граммы) в огромных файлах/строках (от 10 МБ до 1 ГБ +) в проекте PHP (классификаторе файлов).

Текущая реализация рассчитана на количество одиночных символов (N=1) и выполняется очень быстро за 0,x сек. для очень больших строк (до 1 миллиарда символов/байт)

// возвращает ассоциативный массив [char => count] функциональные частоты($txt) { $index = count_chars($txt, 1); foreach ($index как $code => $nb) { $count[chr($code)] = $nb; } вернуть $счет; } Я хотел бы изменить его для работы с биграммами (N=2 или более), поэтому я написал это

// возвращает ассоциативный массив [charTuple => count] функция частоты($txt, $n) { $length = strlen($txt) - $n+1; for ($i = 0; $i < $length; $i++) { @$count [substr($txt, $i, $n)] ++; } вернуть $счет; } // Обратите внимание: '@' некрасиво, но кажется быстрее, чем если бы isset() Однако этот код очень медленный: 45 секунд. в том же файле для N = 1 (примерно в 100 раз медленнее) и более минуты для N = 2.

Я попробовал альтернативу прямого доступа + конкатенации:

function twograms($txt) { $length = strlen($txt) - $n; for ($i = 0; $i < $length; $i++) { @$count [$txt[$i] . $txt[$i+1] ] ++; } вернуть $счет; } И он работает немного быстрее — 42 секунды. (+/- погрешность)

Это по-прежнему слишком медленно и не соответствует эффективности встроенной функции count_char().

Вот онлайн-ссылка PHP для тестирования/тестирования.

Есть ли альтернатива? Есть ли способ более эффективно подсчитывать кортежи символов?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»