2016-04-12 7 views
3

Unten ist der Eingang Pandas Datenrahmen, den ich habe.Wie findet man die Ngram-Frequenz einer Spalte in einem Pandas-Dataframe?

enter image description here

Ich möchte die Häufigkeit von Unigramme & Bigrams zu finden. Eine Probe von, was ich erwarte, wird unten gezeigt enter image description here

Wie man dies tut, indem man nltk oder scikit lernt?

Ich schrieb den folgenden Code, der eine Zeichenfolge als Eingabe verwendet. Wie erweitert man es auf Serie/Datenrahmen?

from nltk.collocations import * 
desc='john is a guy person you him guy person you him' 
tokens = nltk.word_tokenize(desc) 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
finder = BigramCollocationFinder.from_words(tokens) 
finder.ngram_fd.viewitems() 

Antwort

10

Wenn Ihre Daten wie

ist
import pandas as pd 
df = pd.DataFrame([ 
    'must watch. Good acting', 
    'average movie. Bad acting', 
    'good movie. Good acting', 
    'pathetic. Avoid', 
    'avoid'], columns=['description']) 

Sie konnten die CountVectorizer des Pakets verwenden sklearn:

from sklearn.feature_extraction.text import CountVectorizer 
word_vectorizer = CountVectorizer(ngram_range=(1,2), analyzer='word') 
sparse_matrix = word_vectorizer.fit_transform(df['description']) 
frequencies = sum(sparse_matrix).toarray()[0] 
pd.DataFrame(frequencies, index=word_vectorizer.get_feature_names(), columns=['frequency']) 

Welche gibt Ihnen:

   frequency 
good   3 
pathetic  1 
average movie 1 
movie bad  2 
watch   1 
good movie  1 
watch good  3 
good acting  2 
must   1 
movie good  2 
pathetic avoid 1 
bad acting  1 
average   1 
must watch  1 
acting   1 
bad    1 
movie   1 
avoid   1 

fit wird einfach Ihren Vektorisierer "trainieren": Er wird die Wörter Ihres Korpus aufteilen und ein Vokabular damit erstellen. Dann kann transform ein neues Dokument aufnehmen und einen Vektor der Häufigkeit basierend auf dem Vektorisierungsvokabular erstellen.

Hier ist Ihr Trainingssatz Ihre Ausgabe, so dass Sie beide gleichzeitig tun können (fit_transform). Da Sie 5 Dokumente haben, werden 5 Vektoren als Matrix erstellt. Sie wollen einen globalen Vektor, also müssen Sie einen sum machen.

+0

+1 Können Sie den Unterschied zwischen fit_transform()/fit()/transform() erklären? Wie haben Sie herausgefunden, dass die Summe (sparse_matrix) .toarray() [0] die Frequenzen angibt? Ich fand nicht viele Informationen, die das in der scikit learn Dokumentation wieder auftraten. –

+0

@ML_Pro Ich habe der Antwort eine Erklärung hinzugefügt. – Till

+0

Als Antwort markiert. Sehr hilfreiche Erklärung. –

Verwandte Themen