【问题标题】:How to get better lemmas from Spacy如何从 Spacy 获得更好的引理
【发布时间】:2017-12-04 12:31:06
【问题描述】:

虽然“PM”可以表示“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

根据 doc https://spacy.io/api/annotation,spacy 使用 WordNet 作为引理;

引理是单词的未变形形式。英文词形还原数据取自 WordNet..

当我尝试在Wordnet 中输入“pm”时,它显示“总理”作为引理之一。

我在这里错过了什么?

【问题讨论】:

  • 您能否查看现有答案并在他们回答您的问题时批准它们或进一步澄清您的需求?谢谢。

标签: python nlp wordnet spacy lemmatization


【解决方案1】:

我认为通过阐明一些常见的 NLP 任务有助于回答您的问题。

Lemmatization 是在给定单词的不同变形的情况下找到规范单词的过程。例如,run、runs、ran 和 running 是同一个词位的形式:run。如果您要对 runrunsran 进行词形还原,则输出将是 run。在您的例句中,请注意它如何将 means 词形还原为 mean

鉴于此,听起来您想要执行的任务并不是词形还原。用一个愚蠢的反例可能有助于巩固这个想法:假设的引理“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”实体分类,我会查看setting entity annotations。如果您想从大量文档中提取出所有提及“PM”的内容,use the matcher in a pipeline

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多