web-dev-qa-db-ja.com

ドキュメントtfidf 2Dグラフをプロットする

私の文章リストのx軸を用語、y軸をTFIDFスコア(またはドキュメントID)として2Dグラフをプロットしたいと思います。 scikit learnのfit_transform()を使用してscipy行列を取得しましたが、その行列を使用してグラフをプロットする方法がわかりません。私は自分の文章がkmeansを使用してどれだけうまく分類できるかを確認するためのプロットを取得しようとしています。

fit_transform(sentence_list)の出力は次のとおりです。

(ドキュメントID、用語番号)tfidfスコア

(0, 1023)   0.209291711271
(0, 924)    0.174405532933
(0, 914)    0.174405532933
(0, 821)    0.15579574484
(0, 770)    0.174405532933
(0, 763)    0.159719994016
(0, 689)    0.135518787598

これが私のコードです:

sentence_list=["Hi how are you", "Good morning" ...]
vectorizer=TfidfVectorizer(min_df=1, stop_words='english', decode_error='ignore')
vectorized=vectorizer.fit_transform(sentence_list)
num_samples, num_features=vectorized.shape
print "num_samples:  %d, num_features: %d" %(num_samples,num_features)
num_clusters=10
km=KMeans(n_clusters=num_clusters, init='k-means++',n_init=10, verbose=1)
km.fit(vectorized)
PRINT km.labels_   # Returns a list of clusters ranging 0 to 10 

おかげで、

16
jxn

Bag of Wordsを使用すると、各文は語彙と同じ長さの高次元空間で表現されます。これを2Dで表現する場合は、次元を減らす必要があります。たとえば、2つのコンポーネントでPCAを使用します。

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt

newsgroups_train = fetch_20newsgroups(subset='train', 
                                      categories=['alt.atheism', 'sci.space'])
pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
])        
X = pipeline.fit_transform(newsgroups_train.data).todense()

pca = PCA(n_components=2).fit(X)
data2D = pca.transform(X)
plt.scatter(data2D[:,0], data2D[:,1], c=data.target)
plt.show()              #not required if using ipython notebook

data2d

これで、たとえば、クラスターがこのデータに入力した値を計算してプロットできます。

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=2).fit(X)
centers2D = pca.transform(kmeans.cluster_centers_)

plt.hold(True)
plt.scatter(centers2D[:,0], centers2D[:,1], 
            marker='x', s=200, linewidths=3, c='r')
plt.show()              #not required if using ipython notebook

enter image description here

34
elyase

変数をラベルに割り当て、それを使用して色を示します。 ex km = Kmeans().fit(X) clusters = km.labels_.tolist()、次にc=clusters

1
beto