Как улучшить леммы от Spacy

Хотя «PM» может означать «pm (время)», это также может означать «премьер-министр».

Я хочу запечатлеть последнее. Я хочу, чтобы лемма «ПМ» вернула «Премьер-министра». Как я могу это сделать с помощью spacy?

Пример, возвращающий неожиданную лемму:

>>> import spacy
>>> #nlp = spacy.load('en')
>>> nlp = spacy.load('en_core_web_lg')
>>> doc = nlp(u'PM means prime minister')
>>> for word in doc:
...     print(word.text, word.lemma_)
... 
PM pm
means mean
prime prime
minister minister

Согласно документу https://spacy.io/api/annotation, spacy использует WordNet для лемм;

Лемма - это невыраженная форма слова. Данные по английской лемматизации взяты из WordNet ..

Когда я попытался ввести «pm» в Wordnet, он показывает" Премьер-министр "как одну из лемм.

Что мне здесь не хватает?


person pauljeba    schedule 04.12.2017    source источник
comment
Не могли бы вы просмотреть существующие ответы и утвердить их, если они отвечают на ваш вопрос, или уточнить, что вам нужно? Спасибо.   -  person pmbaumgartner    schedule 06.01.2018


Ответы (2)


Думаю, это поможет ответить на ваш вопрос, прояснив некоторые общие задачи НЛП.

Лемматизация - это процесс поиска канонического слова с учетом различных его склонений. Например, «бег», «бег», «бег» и «бег» - это формы одной и той же лексемы: run. Если бы вы лемматизировали run, run и run, вывод был бы run. В предложении-примере обратите внимание, как оно превращает означает в означает.

Учитывая это, не похоже, что задача, которую вы хотите выполнить, - это лемматизация. Это может помочь укрепить эту идею с помощью глупого контрпримера: каковы различные варианты гипотетической леммы «pm»: pming, pmed, pms? Ни одно из этих слов не соответствует действительности.

Похоже, ваша задача может быть ближе к распознаванию именованных сущностей (NER), что вы также можете сделать в spaCy. Чтобы перебрать обнаруженные объекты в проанализированном документе, вы можете использовать атрибут .ents следующим образом:

>>> for ent in doc.ents:
...     print(ent, ent.label_)

В приведенном вами предложении spacy (v. 2.0.5) не обнаруживает никаких сущностей. Если вы замените «PM» на «P.M.» он обнаружит это как объект, но как GPE.

Лучшее, что можно сделать, зависит от вашей задачи, но если вам нужна желаемая классификация сущности "PM", я бы посмотрел на установка аннотаций сущностей. Если вы хотите вытащить каждое упоминание «PM» из большого корпуса документов, используйте сопоставитель в конвейере.

person pmbaumgartner    schedule 26.12.2017

Когда я запускаю леммы премьер-министра на nltk.wordnet (который тоже его использует), я получаю:

>>>[str(lemma.name()) for lemma in wn.synset('prime_minister.n.01').lemmas()] ['Prime_Minister', 'PM', 'premier']

Он сохраняет аббревиатуры, так что, может быть, вы захотите проверить word.lemma (), который даст вам другой идентификатор в зависимости от контекста?

person Veltzer Doron    schedule 04.12.2017