如何使用SpaCy从类似“ F.B.I.特工彼得·斯特罗克(Peter Strzok)的文章中批评特朗普的人被解雇”中获得正确的NER?

时间:2019-07-03 10:26:26

标签: nlp nltk spacy

我如何使用SpaCy从“ F.B.I.特工彼得·斯特佐克(Peter Strzok)被解雇-纽约时报专区-纽约时报专区SEARCHS跳至content,跳至内容。 在这里,“被批评的特朗普”是人,而不是“特朗普”是人。

如何对上述字符串中的诸如“ Criticized”或“ Texts”之类的文本进行预处理和小写形式,以克服上述问题或任何其他技巧。

import spacy
from spacy import displacy
from collections import Counter
import en_core_web_sm
nlp = en_core_web_sm.load()
from pprint import pprint

sent = ("F.B.I. Agent Peter Strzok, Who Criticized Trump in Texts, Is Fired - The New York Times SectionsSEARCHSkip to contentSkip to site")
doc = nlp(sent)
pprint([(X, X.ent_iob_, X.ent_type_) for X in doc])

以上代码的结果: “被批评的特朗普”为“ PERSON”,“文本”为“ GPE”

预期结果应为:- “特朗普”为“ PERSON”,而不是“ Criticized Trump”为“ PERSON”,“文本”为“”,而不是“文本”为“ GPE”

2 个答案:

答案 0 :(得分:0)

您可以添加更多命名实体示例来调整NER模型。在这里,您具有准备火车数据https://spacy.io/usage/training所需的所有信息。您可以使用prodigy(来自spaCy创建者的注释工具,https://prodi.gy)在数据中标记命名实体。

答案 1 :(得分:0)

实际上,您可以使用POS标记进行预处理,以便将小写单词(例如“ Criticized”或“ Texts”)更改为非专有名词。 正确的大小写(小写或大写)将有助于NER标记器。

sent = "F.B.I. Agent Peter Strzok, Who Criticized Trump in Texts, Is Fired - The New York Times SectionsSEARCHSkip to contentSkip to site"
doc = nlp(sent)

words = []
spaces = []
for a in doc:

    if a.pos_ != 'PROPN':
        words.append( a.text.lower() )
    else:
        words.append(a.text)

    spaces.append(a.whitespace_)

spaces = [len(sp) for sp in spaces]    
docNew = Doc(nlp.vocab, words=words, spaces=spaces)
print(docNew)
# F.B.I. Agent Peter Strzok, who criticized Trump in texts, is fired - the New York Times SectionsSEARCHSkip to contentskip to site