从文字中删除“ PERSON”条目?

时间:2019-05-06 23:13:46

标签: nlp spacy

>>> 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”标签...

1 个答案:

答案 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.'

您可能需要更仔细地进行去代币化。