如何从 Spacy 获得更好的引理

How to get better lemmas from Spacy

虽然 "PM" 可以表示 "pm(time)",但也可以表示 "Prime Minister"。

我想捕捉后者。我想要 "PM" 到 return "Prime Minister" 的引理。如何使用 spacy?

执行此操作

return 意外引理示例:

>>> 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 作为引理;

A lemma is the uninflected form of a word. The English lemmatization data is taken from WordNet..

当我尝试在 Wordnet 中输入 "pm" 时,它显示 "Prime Minister" 作为引理之一。

我在这里错过了什么?

当我 运行 总理在 nltk.wordnet 上的引理(也使用它)时,我得到:

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

它保持首字母缩略词相同,所以也许您想检查 word.lemma() 哪个会根据上下文为您提供不同的 ID?

我认为澄清一些常见的 NLP 任务有助于回答您的问题。

词形还原 是在给定单词不同变形的情况下找到规范单词的过程。例如,运行、运行s、运行 和 运行ning 是同一个词素的形式:运行。如果你要对 运行运行s运行 输出将是 运行。在您的例句中,请注意它如何将 means 词形还原为 mean.

鉴于此,您要执行的任务听起来不像是词形还原。用一个愚蠢的反例可能有助于巩固这个想法:假设引理 "pm" 的不同变形是什么:pming、pmed、pms? None 其中是实际单词。

听起来你的任务可能更接近于命名实体识别 (NER),你也可以在 spaCy 中完成。要遍历已解析文档中检测到的实体,可以使用 .ents 属性,如下所示:

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

根据你给出的句子,spacy (v. 2.0.5) 没有检测到任何实体。如果将 "PM" 替换为 "P.M.",它会将其检测为实体,但作为 GPE。

最好的做法取决于您的任务,但如果您想要对 "PM" 实体进行所需的分类,我会查看 setting entity annotations. If you want to pull out every mention of "PM" from a big corpus of documents, use the matcher in a pipeline