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

Лемматизация в анализаторе deeppavlov из PyMorphy #1137

Open
gasyoun opened this issue Feb 21, 2020 · 5 comments
Open
Assignees

Comments

@gasyoun
Copy link
Contributor

gasyoun commented Feb 21, 2020

Меня интересует повышение доли правильно лемматизированных санскритизмов (санскритских слов в кириллической записи) в русском языке с помощью морфологического анализа deeppavlov. Хуже всего анализатор справился с определением леммы слов и показал точность 47%. Лучше всего - с определением числа, анализатор верно отметил 99% случаев, а также неплохо справился с падежом - 96% правильного определения. Точность определения рода составляет 75% для слов из древнеиндийского эпоса Махабхарата.
Как я себе представляю цепочку зависимостей и надстроек:

  1. deeppavlov
  2. PyMorphy
  3. OpenCorpora

Не могу понять, на каком уровне нужно править, чтобы увеличить точность? Добавить Махабхарату в OpenCorpora и сгенирировать новый словарь для PyMorphy? На уровне морфологии что тогда добавляет deeppavlov к выкачанным из PyMorphy данным?

lemma

В 69% случаев неправильного лемматизирования анализатор верно определил род, число и падеж словоформы. Самой частотной ошибкой в образовании леммы стало опущение “-а” на конце слова: ровно 50% случаев (“индра” → “индр” и т.д.), причем все из таких слов (кроме одного случая “ганами” → “ган” вместо “гана”) стояли в Именительном падеже и единственном числе, падеж и число определены анализатором верно.
В 14% случаев неверной лемматизации анализатор оставил словоформу в исходном виде (“якшами” → “якшами” и т.д.). 8% ошибок характеризуются заменой “-и” на “-ь” на конце слова: “адити” → “адить” и т.д. Некоторое количество ошибок допущено с заменой “-ья” на “-ий” на конце слова (“сурья” → “сурий”), лемматизированием слова как прилагательного (“вайшампаяна” → “вайшампаяный”), а также появлением “-й” на конце слова (“джанамеджая” → “джанамеджай”). В одном случае анализатор, видимо, нашел известную ему часть в слове и привел ее к лемме: “мухурта” → “мухурот” (“рта” → “рот”).
Ошибка в определении падежа словоформы “крита” связана с тем, что слово расположено в контексте перечисления и предшествует ему слово в родительном падеже: “... Носитель Вед, Крита, Трета, Двапара и Кали...”.
В 80% случаев неверного приписывания слову женского рода (когда оно мужского рода) слово заканчивается на “-а”: “бхима”, “рудра”, “шукра” и т.д. Несмотря на неверное определение рода, 48% таких слов были правильно лемматизированы, все они стояли в Именительном падеже: “варуна” → “варуна”, “будха” → “будха” и т.д.
Стоит заметить, что во всех случаях (кроме одного - “махабхараты”) анализатор смог верно определить число. Для словоформы “махабхараты” анализатор смог определить только лемму (неверную). Контекст: “Такова в книге «Лесная» великой «Махабхараты» третья глава”. Прошу указать - куда бежать, спасибо.

@gasyoun
Copy link
Contributor Author

gasyoun commented Feb 25, 2020

Как понять какая часть кода выдает ерунду? надо править PyMorphy? в чем тогда роль нейронных сетей deeppavlov? Прошу подсказать выход, спасибо. Как понять почему существительное агни было лемматизировано как глагол?

агни['агнуть', 'агну', 'агнём', 'агнёшь', 'агнёте', 'агнёт', 'агнут', 'агнул', 'агнула', 'агнуло', 'агнули', 'агни', 'агните', 'агнущий', 'агнущего', 'агнущему', 'агнущего', 'агнущий', 'агнущим', 'агнущем', 'агнущая', 'агнущей', 'агнущей', 'агнущую', 'агнущей', 'агнущею', 'агнущей', 'агнущее', 'агнущего', 'агнущему', 'агнущее', 'агнущим', 'агнущем', 'агнущие', 'агнущих', 'агнущим', 'агнущих', 'агнущие', 'агнущими', 'агнущих', 'агнувший', 'агнувшего', 'агнувшему', 'агнувшего', 'агнувший', 'агнувшим', 'агнувшем', 'агнувшая', 'агнувшей', 'агнувшей', 'агнувшую', 'агнувшей', 'агнувшею', 'агнувшей', 'агнувшее', 'агнувшего', 'агнувшему', 'агнувшее', 'агнувшим', 'агнувшем', 'агнувшие', 'агнувших', 'агнувшим', 'агнувших', 'агнувшие', 'агнувшими', 'агнувших', 'агнутый', 'агнутого', 'агнутому', 'агнутого', 'агнутый', 'агнутым', 'агнутом', 'агнутая', 'агнутой', 'агнутой', 'агнутую', 'агнутой', 'агнутою', 'агнутой', 'агнутое', 'агнутого', 'агнутому', 'агнутое', 'агнутым', 'агнутом', 'агнутые', 'агнутых', 'агнутым', 'агнутых', 'агнутые', 'агнутыми', 'агнутых', 'агня', 'агнув', 'агнувши', 'агнут', 'агнута', 'агнуто', 'агнуты']
адити['адить', 'адити', 'адити', 'адить', 'адитью', 'адити', 'адити', 'адитей', 'адитям', 'адити', 'адитями', 'адитях']

Всего 28 существительных спрягаются ошибочно как глаголы:

агни
адити
арундхати
арштишена
брихаткирти
бхангасвари
бхарати
вайшампаяна
васушена
вивиншати
вити
гопали
гопати
дала
девала
джамадагни
дити
намучи
паршати
рати
сушена
тринасомагни
шакамбхари
шакти
шарьяти
шиби
шрутакирти
яяти

@AlexeySorokin
Copy link
Contributor

@gasyoun DeepPavlov используется только для определения правильной морфологической метки, далее возвращается лемма из анализа PyMorphy, лучше всего соответствующая данной метке. Соответственно, все ошибки на стороне PyMorphy.

Можно ли исправить данное поведение --- да, наверное, можно, но путём изменения существующей архитектуры. Но следует понимать, что многие санскритизмы в любом случае правильно лемматизироваться не будут, поскольку окончания мужских имён (Арджуна и т.д.) слишком похожи на женские.

@AlexeySorokin
Copy link
Contributor

AlexeySorokin commented Feb 29, 2020

Как понять почему существительное агни было лемматизировано как глагол?

Потому что PyMorphy воспринимает его как повелительное наклонение глагола. Поскольку PyMorphy не предлагает разборов этого слова как существительного, в любом случае выбирается неправильный глагольный вариант. В типичных случаях такая опора на PyMorphy не вызывает проблем, по-видимому, без изменения архитектуры такую проблему не решить, а данное изменение не дело одного дня.

Вы можете написать свой компонент лемматизации, по интерфейсу аналогичный deeppavlov.models.morpho_tagger.lemmatizer::UDPymorphyLemmatizer
https://github.com/deepmipt/DeepPavlov/blob/c10b079b972493220c82a643d47d718d5358c7f4/deeppavlov/models/morpho_tagger/lemmatizer.py#L74

@lidazaikova
Copy link

lidazaikova commented Mar 3, 2020

Здравствуйте, Алексей!

Вместе с @gasyoun пытаюсь разобраться в данном вопросе. Посмотрела указанный класс лемматизатора, в связи с чем возник следующий список вопросов:

  1. Если мы сделаем свой форк UD-treebank-а, внесем туда N размеченных предложений с санскритизмами (из Махабхараты, например), то поможет ли это в решении нашей задачи?

  2. Если морфологический словарь OpenCorpora для нашей задачи дополним санскритизмами во всех возможных формах, улучшит ли это качество лемматизации? (подозреваю, что да)

  3. Если внури UD-treebank-а заменим в некоторых предложениях (создадим их копии) существительные и\или имена собственные на санскритизмы, указав правильную разметку для санскритизмов (род,число, часть речи и т.д.), то сможем ли на этой выборке обучить deepPavlov-a? Улучшит ли это результаты лемматизации?

Стоит ли вообще смотреть в сторону этих гипотез.
Заранее спасибо за ответ!

@lidazaikova
Copy link

lidazaikova commented Mar 9, 2020

Здравствуйте, Алексей! Очень хотим узнать ваше мнение по следующей задаче. Сейчас мы пытаемся улучшить качество лемматизации санскритизмов, добавив их возможные словоформы в UD-treebank (подробная гипотеза ниже). В конечном итоге мы хотим прийти к генерации на основе русского аннотированного корпуса русскоязычный корпус санскритской литературы. Будем рады любой критике, отсылкам к другим источникам, в общем, любым подсказкам. Спасибо заранее за ваше время!

Поможет ли нам улучшить качество морфологического анализа описанный ниже алгоритм. Кратко из двух шагов.
1 шаг. Добавление в словарь сгенерированных словоформ по 149 типам Зализняка из санскритизмов, которые мы возьмем из указателя (у нас есть файл на кириллице, отрывки из него будут приведены ниже) и сгенерируем для них правильные словоформы
2 шаг. Замена в оригинале аннотированного корпуса русского языка UD_Russian_SynTagRus существительных на сгенерированные словоформы-санскритизмы из пункта 1 в соответствующем числе, роде и падеже. Словоформы будут разбиты на группы по родам. Измененную копию дописать в конец трибанка. То есть обогатим первоначальный полностью аннотированный корпус русского языка..
Подробный алгоритм:

  1. Мы создаем 2 списка по родам (м и ж) (для начала 1 список - женского рода). В списке идут имена собственные женского рода.
    Выборка из списка женского рода:
абхиманьюджанани ж.р.
абхисари ж.р.
ашмаки ж.р.
ашванади ж.р.
ашвавати ж.р.
ашвини ж.р.
адришьянти ж.р.
аграни ж.р.
айкшваки ж.р.
акшаухини ж.р.
алатакши ж.р.
амаравати ж.р.
адити ж.р.
и так далее
  1. Сгенерировать на основе этого списка
1
адити NOUN,anim,femn,Name sing,nomn
адити NOUN,anim,femn,Name sing,gent
адити NOUN,anim,femn,Name sing,datv
адити NOUN,anim,femn,Name sing,accs
адити NOUN,anim,femn,Name sing,ablt
адити NOUN,anim,femn,Name sing,ablt,V-ey
адити NOUN,anim,femn,Name sing,loct
адити NOUN,anim,femn,Name plur,nomn
адити NOUN,anim,femn,Name plur,gent
адити NOUN,anim,femn,Name plur,datv
адити NOUN,anim,femn,Name plur,accs
адити NOUN,anim,femn,Name plur,ablt
адити NOUN,anim,femn,Name plur,loct
2
Ганга NOUN,anim,femn,Name sing,nomn
Ганги NOUN,anim,femn,Name sing,gent
Ганге NOUN,anim,femn,Name sing,datv
Гангу NOUN,anim,femn,Name sing,accs
Гангой NOUN,anim,femn,Name sing,ablt
Гангою NOUN,anim,femn,Name sing,ablt,V-ey
Ганге NOUN,anim,femn,Name sing,loct
Ганге NOUN,anim,femn,Name plur,nomn
Ганг NOUN,anim,femn,Name plur,gent
Гангам NOUN,anim,femn,Name plur,datv
Гангой NOUN,anim,femn,Name plur,accs
Гангами NOUN,anim,femn,Name plur,ablt
Гангах NOUN,anim,femn,Name plur,loct

и так далее
  1. Возьмем предложение из аннотированного корпуса русского языка : “Много позднее, в 20-30-е годы XIX века, остатками корнильевских стекольных мануфактур - Аремзянской стеклоделательной фабрикой управляла Мария Дмитриевна Корнильева, по мужу Менделеева, мать знаменитого химика Дмитрия Ивановича Менделеева, родная сестра Василия Дмитриевича.”
  2. В сгенерированном списке словоформ найдем одушевленное существительное женского рода пример, Ганга (то, что это должно быть одушевленное и существительное жен.р. берем из аннотации, Мария Дмитриевна Корнильева - Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing)
    Пример аннотированного предложения из трибанка:
 #sent_id = 2003A_on_myatezhnyi.xml_14
#text = Много позднее, в 20-30-е годы XIX века, остатками корнильевских стекольных мануфактур - Аремзянской стеклоделательной фабрикой управляла Мария Дмитриевна Корнильева, по мужу Менделеева, мать знаменитого химика Дмитрия Ивановича Менделеева, родная сестра Василия Дмитриевича.
1 Много много ADV _ Degree=Pos 2 advmod 2:advmod _
2 позднее поздно ADV _ Degree=Cmp 20 advmod 20:advmod SpaceAfter=No
3 , , PUNCT _ _ 8 punct 8:punct _
4 в в ADP _ _ 8 case 8:case _
5 20 20 NUM _ _ 8 nummod 8:nummod SpaceAfter=No
6 - - PUNCT _ _ 7 punct 7:punct SpaceAfter=No
7 30-е 30-й ADJ _ Animacy=Inan|Case=Acc|Degree=Pos|Number=Plur 5 nummod 5:nummod _
8 годы год NOUN _ Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur 2 obl 2:obl _
9 XIX xix NUM _ _ 10 nummod 10:nummod _
10 века век NOUN _ Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing 8 nmod 8:nmod SpaceAfter=No
11 , , PUNCT _ _ 2 punct 2:punct _
12 остатками остаток NOUN _ Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur 20 obl 20:obl _
13 корнильевских корнильевский ADJ _ Case=Gen|Degree=Pos|Number=Plur 15 amod 15:amod _
14 стекольных стекольный ADJ _ Case=Gen|Degree=Pos|Number=Plur 15 amod 15:amod _
15 мануфактур мануфактура NOUN _ Animacy=Inan|Case=Gen|Gender=Fem|Number=Plur 12 nmod 12:nmod _
16 - - PUNCT _ _ 19 punct 19:punct _
17 Аремзянской Аремзянский PROPN _ _ 19 amod 19:amod _
18 стеклоделательной стеклоделательный ADJ _ Case=Ins|Degree=Pos|Gender=Fem|Number=Sing 19 amod 19:amod _
19 фабрикой фабрика NOUN _ Animacy=Inan|Case=Ins|Gender=Fem|Number=Sing 12 appos 12:appos _
20 управляла управлять VERB _ Aspect=Imp|Gender=Fem|Mood=Ind|Number=Sing|Tense=Past|VerbForm=Fin|Voice=Act 0 root 0:root _
21 Мария Мария PROPN _ Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing 20 nsubj 20:nsubj _
22 Дмитриевна Дмитриевна PROPN _ Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing 21 flat:name 21:flat:name _
23 Корнильева Корнильева PROPN _ Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing 21 flat:name 21:flat:name SpaceAfter=No
24 , , PUNCT _ _ 26 punct 26:punct _
25 по по ADP _ _ 26 case 26:case _
26 мужу муж NOUN _ Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing 21 nmod 21:nmod _
27 Менделеева Менделеева PROPN _ Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing 21 flat:name 21:flat:name SpaceAfter=No
28 , , PUNCT _ _ 29 punct 29:punct _
29 мать мать NOUN _ Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing 21 appos 21:appos _
30 знаменитого знаменитый ADJ _ Case=Gen|Degree=Pos|Gender=Masc|Number=Sing 31 amod 31:amod _
31 химика химик NOUN _ Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing 29 nmod 29:nmod _
32 Дмитрия Дмитрий PROPN _ Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing 31 appos 31:appos _
33 Ивановича Иванович PROPN _ Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing 32 flat:name 32:flat:name _
34 Менделеева Менделеев PROPN _ Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing 32 flat:name 32:flat:name SpaceAfter=No
35 , , PUNCT _ _ 37 punct 37:punct _
36 родная родной ADJ _ Case=Nom|Degree=Pos|Gender=Fem|Number=Sing 37 amod 37:amod _
37 сестра сестра NOUN _ Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing 29 conj 29:conj _
38 Василия Василий PROPN _ Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing 37 nmod 37:nmod _
39 Дмитриевича Дмитриевич PROPN _ Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing 38 flat:name 38:flat:name SpaceAfter=No
40 . . PUNCT _ _ 20 punct 20:punct _
  1. Заменим Мария Дмитриевна Корнильева на поставленное в нужную форму Ганга (имя собственное (одушевлённое), женский род, ед. число, именительный падеж - NOUN,anim,femn,Name sing,nomn)
  2. Для каждого слова из сгенерированного словаря составить N таких предложений. А именно, найти N (количество уточняется, UD_Russian-SynTagRus/master/ru_syntagrus-ud-train.conllu тренировочной выборке 48 814 предложений) предложений, в которых есть Animacy=Anim|Gender=Fem, создать копию этого аннотированного предложения и в нем заменить исходное имя на санскритское кириллическое в нужной форме. Дописать в начальный тренировочный SynTagRus сгенерированные предложения с санскритизмами. Переобучить модель.
  3. Выяснить, как подключить список несклоняемых слов в treebank, кроме как сгенерировав по предложению на каждый падеж, где искомое слово не будет меняться (всего 6 предложений).

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

3 participants