2016-10-31 2 views
0

Ich versuche, Stocksymbole zu den Strings als ORG-Entitäten erkannt hinzuzufügen. Für jedes Symbol, das tue ich:Wie füge ich neue Entity (ORG) Instanzen in spacy nlp

nlp.matcher.add(symbol, u'ORG', {}, [[{u'orth': symbol}]]) 

ich sehen kann, dass dieses Symbol auf die Muster hinzugefügt wird:

print "Patterns:", nlp.matcher._patterns 

aber alle Symbole, die nicht erkannt wird nicht erkannt wurden, werden nach der Zugabe vor der Zugabe. Offensichtlich existieren diese Token bereits im Vokabular (deshalb ändert sich die Vokabellänge nicht).

Was soll ich anders machen? Was vermisse ich? Hier

Dank

ist mein Beispielcode:

"kurzen Ausschnitt Börsenticker-Symbole als ORG Einheiten zu üben Hinzufügen"

from spacy.en import English 
import spacy.en 
from spacy.attrs import ORTH, TAG, LOWER, IS_ALPHA, FLAG63 
import os 
import csv 
import sys 

nlp = English() #Load everything for the English model 

print "Before nlp vocab length", len(nlp.matcher.vocab) 

symbol_list = [u"CHK", u"JONE", u"NE", u"DO", u"ESV"] 

txt = u"""drive double-digit rallies in Chesapeake Energy (NYSE: CHK), (NYSE: NE), (NYSE: DO), (NYSE: ESV), (NYSE: JONE)"""# u"""Drive double-digit rallies in Chesapeake Energy (NYSE: CHK), Noble Corporation (NYSE:NE), Diamond Offshore (NYSE:DO), Ensco (NYSE:ESV), and Jones Energy (NYSE: JONE)""" 
before = nlp(txt) 
for tok in before: #Before adding entities 
    print tok, tok.orth, tok.tag_, tok.ent_type_ 

for symbol in symbol_list: 
    print "adding symbol:", symbol 
    print "vocab length:", len(nlp.matcher.vocab) 
    print "pattern length:", nlp.matcher.n_patterns 
    nlp.matcher.add(symbol, u'ORG', {}, [[{u'orth': symbol}]]) 


print "Patterns:", nlp.matcher._patterns 
print "Entities:", nlp.matcher._entities 
for ent in nlp.matcher._entities: 
    print ent.label 

tokens = nlp(txt) 

print "\n\nAfter:" 
print "After nlp vocab length", len(nlp.matcher.vocab) 

for tok in tokens: 
    print tok, tok.orth, tok.tag_, tok.ent_type_ 
+0

Wenn Sie> 1,0 aktiv sind, sollten Sie eine Callback-Funktion für jeden Matcher verwenden und Token manuell zusammenführen. –

+0

Können Sie ein paar weitere Details angeben? – user1430965

+0

Vielen Dank für Ihren Vorschlag, aber könnten Sie ein paar mehr Details zur Verfügung stellen? Wo füge ich den Rückruf hinzu? Was macht der Rückruf? Wie füge ich Token manuell zusammen? Sorry, ich fange gerade an, Spacy zu benutzen. Danke, Herb – user1430965

Antwort

1

Hier Ausführungsbeispiel auf der Grundlage der docs:

import spacy 

nlp = spacy.load('en') 

def merge_phrases(matcher, doc, i, matches): 
    ''' 
    Merge a phrase. We have to be careful here because we'll change the token indices. 
    To avoid problems, merge all the phrases once we're called on the last match. 
    ''' 
    if i != len(matches)-1: 
     return None 
    spans = [(ent_id, label, doc[start : end]) for ent_id, label, start, end in matches] 
    for ent_id, label, span in spans: 
     span.merge('NNP' if label else span.root.tag_, span.text, nlp.vocab.strings[label]) 

matcher = spacy.matcher.Matcher(nlp.vocab) 
matcher.add(entity_key='stock-nyse', label='STOCK', attrs={}, specs=[[{spacy.attrs.ORTH: 'NYSE'}]], on_match=merge_phrases) 
matcher.add(entity_key='stock-esv', label='STOCK', attrs={}, specs=[[{spacy.attrs.ORTH: 'ESV'}]], on_match=merge_phrases) 
doc = nlp(u"""drive double-digit rallies in Chesapeake Energy (NYSE: CHK), (NYSE: NE), (NYSE: DO), (NYSE: ESV), (NYSE: JONE)""") 
matcher(doc) 
print(['%s|%s' % (t.orth_, t.ent_type_) for t in doc]) 

->

['drive|', 'double|', '-|', 'digit|', 'rallies|', 'in|', 'Chesapeake|ORG', 'Energy|ORG', '(|', 'NYSE|STOCK', ':|', 'CHK|', ')|', ',|', '(|', 'NYSE|STOCK', ':|', 'NE|GPE', ')|', ',|', '(|', 'NYSE|STOCK', ':|', 'DO|', ')|', ',|', '(|', 'NYSE|STOCK', ':|', 'ESV|STOCK', ')|', ',|', '(|', 'NYSE|STOCK', ':|', 'JONE|ORG', ')|'] 

NYSE und ESV jetzt mit STOCK Entitätstyp gekennzeichnet. Grundsätzlich sollten Sie bei jeder Übereinstimmung manuell Token zusammenführen und/oder gewünschte Entitätstypen zuweisen. Es gibt auch die Funktion acceptor, mit der Sie die Übereinstimmungen filtern oder ablehnen können, während sie abgeglichen werden.

+0

Danke. Ich reise, aber ich werde mir das ansehen, sobald ich zurück bin. Schätze deine Hilfe. – user1430965

Verwandte Themen