Разбор эсперанто слов
Эпохальная в своей бессмысленности тулза., (*1)
Пытается произвести синтаксический разбор слова на эсперанто., (*2)
Например: malfermiĝis: (mal)ferm<iĝ>[is], корень fermi (закрывать), приставка mal- (противоположность), -is - глагол в прошедшем времени, суффикс -iĝ - становиться.
Додумать смысл слова оставляется пользователю.
В примере, это, по-видимому, "закрылось"., (*3)
Работающий пример., (*4)
Для русского языка используется словарь на три тысячи корней, основанный на этом., (*5)
Для протестированных текстов (несколько книг) определяет около 80% уникальных слов, покрывая при этом до 95% текста.
Большинство пропущенных слов - имена и названия., (*6)
На данный момент не справляется с составными словами., (*7)
Требования, установка и всё такое
Требования: PHP 5.4+, (*8)
Установка: компосер (go/ewp) или руками (всё в PSR-4)., (*9)
Все нижеописанные классы находятся в пространстве имён go\ewp., (*10)
Формат текста
Большинство методов понимают только нормализованную форму текста, то есть:, (*11)
- Вся диакритика должна быть приведена к
x-форме. То есть ĝ - gx и т.д.
-
ŭ - также ux (а не u~).
- Все буквы приведены к нижнему регистру.
Произвольная форма (которую понимают меньшинство методов) подразумевает:, (*12)
- Возможно наличие диакритики.
- Также рядом с ней могут содержаться буквы в
x-форме.
- Заодно может быть
u~ и U~.
- Регистр может быть любым.
- Допустимы знаки пунктуации.
Конвертация:, (*13)
-
Diacritic::diacritic2latin($text) - текст в произвольной форме в нормализованную.
-
Diacritic::latin2diacritic($text) - обратно.
Locale: локаль
Локаль указывает на какой язык переводим.
Пока определена только русская.
Большинство сервисов доступно через локаль., (*14)
-
Locale::getSysLocale(string) - получить системную локаль (определённую в библиотеке, доступна только ru).
-
new Locale(string $dir) - создать локаль из каталога (формат каталога описан ниже).
Parser: анализатор
Парсер доступен через локаль:, (*15)
use go\ewp\Locale;
$parser = Locale::getSysLocale('ru')->getParser();
Метод parse() получает слово и возвращает результат его анализа., (*16)
echo $parser->parse('malfermigxis'); // (mal)ferm<igx>[is]
На выходе экземпляр класса Result или NULL если корень не определён., (*17)
Result: результат разбора
Объект со следующими полями:, (*18)
-
root: основа слова (в примере ferm)
-
prefixes: массив найденных приставок (в примере [mal])
-
suffixes: массив найденных суффиксов (в примере [igx])
-
part: часть речи в виде окончания (is, может быть NULL)
-
accus: аккузатив (винительный падеж) (TRUE/FALSE)
-
plural: множественное число (TRUE/FALSE)
Всё в нормализованной форме., (*19)
__toString() выводит объект в виде (mal)ferm<igx>[is]., (*20)
Перевод
Полученные части слова можно перевести на язык локали., (*21)
Перевод корня
Сначала нужно привести основу к базовому корню, потом перевести., (*22)
$dict = $locale->getDict();
$root = $dict->getRoot($result->root); // ferm --> fermi
echo $dict->translate($root); // fermi --> закрывать
Перевод приставки
echo $locale->getPrefixes()->translate('mal'); // противоположность
Перевод суффикса
echo $locale->getPrefixes()->translate('igx'); // становиться
Фонетика
Можно даже немного фонетикой побаловаться:, (*23)
$phonetics = $locale->getPhonetics();
echo $phonetics('malfermigxis'); // малфэрмиджис
Структура локали
Локаль хранится в каталоге.
Предустановленные локали хранятся в source/locals/$locale., (*24)
-
roots.txt - корни
-
prefixes.txt - приставки
-
suffixes.txt - суффиксы
-
phonetics.txt - произношение букв
Все файлы представляют собой список элементов по одному на каждой строке, сначала элемент на эсперанто, потом, через двоеточие, перевод:, (*25)
abelo : пчела
abismo : пропасть, пучина
abnegacio : самоотверженность
aboli : отменять, уничтожать
abolicii : отменять, уничтожать
abomeno : отвращение
В приставках и суффиксах, более длинные должны идти раньше более коротких., (*26)
Freq: частотный словарь
Приблуда, позволяющая проверить, насколько успешно анализатор разбирает слова., (*27)
use go\ewp\Freq;
$freq = new Freq('file1.txt');
$freq->appendFile('file2.txt');
$freq->appendFile('file3.txt');
$freq->appendContent('Tio estas iom da enhavo');
Словарю скармливаются тексты (в произвольной форме).
Можно посмотреть их статистику:, (*28)
$freq->getWords();
Возвращает упорядоченный словарь всех найденных слов (в нормализованной форме) и их количество.
Например:, (*29)
[la] => 7218
[mi] => 3342
[kaj] => 3156
[de] => 2010
[en] => 1289
[al] => 1215
[li] => 1204
[ne] => 1168
[estis] => 1136
[vi] => 847
$freq->getCount() - возвращает общее количество найденных слов (не уникальных, которых можно получить из размера предыдущего массива), а именно всех слов., (*30)
$res = $freq->passParser($parser);
Этот метод пропускает все слова через переданный ему анализатор.
Возвращает объект со следующими полями:, (*31)
-
success - массив всех успешно разобранных слов (в формате 'malfermigxis' => '(mal)ferm<igx>[is]').
-
fail - порядковый массив всех слов, которые не удалось разобрать (упорядоченный от самых частотных).
-
uniq - всего уникальных слов.
-
words - общее количество слов.
-
puniq - разобранных слов.
-
pwords - какое количество составляют разобранные слова.
-
peruniq - процент разбора уникальных.
-
perwords - процент разбора среди общего количества.
Пример разбора текста.
Успешные слова:, (*32)
[la] => la
[mi] => mi
[kaj] => kaj
[de] => de
[estis] => est[is]
[ne] => ne
[li] => li
[al] => al
[en] => en
[vi] => vi
[por] => por
[estas] => est[as]
[ni] => ni
[ke] => ke
[sed] => sed
...
Обломные слова:, (*33)
muro, kapjesis, finfine, fortikajxo, spukavatem, lizbeta, reen, konstruajxo, samtempe, ekstaris ...
Статистика:, (*34)
uniq : 11433
count: 65009
p uniq: 8636 (75%)
p count: 60130 (92%)