2017-02-19 12 views
0

Допустим, у меня есть строка и вы хотите отметить некоторые объекты, такие как Лица и местоположения.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 было заменить только новые слова (с более высокими позициями символов) ... Я думаю, что ошибка может быть в том, что я нахожусь в зацикливании в doc.ents, поэтому я получаю старые позиции своей строки, и строка растет для каждого цикла с новыми [] и {}. Но похоже, что в spaCy должен быть более простой способ справиться с этим.

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} 
Смежные вопросы