>>> import spacy
>>> en = spacy.load('en')
>>> text = "Joe is walking down the street. He is wondering if Dan Jordan will be home soon."
>>> doc = en(text)
>>> people = [e for e in doc.ents if e.label_ == 'PERSON']
>>> print(people)
[Joe, Dan Jordan]
>>> print(doc.ents)
(Joe, Dan Jordan)
我希望能够用标签(在这种情况下为“ PERSON”)删除或替换所有项,因此以某种方式获得“ x正在走在街上。他想知道x不久是否会回家”。
什么是最好的方法?我想您必须以某种方式重新标记文档并删除/替换“ PERSON”字符串,但是我不确定在遍历文档时如何检查令牌是否为ent,以及ent是否具有“ PERSON”标签...
答案 0 :(得分:1)
您可以指定令牌扩展名,该令牌扩展名与其他可变字段不同,并且您将在其中存储所需的信息。在这种情况下,您可以复制每个令牌的文本,然后通过更改此名称来匿名化实体。
import spacy
spacy.tokens.token.Token.set_extension('anonymized', default='')
text = "Joe is walking down the street. He is wondering if Dan Jordan will be home soon."
doc = en(text)
people = [e for e in doc.ents if e.label_ == 'PERSON']
for tok in doc:
tok._.anonymized = tok.text
for ent in people:
ent[0]._.anonymized = "X"
for i in range(1, len(ent)):
ent[i]._.anonymized = ''
"".join([tok._.anonymized + (" " if tok.whitespace_ else "")
for tok in doc if tok._.anonymized])
您将得到:
'X is walking down the street. He is wondering if X will be home soon.'
您可能需要更仔细地进行去代币化。