Это понятно , но кроме платных исходников под винду , есть бесплатные под юникс .Автор оригинала: Жигaн
[Farsh]
Там используется com объект(он платный у aot, стоит 250$, работает под виндой ) В пхп можно использовать при помощи http://de.php.net/manual/ru/book.com.php
$command = 'export RML="/home/AOT/morph"; cd $RML; Bin/TestLem Russian';
$output = shell_exec($command);
нет, обычно как раз строят без сортировки, на упорядоченных данных построение дерева происходит намного быстрее.а для патриции действительно нужно сортировать список слов?
весь алгоритм требует сортировки.// find longest common prefix" - это единственное место, где используется выгода от сортировки
$dict_bundle_ru = new phpMorphy_FilesBundle($dir, 'rus');
$morphy_ru = new phpMorphy($dict_bundle_ru, $opts);
$dict_bundle_en = new phpMorphy_FilesBundle($dir, 'eng');
$morphy_en = new phpMorphy($dict_bundle_en, $opts);
Но создал бы очень много новых проблем. Представьте, что в нескольких разных языках есть слово которое в какой-либо форму пишется одинаково, но правила его изменения в разных языках различны. Как в таком случае модуль морфологии должен угадывать правила какого из языков от него хочет увидеть пользователь?Словарь в юникоде, содержащий несколько языков одновременно, решил бы эту проблему (язык вообще не важен будет, как я понимаю).
Только вот определение языка для отдельно взятого слова задача практически неразрешимая. А для отдельно взятого текста примерно определить язык можно.А при обходе массива $alnum_all для каждого слова дополнительно нужно определять язык,
Символ в UTF-16 может представляться не только 2-я, но и 4-я байтами.Если дело в переменной длине кодирования знаков в UTF-8, то можно попробовать UTF-16.
А почему скорость должна снизится? Я таких причин не вижу, а вот унификация интерфейса(для разных языков с разными кодировками) и экономия времени на перекодировках может быть существенна. Действительно если волнует переменная длинна символа и utf-8, то можно использовать тот-же utf-16 или utf-32, в первом правда символ тоже может занимать 4 байта, но это довольно редкое явление.Жигaн:
>Поддержка различных кодировок будет в следующей версии.
utf-8 для кириллицы снизит производительность ~ в два раза, имхо проще и быстрее через iconv текст прогнать.
То, что немного это понятно, но это немного должны быть очень маленьким, а никак не в 2 раза.Как я понимаю, слова в utf-8 разбирать на буквы придется, а буквы переменной длины. Соотв-но дополнительные проверки немного снизят производительность.
А я думаю, что нет. Помоему однократный проход по строке с выполнением элементарных битовых операций должен быть быстрее чем построение и исполнение автомата разбирающего регулярное выражение. Но чтобы точно выяснить нужно провести измерения.Хотя preg_match_all('/./su') должна очень быстро работать для этих целей.
1) чукча не читатель, чукча писатель? ты пробовал сам разобраться в том, где тут цитированное, а где твое?Жигaн:
>Поддержка различных кодировок будет в следующей версии.
utf-8 для кириллицы снизит производительность ~ в два раза, имхо проще и быстрее через iconv текст прогнать.
Почему в 2 раза? Где слабое место?
Если дело в переменной длине кодирования знаков в UTF-8, то можно попробовать UTF-16.
Насколько я знаю структуры данных, производительности (по сравнению с работой с несколькими объектами phpMorphy) это не прибавит, а скорее наоборот, отнимет. Так что это тупо делается в виде пристройки на 100 строк к phpMorphy.В таком случае можно явно указать используемые языки и приоритеты, т.к. эта информация в большинстве случаев известна для текста. Например: array('ru', 'ua'), или array('en', 'de', 'it'). В случае коллизии выдавать основную форму слова для более приоритетного языка. Таких случаев не много должно быть и влияние на качество результата будет очень слабым. В существующих для phpMorphy словарях коллизия может возникнуть пока только для en и de.
смысл первой функции от меня вообще ускользает. А вторую прощу сделать в видеcм. is_utf8(), utf8_check()
А зачем в 2 раза больше итераций? От изменения кодировки что-ли количество символом с строке изменится? Нет. Изменится только размер самого символа в байта, так что просто на каждом узле дерева будет не однобайтный символ хранится, а двухбайтный (или 4-х байтный), а замена сравнения однобайтных символов на двухбайтные, я думаю, не может вызвать падение производительности в 2 раза. (в структуре дерева я могу ошибаться, так как точно не знаю как оно строится)2) медленнее в 2 раза будет из-за того, что в среднем на одну русскую букву будет не 1, а 2 байта. Из-за, например, этого придется делать в 2 раза больше итераций в работе с деревом.
как-то так, агаИли там дерево строится только по байтам вводимой строки, а не по символам?
Ага... Посему я делаю такие выводы:Ваш код должен обработать всю строку до конца, чтобы потом возвратить результат. is_utf8(), utf8_check() возвращают FALSE сразу при первой неудаче. Часто об этом становится известно уже на первых нескольких символах.
А почему нельзя в случае перехода к многобайтным кодировкам строить дерево по символам, а не по байтам исходной строки? В языке-же базовый (слово не очень удачное, но другое подобрать не могу) элемент - это символ, а не байт.как-то так, ага