Spacy:自动查找文本中的引理模式

Spacy: automatically find lemma patterns in text

我正在学习如何使用 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)

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

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')]

我认为添加 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