Pull to refresh

Comments 44

Интересная статья, спасибо. Порадовал простой и логичный подход, с которым отнеслись к делу, и получили простую функциональность, в принципе, простыми методами.

It's just simple working )
tr-tr.ru/
но там только экспортированный из fireworks набросок дизайна)
надеюсь, что подробнее расскажу попозже, когда придет время.
как в питоне можно узнать количество занятой текущим процессом памяти. По возможности кроссплатформенно как-нибудь.

Кросплатформенно никак. Пример кода под unix можно посмотреть в Measurement techniques в Efficient String Concatenation in Python.
делал аналогичное, даже послал в проект, они его загрузили к себе: www.aot.ru/download.php (в конце страницы: Alexander Pak's Morphology)
для питона есть очень мощная библиотека для обработки естественного языка: NLTK — www.nltk.org/
Ваш пример меня вдохновил, Вы, можно сказать, первопроходец в этом деле) Однозначно в карму +.
Но писал с нуля, т.к. мне так было проще.
А NLTK — это, насколько мне известно, только английский язык, был интересен именно русский.

спасибо :)
По поводу NTLK — по-моему, если в него загрузить грамматику и словари для русского языка, то можно работать и с русским. Другое дело, что для русского нет нормальных словарей, и АОТ — действительно, наиболее развитый открытый источник.
Насчет NTLK мне показалось, что там не совсем так. В ней куча примочек для синтаксиса, статистики и анализа текста, но, что касается именно морфологии, максимум, что я увидел — стеммер Портера, с некими планами добавления Snowball. Думаю, просто для английского языка это не самая актуальная задача, у них и стеммеры работают более-менее нормально для большого круга задач.
Лемматизацию, к примеру, можно выполнить через интерфейс к WordNet базе, там для каждой словоформы хранится лемма. Проблема опять таки в словаре, проект русского ворднета — project.phil.pu.ru/RussNet/ либо умер либо очень медленно развивается.
Отличная статья — куча важной информации.
Бутявки не кузявые, от бутявок дудонятся
Спасибо, очень интересная статья!

С морфологическим анализом есть несколько тонкостей:
1. Неявно присутствует шаг нормализации текста. — Что считать словом и т.д.
2. У Вас м.а. основан на словарях (и в общем-то это правильно), и следовательно, качество м.а. зависит от словаря.
3. Сам по себе анализ слова — не такая сложная вещь. Гораздо сложнее тонкости вида анализа аббревиатур, сложных слов вроде автошкола или бетономешалка(в зависимости от словарей это одно или два слова), а так же проверка корректности вариантов разборов.

Ну и для хранения словарей намного эффективнее использовать DAWG(directed acyclic word graph), ну или если лень писать, то trie. 150M для морфологии — это черезчур :)
Ага, тут неявно подразумевается еще какой-то код, который разберет текст на слова. И что при разборе он вполне может выудить еще часть информации, например, из того, где стоит это слово (например, сразу после точки) и какие в нем буквы — первая заглавная, все заглавные или все строчные.
Тоже думал, что вместо хэшей деревья/графы какого-то рода будут лучше (за наводку на DAWG и trie спасибо, даже, скорее всего, постараюсь прикрутить, как время будет). Просто изначально была позиция делать все максимально просто и «тупо», если результат не будет устраивать, включать голову. Поэтому и на словообразование «забил», оставив такие слова на растерзание предсказателю по префиксу (авто-школа, хотя тут пример не совсем правильный, слово в словаре). Тем более что словообразования ни в lemmatizer, ни в phpmorphy тоже нет, выезжают на словаре (насколько я знаю).

А вот с проверкой корректности и правда что-нибудь придумать бы, «глазами» можно многого не увидеть. Пока вот решил просто попробовать увеличить число «глаз», выложив тут это все хозяйство.
Респект. Ход мыслей отличный. Красиво :) И «Пуськи бятые» очень порадовали. :)
UFO landed and left these words here
>Из текста предсказатель не справился с именем собственным Калуша, с «Калушата»(они стали мужиками «Калуш» и «Калушат»)
«калушата» — это не имя собственное, это «калушонок» во множественном числе, слово образовано от «Калуша», с помощью "-онок" (не помню точно, вся ли эта часть суффикс), во множественном числе превращается в «калушата». (можно сравнить: «зайчонок — зайчата»). А имена собственные всегда с большой буквы пишутся.

«зюмо» — это наречие (сравните с «далеко», «высоко», «хорошо»), а удвоение для усиления используется.

Спасибо за интересную статью, хочу заниматься чем-нибудь на стыке программирования и лингвистики, но пока серьезных знаний ни в первом, ни во втором не хватает.
А какое количество слов можно разобрать с помощью словаря?
Там около 140тыс. лемм, 2700 парадигм слов, 170тыс. (насколько я помню) правил образования слов.
В итоге выходит около 5 миллионов уникальных слов в словаре.
очень интересная и сложная предметная область, учитывая многообразие русского языка :)
О, спасибо. А то я планировал lemmatizer`ом пользоваться из питоньих программ. А тут, оказывается, уже нативная реализация готова.
у lemmatizer'а свои плюсы: скорость, надежность.
у pymorphy — простота, расширяемость
Если для Ваших нужд подойдет pymorphy, то это здорово.
По hg.assembla.com/pymorphy отдаётся HTML`ка с Content-Type: text/plain. Это не хорошо.
На главной странице (http://www.assembla.com/wiki/show/pymorphy ?) прошу указать команду для установки последней версии (hg fetch… ?).
hg clone http://hg.assembla.com/pymorphy

Написал там в вики про установку.
с text/plain — какой-то баг ассемблы.
По идее, у hg веб-интерфейс с html-страничкой, на которой можно посмотреть историю, отдельные изменения — и скачать все целиком в архиве.
Спасибо, очень интересно.
Я знал ребят, которые знаимались такими вещами, они широко использовали словарь Лебедева scon155.phys.msu.su/eng/lebedev.html, там есть файл с правилами образования совоформ russian.aff, может быть он и вам пригодится.
Может-быть кому-то пригодится содранный с интернета ботом словарик для имён.
Старался, вроде там довольно много понабралось.
Кому понравится — отпишитесь. :)
(UTF-8)
slil.ru/26554601
Баги. Баги, баги, баги… Спасибо, будет исправлено!
В encode_dicts.py пришлось заменить одну функию:

def convert_file(in_file, out_file, in_charset, out_charset):
text = codecs.open(in_file, «r», in_charset).read()
codecs.open(out_file, «w», out_charset ).write(text)
Cпасибо, так и правда лучше, закоммитил.
P.S. репозиторий открыт на запись для всех, кто зарегистрирован на assembla.
Постараюсь помочь с развитием проекта. Но как мне видится, это скорее будет форк, заточенный под мои нужды.
Забыли сказать, что Бутявку придумала Людмила Петрушевская, в далёком 1984-м году.
Вот мне интересно… А в каких-нибудь больших опенсорсных проектах использовались серьезные анализаторы грамматики?

Скажем в OO.Org? Я не влезал никогда глубоко в эту тему; но вроде там только чисто орфографическая проверка слов по словарю в наличии, а более глубокой проверки как в Ms Office — нетуть. Или это я от жизни отстал?
mystem предлагает следующую тестовую строку:
«В мурелки шлепают пельсиски. В стакелках светится мычай.»
пельсиски — наречие

А я взял в качестве тест-кейсов русские скороговорки:
  • Карл у Клары украл кораллы, а Клара у Карла украла кларнет.
    кларнет — глагол
  • Курил турка трубку, клевала курка крупку: не кури, турка, трубки, не клюй, курка, крупки!
    клевала — существительное
    кури — существительное
    клюй — существительное
  • Наши поезда — самые поездатые поезда в мире, и никакие другие поезда не перепоездадят наши поезда по поездатости.
    поездатые — глагол

Почти круто, всегда можно немножко доработать :-)
Не очень интересно: снятия неоднозначности нет; слова, записанные через дефис — не разбираете правильно («человек-акула», «скажи-ка»); не open-source; словари такие же неполные, как и везде («алешенька» — женский род), склонятора нет (видимо, временно?). Не представляю, кому может понадобиться «голый» морфологический разбор в виде сервиса.

Я, понятно, лицо заинтересованное, но в github.com/kmike/pymorphy2 и словари лучше, и предсказатель умнее, и open-source все.
Это первый уровень, морфологический. Неоднозначность здесь и не должна сниматься.
Она снимается на последующих уровнях — на синтаксическом и семантическом.

"Алёшенька" по мнению pymorphy2 — вообще краткое прилагательное женского рода.


Parse(word='алёшенька', tag=OpencorporaTag('ADJS femn,sing'), normal_form='алёшенек', score=0.6976744186046512, methods_stack=((<FakeDictionary>, 'алёшенька', 391, 1), (<KnownSuffixAnalyzer>, 'енька')))

А вот тут очень даже неплохо:


Parse(word='человека-акулы', tag=OpencorporaTag('NOUN,anim,masc sing,gent'), normal_form='человек-акула', score=0.4376812425457545, methods_stack=((<HyphenatedWordsAnalyzer>, ((<DictionaryAnalyzer>, 'человека', 488, 1),), ((<DictionaryAnalyzer>, 'акулы', 53, 1),)),))

Вам однозначно огромный + за проделанную работу.

Только что хотел написать «вот вам делать нечего было, писать свой костыль, когда есть pymorphy2» и тут ВНЕЗАПНО, это статья ещё на первую версию.
kmike, огромное Вам спасибо за эту замечательную библиотеку!
Only those users with full accounts are able to leave comments. Log in, please.