虽然“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 ..
当我尝试在Wordnet输入“pm”时,它显示“首相”是其中一个引理。
我在这里缺少什么?
答案 0 :(得分:3)
我认为通过澄清一些常见的NLP任务来帮助回答你的问题。
词形还原是在给定词的不同变形的情况下找到规范词的过程。例如,运行,运行,运行和运行是同一个lexeme:run的形式。如果您将运行,运行,运行,则输出将运行。在您的示例句子中,请注意它是如何将意为意味着意味着。
鉴于此,它听起来并不像你想要执行的任务是词形还原。用一个愚蠢的反例来巩固这个想法可能有所帮助:假设的引理“pm”的不同变形是什么:pming,pmed,pms?这些都不是实际的话。
听起来您的任务可能更接近命名实体识别(NER),您也可以在spaCy中执行此操作。要遍历已解析文档中检测到的实体,可以使用.ents
属性,如下所示:
>>> for ent in doc.ents:
... print(ent, ent.label_)
根据你给出的句子,spacy(v.2.0.5)没有检测到任何实体。如果用“P.M.”替换“PM”它将检测到它作为一个实体,但作为一个GPE。
最好的办法取决于你的任务,但如果你想要你想要的“PM”实体分类,我会看setting entity annotations。如果你想从一大堆文件中提取每一个“PM”,use the matcher in a pipeline。
答案 1 :(得分:0)
当我在nltk.wordnet(也使用它)上运行总理的引理时,我得到:
>>>[str(lemma.name()) for lemma in wn.synset('prime_minister.n.01').lemmas()] ['Prime_Minister', 'PM', 'premier']
它保持首字母缩略词相同,所以也许你想检查word.lemma(),它会根据上下文给你一个不同的ID?