文字列があり、人物や場所などのエンティティをマークしたいとしましょう。
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 でこれを処理する簡単な方法があるに違いないと感じています。