如何从Spacy获得更好的词形归并结果

3

虽然“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来获取词元(lemma);
“词元”是单词的未变格。英语词元数据来自WordNet。
当我在Wordnet中输入“pm”时,它显示“总理”(Prime Minister)作为其中一个词元。
我错过了什么?

请您是否可以审核现有的答案,如果它们回答了您的问题,请批准它们,否则请进一步澄清您需要什么?谢谢。 - pmbaumgartner
2个回答

3

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

Lemmatization 是查找给定单词不同屈折形式的规范词的过程。例如,run、runs、ran 和 running 都是同一个词源的形式:run。如果您对 run、runs 和 ran 进行词形还原,输出将为 run。在您的示例句子中,请注意它将 means 词形还原为 mean。

鉴于此,您想要执行的任务似乎不是词形还原。通过一个愚蠢的反例来巩固这个想法可能会有所帮助:一个假设的词源“pm”的不同词形是什么:pming、pmed、pms?这些都不是真实的单词。

听起来你的任务可能更接近 Named Entity Recognition(NER),您也可以使用 spaCy 进行该任务。要迭代解析文档中检测到的实体,您可以使用 .ents 属性,如下所示:

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

根据您提供的句子,spacy(v. 2.0.5)无法检测到任何实体。如果您将“PM”替换为“P.M.”,它将被检测为一个实体,但是作为GPE。
最好的做法取决于您的任务,但是如果您想要对"PM"实体进行分类,我建议查看设置实体注释。如果您想从大量文档中提取出每个“PM”的提及,可以使用管道中的匹配器。

0
当我在nltk.wordnet上运行prime minister的引理时(它也使用它),我得到以下结果: >>>[str(lemma.name()) for lemma in wn.synset('prime_minister.n.01').lemmas()] ['Prime_Minister', 'PM', 'premier']
它保留了缩写,因此您可能想要检查word.lemma(),根据上下文,它会给您不同的ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接