2017-02-19 2 views
0

Disons que j'ai une chaîne et que je veux marquer certaines entités comme les personnes et les emplacements.spaCy nlp - tag entités dans la chaîne

string = 'My name is John Doe, and I live in USA' 
string_tagged = 'My name is [John Doe], and I live in {USA}' 

Je souhaite marquer des personnes avec [] et des emplacements avec {}.

Mon code:

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

Donc, avec l'exemple chaîne cela fonctionne très bien. Mais avec des phrases plus compliquées, je reçois des doubles qoutes autour de certaines entités. Pour la phrase.

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

retours >> {Canada}, {Canada}, {Canada}, {Canada}, {{Canada}}, Canada

La raison pour laquelle je Splitted la chaîne de phrase 2 était de ne remplacer que de nouveaux mots (avec des positions de caractère plus) ... Je pense que le bug pourrait être dans ce que je suis en looping dans doc.ents, donc j'obtiens les anciennes positions de ma chaîne, et la chaîne augmente pour chaque boucle avec new [] et {}. Mais il se sent comme il doit y avoir un moyen plus facile de traiter cela dans spa.

EDIT: Résolu avec inversion (doc.ents)

Répondre

0

Voici une légère modification qui m'a aidé à travailler avec votre code.

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 

Rendement:

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