2016-08-29 6 views
0

this postのコードは非常に役に立ちます。 (私はその記事にコメントを追加したいが、評判のポイントは50点ある)テキスト文書をクラスタリングし、重複するトップ用語を取得する

私は上記のコードで同じコードを使用したが、私自身のクラスタリングコードのデバッグに使用していたテスト文書を追加した。何らかの理由で、1つの文書の単語が両方のクラスタに表示されます。

コードは次のとおりです。

アップデート:私は、以下の文書を「ユニーク文」を追加しました。

documents = ["I ran yesterday.", 
       "The sun was hot.", 
       "I ran yesterday in the hot and humid sun.", 
       "Yesterday the sun was hot.", 
       "Yesterday I ran in the hot sun.", 
       "Unique sentence." ] 

vectorizer = TfidfVectorizer(stop_words='english') 
X = vectorizer.fit_transform(documents) 

#cluster documents  
true_k = 2 
model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1) 
model.fit(X) 

#print top terms per cluster clusters  
print("Top terms per cluster:") 
order_centroids = model.cluster_centers_.argsort()[:, ::-1] 
terms = vectorizer.get_feature_names() 
for i in range(true_k): 
    print ("Cluster %d:" % i,) 
    for ind in order_centroids[i, :10]: 
     print(' %s' % terms[ind]) 
    print 

私が受け取る出力は次のようになります。

UPDATE:私は上記の「独特の文章を」反映するには、以下の出力を更新しました。

クラスタ0: 日 ホット 昨日 が 多湿 ユニーク 文 クラスタ1走った:あなたは湿気の多い「ことに注意しましょう 多湿 ホット

を走った ユニーク 文 昨日 日を"上記の文書の1行にすぎないにもかかわらず、両方のクラスターのトップタームとして表示されます。私はこのケースでは「湿っぽい」のようなユニークな言葉が、クラスターのうちの1つのクラスターのトップタームになると期待しています。

ありがとうございます!

答えて

2

TF * IDFは、特定のドキュメント(この場合は行)の単語(この場合は列)の表現力を示します。代表者とは、ある文書で頻繁に単語が出現するが、他の文書では頻繁に出現しないことを意味する。 TF * IDF値が高いほど、この単語は特定の文書を表します。

ここで実際に作業する値を理解していきましょう。 Sklearnのkmeansから戻り変数をcluster_centersにします。これは、TF * IDF重みの配列である各クラスターの座標を、各単語1に対して提供します。これらは単語の頻度の抽象的な形式であり、もはや特定の文書に関連しないことに注意することが重要です。次に、numpy.argsort()は、最小のTF * IDF値のインデックスから始まる配列をソートするインデックスを返します。それでは、[:、:: - 1]でその順序を逆にします。今度は、最初にそのクラスタセンターの最も代表的な単語のインデックスを持っています。

今、k-meansについてもう少し話しましょう。 k-meansはkクラスタ中心をランダムに初期化します。次に、各文書がセンタに割り当てられ、次にクラスタセンタが再計算されます。これは、文書とその最も近い中心との間の平方された距離の和を最小にする最適化基準が満たされるまで繰り返される。これは、ランダムな初期化のために、各クラスタディメンションがTF * IDF値0を持たない可能性が高いことを意味します。さらに、k-平均は、最適化基準が満たされるとすぐに停止する。したがって、中心のTF * IDF値は、他のクラスタに割り当てられた文書のTF * IDFが他のクラスタ中心よりもこの中心に近いことを意味する。

1つの追加ビットはorder_centroids [I、:10]であることである、各クラスタのための10個の最も代表的な単語が印刷されていますが、合計でわずか5単語を持っているので、すべての単語は、いずれかの方法だけで印刷されます別の順序。

私はこれが助けてくれることを願っています。ところで、k-meansはグローバル最適を見つけることを保証するものではなく、局所的な最適値に陥る可能性があります。そのため、通常は異なるランダムな開始点で複数回実行されます。

1

必ずしもそうではありません。あなたが使用しているコードは、あなたのコーパスの単語の袋(停止単語を除く)のベクトル空間を作成します(私はtf-idf重み付けを無視しています)。あなたの文書を見ると、あなたのベクトル空間は、(順番を無視して)のような単語列で、サイズ5は次のとおりです。

word_vec_space = [yesterday, ran, sun, hot, humid] 

各文書は、それが「word_vec_space」の単語が含まれているかどうかの数値ベクトルが割り当てられます。

K平均クラスタリングを実行する場合、あなたはベクトル空間にk個の出発点を選び、ポイントはクラスタを最適化するために移動できるようにする
"I ran yesterday." -> [1,1,0,0,0] 
"The sun was hot." -> [0,0,1,1,0] 
... 

。あなたは'humid'のためのゼロ以外の値を含む両方のクラスタセントロイドで終わった。これは、'humid'も含まれている文が'sun','hot'、および'yesterday'であったためです。

+0

ありがとうございました。 これは、「湿気の多い」「太陽」「暑い」「昨日」を含む1つの文によるものです。 私は各クラスタにユニークなメンバーがあったと思います。クラスターメンバーが複数のクラスターに属することができる共通語があるかのようです。 しかし、前の例の「湿気の多い」文章では、「sun」、「hot」、「yesterday」という単語が共有されていました。私は一意のセンテンスを含むように例を更新しました。また、サンプル出力を更新しました。一意の文の単語も両方のクラスタに表示されます(つまり、「一意」と「文」)。 – RandomTask

1

クラスタにはなぜ上位用語がありますか?

  • バナナフルーツ
  • リンゴのフルーツ
  • アップルコンピュータ
  • : - (用心非常に多くの場合、それはしない)、あなたはこれらのクラスタが悪いか良いことを検討する

    は、クラスタリングが働いて考えてみましょう

  • Windowsコンピュータ
  • 窓のブラインド

私がこのようなクラスターを手に入れることができれば、私はうれしいことになるだろう(iknfact、私はエラーを見ていると信じている。テキストクラスタリングは、常に非動作の境界線です)。

テキストクラスタの場合、単語の組み合わせについては、単語ではなく、となります。アップルの果物とリンゴのコンピュータは同じではありません。

+0

私はすべてのあなたの応答をありがとう。 KmeansとKmeans ++の結果の他の視覚的な例に基づいて、私は、この一般的な例と同様に、クラスタ化されたドキュメントがユニークであることを期待していました(http://www.mathworks.com/matlabcentral/mlc-downloads/downloads /submissions/34504/versions/7/screenshot.jpg) – RandomTask

+0

文書はk-meansによって一意的に割り当てられますが、すべての単語はすべてのクラスタに値を持ちます。 LDA(テキストのより一般的なテクニック)では、私はすべてのドキュメンタントがトピックの分布を持ち、すべてのトピックに単語の分布があると信じています。 –

関連する問題