Посоветуйте Лемматизатор, хорошо разбирающий фамилии (Python)
Пытаюсь разобрать этот список на леммы:
['Динамика', 'возобновления', 'роста', 'случаев', 'коронавируса', 'COVID-19', 'в',
'мире', 'является', 'поводом', 'для', 'серьезной', 'обеспокоенности', '–', 'признал',
'преcс-секретарь', 'президента', 'России', 'Дмитрий', 'Песков', '.']
Это:
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
for word in for_lemma:
print(word, [p.normal_form for p in morph.parse(word)])
Дает:
Песков ['песок']
Это:
import spacy
sample_sentences = "Динамика возобновления роста случаев коронавируса COVID-19 в мире является поводом для серьезной обеспокоенности – признал преcс-секретарь президента России Дмитрий Песков."
if __name__ == '__main__':
nlp = spacy.load('ru2', disable=['tagger', 'parser', 'NER'])
nlp.add_pipe(nlp.create_pipe('sentencizer'), first=True)
doc = nlp(sample_sentences)
for s in doc.sents:
print(list(['lemma "{}" from text "{}"'.format(t.lemma_, t.text) for t in s]))
Тоже дает "песок".
DeepPavlov пробовал разобраться, но что-то очень сложный. Если DeepPavlov, могли бы привести пример простого кода.
Спасибо.
Ответы (1 шт):
Есть же библиотека Наташа. Я вам пример набросал по документации, надеюсь дальше разберётесь, как приспособить под ваши нужды:
#pip install natasha
from natasha import (
Segmenter,
MorphVocab,
NewsEmbedding,
NewsMorphTagger,
NewsSyntaxParser,
NewsNERTagger,
PER,
NamesExtractor,
DatesExtractor,
MoneyExtractor,
AddrExtractor,
Doc
)
text = "Динамика возобновления роста случаев коронавируса COVID-19 в мире является поводом для серьезной обеспокоенности – признал преcс-секретарь президента России Дмитрий Песков."
segmenter = Segmenter()
morph_vocab = MorphVocab()
emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
ner_tagger = NewsNERTagger(emb)
names_extractor = NamesExtractor(morph_vocab)
dates_extractor = DatesExtractor(morph_vocab)
money_extractor = MoneyExtractor(morph_vocab)
addr_extractor = AddrExtractor(morph_vocab)
doc = Doc(text)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)
doc.parse_syntax(syntax_parser)
doc.tag_ner(ner_tagger)
for token in doc.tokens:
token.lemmatize(morph_vocab)
display({_.text: _.lemma for _ in doc.tokens})
for span in doc.spans:
span.normalize(morph_vocab)
display({_.text: _.normal for _ in doc.spans})
Вывод:
{'.': '.',
'COVID-19': 'covid-19',
'c': 'c',
'Динамика': 'динамика',
'Дмитрий': 'дмитрий',
'Песков': 'песков',
'России': 'россия',
'в': 'в',
'возобновления': 'возобновление',
'для': 'для',
'коронавируса': 'коронавирус',
'мире': 'мир',
'обеспокоенности': 'обеспокоенность',
'поводом': 'повод',
'пре': 'пре',
'президента': 'президент',
'признал': 'признать',
'роста': 'рост',
'с-секретарь': 'с-секретарь',
'серьезной': 'серьезный',
'случаев': 'случай',
'является': 'являться',
'–': '–'}
{'Дмитрий Песков': 'Дмитрий Песков', 'России': 'Россия'}
Вам обязательно надо разбирать предложения целиком, никакая библиотека по одному слову без контекста не сможет понять, что перед ней - фамилия человека или слово в каком-то падеже. Только предложения, только контекст. Наташа разбирает именно предложения.
Хотя тут тоже какая-то лажа с словосочетанием преcс-секретарь, но в целом то выглядит неплохо.