2017-02-19 5 views
0

文字列があり、PersonやLocationsなどのエンティティにマークを付けたいとします。spaCy nlp - 文字列内のタグエンティティ

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:]) 

ですから、例えば文字列で、これは正常に動作します。しかし、より複雑な文章では、私はいくつかのエンティティの周りに二重のqoutesを得る。文のために。

string_bug = 'Canada, Canada, Canada, Canada, Canada, Canada' 

戻り>> {Canada}, {Canada}, {Canada}, {Canada}, {{Canada}}, Canada

私は(高い文字位置で)新しい単語を置き換えることだった2文の文字列を分割さ理由は...私はバグは、私がループにいることになるかもしれないと思います私は文字列の古い位置を取得し、文字列は新しい[]と{}を使ってループごとに成長しています。しかし、スパイでこれを扱う簡単な方法がなければならないように感じます。

EDIT:逆転(doc.ents)で解決

答えて

0

は、ここで私はあなたのコードで動作する助け若干の修正です。

string = 'My name is John Doe, and I live in USA' 

import re 
import spacy 
nlp = spacy.load('en') 
doc = nlp(string) 
sentence = doc.text 
for ent in doc.ents: 
    if ent.label_ == 'PERSON': 
     sentence = re.sub(ent.text, '[' + ent.text + ']', sentence) 
    elif ent.label_ == 'GPE': 
     sentence = re.sub(ent.text, '{' + ent.text + '}', sentence) 
print sentence 

収量:

My name is [John Doe], and I live in {USA}