文字列があり、人物や場所などのエンティティをマークしたいとしましょう。
string = 'My name is John Doe, and I live in USA'
string_tagged = 'My name is [John Doe], and I live in {USA}'
人物を [ ] でマークし、場所を { } でマークしたいと思います。
私のコード:
import spacy    
nlp = spacy.load('en')
doc = nlp(string)
sentence = doc.text
for ent in doc.ents:
    if ent.label_ == 'PERSON':
        sentence = sentence[:ent.start_char] + sentence[ent.start_char:].replace(ent.text, '[' + ent.text + ']', 1)
    elif ent.label_ == 'GPE':
        sentence = sentence[:ent.start_char] + sentence[ent.start_char:].replace(ent.text, '{' + ent.text + '}', 1)
    print(sentence[:ent.start_char] + sentence[ent.start_char:])
...だから、例の文字列ではこれはうまくいきます。しかし、より複雑な文では、一部のエンティティを二重引用符で囲みます。文の場合:
string_bug = 'Canada, Canada, Canada, Canada, Canada, Canada'
戻り値>> {Canada}, {Canada}, {Canada}, {Canada},  {{Canada}}, Canada
文の文字列を 2 つに分割した理由は、新しい単語 (より高い文字位置) を置き換えるためだけでした。バグは をループしていることにあると思うdoc.entsので、文字列の古い位置を取得し、新しい [ ] と {} を使用してループごとに文字列が大きくなります。しかし、spaCy でこれを処理する簡単な方法があるに違いないと感じています。