Как работи pymorphy - Документация на pymorphy 0
Главна информация¶
pymorphy е библиотека за морфологичен анализ на Python, разпространявана под лиценза на MIT.
Въз основа на разработките от сайта aot.ru. Речници (LGPL) за български и английски, както и идеи - от там.
Aot.ru също описва конкретни алгоритми за изпълнение, но от гледна точка на теорията на автоматите. Внедряването в pymorphy е независимо, не използва държавни машини, данните се съхраняват в хранилище ключ-стойност (поддържат се различни опции), всички алгоритми са пренаписани с този факт предвид.
pymorphy също има някои функции, които не се намират в оригиналната реализация, като например:
- поддържа се разбор на думи с тирета, поддържа се разбор на думи със сложни префикси;
- реализирано склонение на думи, поставяне на думите в множествено число;
aot.ru речници¶
Речниците от уебсайта aot.ru съдържат следната информация:
- словесни парадигми и специфични правила на обучение;
- акценти;
- потребителски сесии;
- набор от префикси (продуктивни префикси);
- леми (непроменяеми части на думата, основи);
- граматична информация - в отделен файл.
От всичко това се интересуваме от правилата за образуване на думи, префикси, леми и граматична информация.
Всички думи са образувани по същия принцип:
Файлът с речника е обикновен текстов файл, за всеки раздел първо се посочва броят на редовете в него, а след това има редове, техният формат е описан тук.
След като сте разбрали структурата на речника, можете да напишете първата версия на морфологичния анализатор.
Морфологичен анализ¶
Всъщност ни е дадена дума и трябва да я намерим сред всички разумни комбинации от формата:
Случаят опростява това, което се оказа (както показаха няколко реда в python).В нашия език (и в английския май също) има само 2 „представки“, а в речника на българския език има около 20 представки. Следователно можете да търсите между комбинации:
мислено свързване на списък с префикси и префикси и след това извършване на малка проверка.
Ако думата започва с един от възможните префикси, тогава я изхвърляме (префикса) и се опитваме да анализираме морфологично остатъка (рекурсивно), след което просто добавяме изхвърления префикс към получените форми.
В резултат на това се оказва, че задачата се свежда до търсене сред комбинации:
Търсим подходящи леми, след което гледаме дали има подходящи окончания за тях. [1]
За търсенето се използва стандартният асоциативен масив на Python (dict или всеки обект, който поддържа __getitem__ , __setitem__ и __contains__ ), в който са поставени всички леми. Резултатът е речник във формата:
тези. ключът е лемата, а стойността е списък с валидни номера на парадигмата. И тогава да тръгваме - първо смятаме, че лемата е първата буква на думата, след това, че това са първите 2 букви и т.н. Според лемата се опитваме да получим списък от парадигми. Ако сме го разбрали, тогава във всяка допустима парадигма преминаваме през всички правила и виждаме дали нашата дума ще се окаже, ако правилото бъде приложено. Оказва се - добавяме го към списъка с намерени форми.
[1] | Имаше и опция - незабавно да съставя речник от всички възможни думи от формата лема + окончание, в крайна сметка се оказаха някъде около 5 милиона думи, не толкова много, но като цяло опцията не ми хареса. |
Допълнителни подробности за това как работи морфологичният анализатор¶
Думи без неизменна част¶
Ако си спомним примера, който беше в началото, за „ХОРА” - „ЧОВЕК”, тогава става ясно, че има думи, които нямат неизменна част. Оказа се, чеима такава хитра магическа лема "#" в речника, която съответства на всички празни леми. За всички думи трябва да търсите повече и там.
Склонение на думи¶
За да „склони“ дума (поставяйки я в определена граматична форма), анализаторът първо съставя списък на всички форми, в които може да бъде дадената дума, след това премахва от тях онези, които не съответстват на предадената форма, и след това избира от останалия вариант, който е най-близък по форма до оригинала.
Поставянето на думите в множествено число след това се осъществява тривиално чрез „склонение“.
Предсказател¶
Въведен е „предсказател“, който може да работи с думи, които не са в речника. Това са не само редки думи, неизвестни на науката, а просто печатни грешки, например.
За предиктора се прилагат 2 подхода, които работят заедно.
Първи подход: Отгатване на префикса¶
Ако думите се различават само по това, че нещо се приписва на една от тях отпред, тогава най-вероятно те ще бъдат наклонени по същия начин.
Изпълнява се много просто: първо се опитваме да приемем първата буква от думата като префикс, след това първите 2 букви и т.н. И това, което остава, се предава на морфологичния анализатор. Е, ние правим това само за не много дълги префикси и не много къси остатъци.
Втори подход: Прогноза в края на думата¶
Ако 2 думи завършват по един и същи начин, тогава те най-вероятно ще бъдат наклонени по същия начин.
Вторият подход е малко по-труден за прилагане (много по-труден, ако имате нужда от добра реализация)) и „по-умен“ по отношение на прогнозите.
Първата трудност е свързана с факта, че краят на една дума може да се състои не само от окончание, но и от част от лема. За простота, тук отново е включен асоциативен масив (или заместител за въвеждане на патица) спредварително подготвени с всички възможни окончания на думите (до 5 букви). Имаше няколкостотин хиляди от тях. Ключът на масива е краят на думата, стойността е списък с възможни правила. Освен това - всичко е същото като при търсене на подходяща лема, само че не вземаме началото на думата, а 1, 2, 3, 4, 5-буквени краища и вместо леми вече имаме нов чудовищен масив.
Втората трудност - оказва се много прословут боклук. Този боклук се отрязва, като се има предвид, че получените думи могат да бъдат само съществителни, прилагателни, наречия или глаголи.
Дори след това ни остават твърде много правила, които не са за боклук. За категоричност, за всяка част от речта оставяме само най-често срещаното правило.
Трудни думи¶
Версия 0.5 добави поддръжка за синтактичен анализ на сложни думи, написани с тире (например „BROTHERLY“ или „SPIDER-MAN“).
Поддържат се думи, образувани по 2 начина:
- лявата част е неизменен префикс / основа (например „ИНТЕРНЕТ МАГАЗИН“, „ВЪЗДУШНА КАПКА“. В този случай формата на думата се определя от втората част. Този случай винаги се добавя към възможните опции за анализ.
- 2 равни части, наклонени една към друга (например „СПАЙДЪР-МЕН“). Този случай се добавя към възможните анализи само когато и двете части имат еднаква форма (има анализи на първата част, които съвпадат с тези на втората част).