python - 从 spacy 对象中删除命名实体

标签 python nlp spacy named-entity-recognition

我正在尝试使用 Spacy 从文档中删除命名实体。我没有发现任何识别命名实体的麻烦。使用此代码:

ne = [(ent.text, ent.label_) for ent in doc.ents]
print(ne)
persons = [ent.text for ent in doc.ents if ent.label_ == 'PERSON']
print(persons)

输出:

'Timothy D. Cook',
 'Peter',
 'Peter',
 'Benjamin A. Reitzes',
 'Timothy D. Cook',
 'Steve Milunovich',
 'Steven Mark Milunovich',
 'Peter',
 'Luca Maestri'

但后来我尝试使用这个 block 从文档中实际删除它们:

text_no_namedentities = []

ents = [e.text for e in doc.ents]
for item in doc:
    if item.text in ents:
        pass
    else:
        text_no_namedentities.append(item.text)
print(" ".join(text_no_namedentities))

它不起作用,因为 NE 是 n-gram。如果我只是检查一小块 spacy 对象的内容,它如下所示:

for item in doc:
    print(item.text)

iPad
has
a
78
%
Steve
Milunovich
share
of
the
U.S.
commercial
tablet
market

因此 spacy 对象被标记化了。因此,我无法使用上面的代码删除 NE。关于如何从对象中删除所有命名实体的任何想法?

最佳答案

你要检查的条件是

if item.ent_type:

如果 item(“ token ”)是命名实体的一部分,这将评估为 Truetoken.ent_type 将是实体实际类型的哈希 ID,您可以使用 token.ent_type_(注意 _)进行查询。

这将是我要使用的代码:

    text_no_namedentities = ""
    for token in doc:
        if not token.ent_type:
            text_no_namedentities += token.text
            if token.whitespace_:
                text_no_namedentities += " "

请注意,您可以使用 token.whitespace_ 来确定原始句子中的原始标记是否后跟空格。

有关详细信息,请参阅有关Token 的文档 here .

仅供引用 - 将来,包含代码的最小工作片段会更方便,而不是仅仅包含代码的一部分。

关于python - 从 spacy 对象中删除命名实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365350/

相关文章:

python - "thinc.extra.MaxViolation has wrong size"的 Spacy-nightly (spacy 2.0) 问题

python - 只有 "Whitespace"规则的 Spacy 分词器

python - 如何解决 RASA NLU 中未对齐的实体注释错误

Python RoboBrowser 自动搜索功能

数字到数字不变量的 Python 代码

python - 如果转置索引具有重复值,则创建新行

nlp - 使用SpaCy时下载 'models'有什么意义?

python - 如何在每个测试用例中都有一个记录器?

sql-server - 在位置索引中查找二元组

python - 如何使用无监督方法将句子分类到预定义的主题桶之一