【问题标题】:Spacy: automatically find lemma patterns in textSpacy:自动在文本中查找引理模式
【发布时间】:2020-06-28 18:11:23
【问题描述】:

我正在学习如何使用 Spacy。 基于下面的示例,我的目标是获得更多通常与 iPhone 相关的词条模式(我有一个可以找到此类模式的文本数据库)。 例如“iPhone 是最好的智能手机”、“iPhone 太贵了”等。 我需要手动找到这些模式吗?或者是否有可能使其自动化(至少获得建议或类似的东西)。

我的最终目标是构建一个工具,将一些文本作为输入,并根据这些模式识别 iPhone、Samsung abc 等......

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)

pattern1 = [{"LEMMA": "buy"}, {"NOUN": "iPhone"}]
matcher.add("buy_iphone", None, pattern1)

doc = nlp("I'm gonna buy an iPhone")

print(doc)

【问题讨论】:

    标签: nlp pattern-matching spacy


    【解决方案1】:

    我不确定 Matcher 是不是这里的正确选择,因为它匹配精确的短语。但是在您的示例中,还有一篇附加文章。相反,您可以这样做来获得动词-音素对:

    import spacy
    nlp = spacy.load("en_core_web_sm")
    
    #extracts verb-phone pairs, given verbs and phones
    def extract_verbs(doc, verb_lemmas, phones):
        results = []
        verbs = [verb for verb in doc if verb.lemma_ in verb_lemmas]
        for verb in verbs:
            for child in verb.children:
                if child.lower_ in phones:
                    results.append((verb.lemma_,child.text))
        return results
    
    #extracts verb-phone pairs given phones
    def extract_phones(doc, phones):
        results = []
        phones = [phone for phone in doc if phone.lower_ in phones]
        for phone in phones:
            results.append((phone.head.lemma_,phone.text))
        return results
    
    doc = nlp("I'm gonna buy an iPhone. Samsung sucks. I always wanted an IPhone, but I just got a Samsung.")
    verb_lemmas = ["buy"]
    phones = ["samsung", "iphone"]
    print(extract_verbs(doc, verb_lemmas, phones)) #returns [('buy', 'iPhone')]
    print(extract_phones(doc,  phones)) #returns [('buy', 'iPhone'), ('suck', 'Samsung'), ('want', 'IPhone'), ('get', 'Samsung')]
    

    【讨论】:

      【解决方案2】:

      我认为添加entity ruler 是一个更简单的解决方案。

      在使用实体标尺之前,spacy将samsung归类为ORG,不检测iphone。

      txt = "iPhone has a sleek design. Samsung is user friendly."
      nlp = spacy.load("en_core_web_sm")
      doc = nlp(txt)
      for ent in doc.ents:
          print(ent.text, ent.label_) # returns Samsung ORG
      

      所以你需要添加一个实体标尺,通过向Doc.ents添加跨度来提高准确性

      patterns = [
          {"label":"PHONE", "pattern": "iPhone"},
          {"label":"PHONE", "pattern": "Samsung"}
      ]
      
      nlp = spacy.load("en_core_web_sm")
      ruler = nlp.add_pipe("entity_ruler", before="ner")
      ruler.add_patterns(patterns)
      doc = nlp("iPhone has a sleek design. Samsung is user friendly.")
      for ent in doc.ents:
          print(ent.text, ent.label_) # iPhone PHONE Samsung PHONE
      

      现在您可以将更多手机添加到您的图案中。

      有关使用 spacy 的实体标尺的更多信息,请查看Using SpaCy’s EntityRuler

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 2021-05-07
        • 2016-10-07
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多