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


В то время как "ПМ" может означать "ПМ(время)", оно также может означать "премьер-министр".

Я хочу захватить последнее. Я хочу, чтобы Лемма "премьер-министр" вернулась к "премьер-министру". Как я могу сделать это с помощью 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

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

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

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

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

2 3

2 ответа:

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

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

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

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

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

В приведенном вами предложении spacy (V. 2.0.5) не обнаруживает никаких сущностей. Если вы замените "PM "на" PM", он обнаружит это как сущность, но как GPE.

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

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

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

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