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!
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
Vielleicht sollten Sie die Antwort akzeptieren. –
@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