Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Невозможные формы морфологии. #123

Open
LecronRu opened this issue Mar 17, 2023 · 1 comment
Open

Невозможные формы морфологии. #123

LecronRu opened this issue Mar 17, 2023 · 1 comment

Comments

@LecronRu
Copy link

Проблемы не с единичном словом. Невозможные формы у 80% слов. Количественную долю ошибок не проверял, но например слово "в" распознается также как прилагательное, наречие и союз, а слово "вслед" как глагол.

Более подробное исследование провел для слова "девятьсот". Распознается как 30 форм. Причем нет правильной NUM Nom. Если частично корректные NUM Inan Acc Masc и NUM Nom Fem Sing учитывать как правильные, то из 357 предложений, на 8 правильных, приходится 349 ошибочных.

  • ADJ Dat Pos Masc Sing
  • ADJ Gen Pos Masc Sing
  • ADJ Loc Pos Masc Sing
  • ADJ Nom Pos Fem Sing
  • NOUN Anim Acc Masc Sing
  • NOUN Anim Gen Fem Plur
  • NOUN Anim Nom Fem Sing
  • NOUN Inan Acc Fem Sing
  • NOUN Inan Dat Masc Plur
  • NOUN Inan Gen Masc Sing
  • NOUN Inan Gen Neut Sing
  • NOUN Inan Nom Fem Sing
  • NUM Acc
  • NUM Dat
  • NUM Gen
  • NUM Inan Acc Masc
  • NUM Loc
  • NUM Nom Fem Sing
  • NUM Yes
  • PUNCT
  • VERB Imp Fem Ind Sing Past Fin Act
  • VERB Imp Nom Fem Sing Past Part Act
  • VERB Perf Dat Plur Past Part Act
  • VERB Perf Fem Ind Sing Past Fin Act
  • VERB Perf Fem Sing Past Short Part Pass
  • VERB Perf Gen Plur Past Part Act
  • VERB Perf Gen Plur Past Part Pass
  • VERB Perf Inf Act
  • VERB Perf Loc Masc Sing Past Part Act
  • VERB Perf Nom Fem Sing Past Part Act

Как глагол распознается в предложениях:

  • одна тысяча девятьсот восемьдесят шестого года.
  • в тысяча девятьсот двадцать четвертом году по разверстке цк влксм послали меня во флот.
  • она погибла еще в девятьсот седьмом.

Как прилагательное в:

  • с девятьсот четвертого сотрудничал по искоренению подрывных элементов.
  • хотя бы в том же девятьсот пятом году.

Как существительное в:

  • ну, а под какими кличками работал с девятьсот девятого года, мне неизвестно.
  • кроме того, за три минувших года, исчисляя с тысяча девятьсот шестнадцатого, взимается с крестьян недоимка.

Даже как PUNCT в:

  • он как раз перебирал в уме всех тех, кто когда-либо за прошедшие девяносто девять лет объявлял ему кровную месть, а перебрав, присовокупил к ним тех, кто когда-либо за прошедшие девятьсот девяносто девять лет объявлял кровную месть его роду.

Необходимо либо внутреннее согласование с формами PyMorphy, либо интерфейс со списком вариантов распознавания в порядке убывания вероятности.

@LecronRu
Copy link
Author

Если правильно разобрался в алгоритме работы, исправить сравнительно просто.
Модель, для каждого слова, генерирует список коэффицентов, размерностью в количество известных ей форм морфологии (753). После, функция argmax определяет позицию максимального значения этой матрицы. Которая и указывает на целевую форму.

Нужно предварительно определить список индексов допустимых форм и искать максимальный из них.

pred = np.array([1, 2, 4, 1, 3]) # length 753
avail = (0, 1, 3, 4)
idx = pred.take(avail).argmax()
pred = avail[idx] # -> 4

Есть некоторая сложность в определении соответсвия форм OpenCorpora (MorphAnalyzer().dictionary.gramtab) и модели.
Например форме OpenCorpora(ADJF,Qual masc,sing,nomn) соответсвует форма модели ADJ Nom Masc Sing, которой нет в списке возможных. Но есть ADJ Nom Pos Masc Sing и ADJ Nom Sup Masc Sing. Разумно включать в список возможных все более обширные, чем целевая, формы.

ud_tags = [parse_form(_) for _ in tags_vocab.item_ids] # разбор форм модели [{pos, *feats_value}, ...]
items = {}
for tag in self.vocab.dictionary.gramtab:
    pos = ud_pos(tag)
    feats = (v for _, v in ud_feats(tag))
    key = {pos, *feats}
    ids = tuple(i for i, t in enumerate(ud_tags) if key <= t)
    items[tag] = ids

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant