2016-04-12 13 views
3

以下は私が持っている入力パンダのデータフレームです。パンダのデータフレームでngramの頻度を見つける方法は?

enter image description here

私はユニグラム&バイグラムの頻度を見つけたいです。私が期待しているものの例を以下に示します。enter image description here

nltkやscikitを使ってこれを行う方法は?

文字列を入力として以下のコードを書いています。それをシリーズ/データフレームに拡張する方法は?

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() 

答えて

10

あなたのデータはあなたがパッケージsklearnCountVectorizerを使用することができ

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

のようなものである場合:

あなたに与え
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']) 

   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 

EDIT

fitあなたのコーパスの単語を分割してそれを使ってボキャブラリを作成します。その後、transformは、新しい文書を取得し、ベクトル化ボキャブラリに基づいて頻度のベクトルを作成することができます。

ここでトレーニングセットは出力セットなので、両方を同時に行うことができます(fit_transform)。 5つの文書があるので、5つのベクトルが行列として作成されます。グローバルベクトルが必要なので、sumにする必要があります。

+0

+1 fit_transform()/ fit()/ transform()の違いを説明できますか?どのようにしてsum(sparse_matrix).toarray()[0]が周波数を与えるのか分かりましたか?私はscikitでこれを撤回する多くの情報を見つけられませんでした。 –

+0

@ML_Pro答えに説明を追加しました。 – Till

+0

答えとして表示されます。非常に役立つ説明。 –

関連する問題