2014-06-22 8 views
12

Ich habe dieses Beispiel und ich möchte wissen, wie Sie dieses Ergebnis erhalten. Ich habe Text und ich tokenize es dann sammle ich das Bigramm und trigram und fourgram wie dasPython NLTK: Bigramme Trigramme vier Gramm

import nltk 
from nltk import word_tokenize 
from nltk.util import ngrams 
text = "Hi How are you? i am fine and you" 
token=nltk.word_tokenize(text) 
bigrams=ngrams(token,2) 

Bigrams: [('Hi', 'How'), ('How', 'are'), ('are', 'you'), ('you', '?'), ('?', 'i'), ('i', 'am'), ('am', 'fine'), ('fine', 'and'), ('and', 'you')]

trigrams=ngrams(token,3) 

trigrams: [('Hi', 'How', 'are'), ('How', 'are', 'you'), ('are', 'you', '?'), ('you', '?', 'i'), ('?', 'i', 'am'), ('i', 'am', 'fine'), ('am', 'fine', 'and'), ('fine', 'and', 'you')]

bigram [(a,b) (b,c) (c,d)] 
trigram [(a,b,c) (b,c,d) (c,d,f)] 
i want the new trigram should be [(c,d,f)] 
which mean 
newtrigram = [('are', 'you', '?'),('?', 'i','am'),...etc 

jede Idee wird hilfreich sein,

+0

Ich verstehe nicht; es scheint, als hättest du die ngrams schon generiert? – Emre

+0

@Emre meine Frage, wie man das newtrigram ich versuche, eine Funktion zu finden, die innerhalb des Elementes von Bigram suchen und es mit dem Element von Trigram vergleichen kann und nehmen nur die verschiedenen –

Antwort

6

Wenn Sie einige Mengenlehre anwenden (wenn ich bin Wenn Sie Ihre Frage richtig stellen, werden Sie sehen, dass die gewünschten Trigramme einfach Elemente [2: 5], [4: 7], [6: 8] usw. der token-Liste sind.

Man könnte sie wie folgt erzeugen:

>>> new_trigrams = [] 
>>> c = 2 
>>> while c < len(token) - 2: 
...  new_trigrams.append((token[c], token[c+1], token[c+2])) 
...  c += 2 
>>> print new_trigrams 
[('are', 'you', '?'), ('?', 'i', 'am'), ('am', 'fine', 'and')] 
+0

meine Frage bezieht sich eigentlich auf eine andere Frage, wenn Sie nehmen können ein Blick auf diese Frage vielleicht erhalten Sie die ganze Idee http://stackoverflow.com/questions/24289553/python-nltk-grams-filtering-and-excluding?noredirect=1#comment37580272_24289553 –

+0

und in dieser Frage ist Ihre Lösung richtig –

0

ich es wie folgt tun:

def words_to_ngrams(words, n, sep=" "): 
    return [sep.join(words[i:i+n]) for i in range(len(words)-n+1)] 

Dies nimmt Liste von Wörtern als Eingabe und gibt eine Liste von ngrams (bei gegebenem n), getrennt durch sep (in diesem Fall ein Leerzeichen).