Sie diese in wenigen Schritten mit NLTK erreichen können:
PoS markieren, die Sequenzen
die gewünschte n erzeugen -Gramme (in Ihren Beispielen gibt es keine Trigramme, aber Sprung-Gramm, die durch Trigramme erzeugt werden können und dann das mittlere Token ausstanzen)
Alle N-Gramme verwerfen, die nicht mit dem Muster übereinstimmen JJ NN.
Beispiel:
def jjnn_pairs(phrase):
'''
Iterate over pairs of JJ-NN.
'''
tagged = nltk.pos_tag(nltk.word_tokenize(phrase))
for ngram in ngramise(tagged):
tokens, tags = zip(*ngram)
if tags == ('JJ', 'NN'):
yield tokens
def ngramise(sequence):
'''
Iterate over bigrams and 1,2-skip-grams.
'''
for bigram in nltk.ngrams(sequence, 2):
yield bigram
for trigram in nltk.ngrams(sequence, 3):
yield trigram[0], trigram[2]
Erweitere Muster ('JJ', 'NN')
und die gewünschten n-Gramm auf Ihre Bedürfnisse.
Ich denke, es gibt keine Notwendigkeit für das Parsing. Das Hauptproblem dieses Ansatzes ist jedoch, dass die meisten PoS-Tagger nicht alles genau so markieren, wie Sie es möchten. Zum Beispiel markiert die Standard-PoS-Tagger meiner NLTK Installation "Chili" als NN, nicht JJ und "gebraten" bekam VBD. Parsing wird dir dabei allerdings nicht helfen!
Siehe http://stackoverflow.com/a/ 34742540/610569 und http: // stackoverflow.com/questions/17531684/n-Gramm-in-Python-vier-fünf-sechs-Gramm – alvas