lepeap / DeepMorphy

Морфологический анализатор для русского языка на C# для .NET
MIT License
48 stars 8 forks source link

Словарь для известных слов #2

Closed DenisNP closed 5 years ago

DenisNP commented 5 years ago

Возможно, суть проекта исключительно в машинном обучении, но было бы круто переписать на шарп логику pymorphy2 для известных слов из словаря. Сейчас библиотека допускает ошибки, например:

var morph = new MorphAnalyzer( true);
var results = morph.Parse(new[] {"живёте", "телом", "собаковод"});
foreach (var res in results)
{
    Console.WriteLine(res.ToString());
}

живёте : Lemma: живую Tags: гл,мн,2л,наст телом : Lemma: тел Tags: сущ,муж,ед,тв собаковод : Lemma: ообаковод Tags: сущ,муж,ед,им

lepeap commented 5 years ago

Сейчас словарик есть, по идее в него должны попадать все случаи из датасета, где сеть ошибается в лемматизации. Надо посмотреть, почему на приведенных примерах это не работает)

На данный момент слабым местом библиотеки является лемматизация, это моя первая seq2seq модель, для ее оптимизации не очень хватает опыта. В следующих версиях постараюсь ее прокачать.

На самом деле не очень верно смотреть результат только по лучшему тегу. Не всегда по виду слова сеть может однозначно понять к какой части речи оно относится. Поэтому лучше учитывать все теги результата (для этого можно использовать методы HasLemma и HasCombination)

DenisNP commented 5 years ago

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

В какой-то момент мы отказались от Питона и загрузили в C# весь словарь Зализняка и ходим по нему, но уж больно много памяти занимает. Активно ищем что-то вроде pymorphy2 но для C#.

lepeap commented 5 years ago

Ясно, я так же с питона на .net мигрировал в одном проекте и без pymorphy2 решил попробовать на сетях обучить анализатор. У меня только задача по извлечению информации из текста.

Из имеющегося сейчас для Вашей задачи можно попробовать метод HasLemma (с ним у меня по метрикам для задачи нахождения леммы результат примерно на 8-10 процентов лучше, чем есть смотреть только главный тег). Если есть команды в виде лемм, то попробовать вызывать res.HasLemma("открыть") (ну это правда как я нормальную форму для глаголов поправлю).

Я тогда, если что-то с лемматизацией улучшится или со словариком что-то придумаю, отпишусь сюда)

lepeap commented 5 years ago

В последних версиях значительно улучшил лемматизацию (на тестовом датасете 99 процентов слов обрабатывается верно). В версии 1.2.3 добавил новый словарь, в него занес все ошибочные случаи из датасета (ошибки либо в лемматизации либо в классификации по тегам). Так что в текущих версиях все должно работать значительно лучше.

var morph = new MorphAnalyzer( true);
var results = morph.Parse(new[] {"живёте", "телом", "собаковод"});
foreach (var res in results)
{
    Console.WriteLine(res.ToString());
}

живёте : Lemma: жить Tags: гл,мн,2л,наст телом : Lemma: тело Tags: сущ,ср,ед,тв собаковод : Lemma: собаковод Tags: сущ,муж,ед,им