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