2016-04-25 12 views
2

Ich versuche, den Span (Startindex, Endindex) einer Nominalphrase in einem gegebenen Satz zu finden. Im Folgenden ist der Code zum Extrahieren von NominalphrasenAbsolute Position der Blätter in NLTK Baum

sent=nltk.word_tokenize(a) 
sent_pos=nltk.pos_tag(sent) 
grammar = r""" 
    NBAR: 
     {<NN.*|JJ>*<NN.*>} # Nouns and Adjectives, terminated with Nouns 

    NP: 
     {<NBAR>} 
     {<NBAR><IN><NBAR>} # Above, connected with in/of/etc... 
    VP: 
     {<VBD><PP>?} 
     {<VBZ><PP>?} 
     {<VB><PP>?} 
     {<VBN><PP>?} 
     {<VBG><PP>?} 
     {<VBP><PP>?} 
""" 

cp = nltk.RegexpParser(grammar) 
result = cp.parse(sent_pos) 
nounPhrases = [] 
for subtree in result.subtrees(filter=lambda t: t.label() == 'NP'): 
    np = '' 
    for x in subtree.leaves(): 
    np = np + ' ' + x[0] 
    nounPhrases.append(np.strip()) 

Für a = „Der amerikanischen Bürgerkrieg, der auch als Krieg zwischen den Staaten bekannt oder einfach der Bürgerkrieg, war ein Bürgerkrieg von 1861 bis 1865 kämpfte in die Vereinigten Staaten nach mehreren südlichen Sklavenstaaten erklärten ihre Sezession und die verbündeten Staaten von Amerika gebildet.“, extrahiert die Nominalphrasen

sind [‚American Civil War‘,‚Krieg‘,‚Staaten‘,‚Bürgerkrieg ", Bürgerkrieg gekämpft", "Vereinigte Staaten", "mehrere Südstaaten", "Staaten", "Sezession", "Konföderierte Staaten", "Amerika".

Jetzt muss ich die Spanne (Startposition und Endposition der Phrase) von Nominalphrasen finden. Zum Beispiel ist die Spanne der obigen Nominalphrasen

[(1,3), (9,9), (12, 12), (16, 17), (21, 23), ... .].

Ich bin ziemlich neu zu NLTK und ich habe in http://www.nltk.org/_modules/nltk/tree.html untersucht. Ich habe versucht, Tree.treepositions() zu verwenden, aber ich konnte nicht schaffen, absolute Positionen mit diesen Indizes zu extrahieren. Jede Hilfe würde sehr geschätzt werden. Danke!

Antwort

2

Es gibt keine implizite Funktion, die Offsets von Strings/Token kehrt als hervorgehoben durch https://github.com/nltk/nltk/issues/1214

Aber Sie können einen ngram Sucher verwenden, die von der RIBES score von https://github.com/nltk/nltk/blob/develop/nltk/translate/ribes_score.py#L123

>>> from nltk import word_tokenize 
>>> from nltk.translate.ribes_score import position_of_ngram 
>>> s = word_tokenize("The American Civil War, also known as the War between the States or simply the Civil War, was a civil war fought from 1861 to 1865 in the United States after several Southern slave states declared their secession and formed the Confederate States of America.") 
>>> position_of_ngram(tuple('American Civil War'.split()), s) 
1 
>>> position_of_ngram(tuple('Confederate States of America'.split()), s) 
43 

verwendet wird (Es gibt die Startposition der Abfrage zurück. Ngram)

+0

Danke für die Antwort! aber im Falle des NP * 'War' *, da es mehrere Vorkommen desselben Wortes im Satz gibt, gibt 'position_of_ngram (tuple ('War'.split()), s)' den Index des ersten zurück Vorkommen, das 3 ist, während das NP, das extrahiert wird, bei Index 9 ist. Gibt es eine Arbeit dafür? Danke noch einmal! – Corleone

+0

Vielleicht sollten Sie die Antwort akzeptieren. –

+0

@Corleone, da es keine Vorstellung von "Offset" gibt, ist das Beste, was Sie tun können, entweder die erste Instanz eines Ngrams oder rekursive die nächste Instanz zu bekommen. – alvas

Verwandte Themen