文字列(単語)の長いリストを類似グループにクラスタリングする


31

私には次の問題があります:非常に長い単語のリスト、おそらく名前、姓などがあります。この単語リストをクラスタ化する必要があります。同じクラスター。たとえば、「algorithm」と「alogrithm」は同じクラスターに表示される可能性が高いはずです。

パターン認識の文献で、k-meansクラスタリング、EMクラスタリングなどの古典的な教師なしクラスタリング手法をよく知っています。ここでの問題は、これらのメソッドがベクトル空間にあるポイントで機能することです。私はここで手に弦の言葉を持っています。私のこれまでの調査努力によれば、数値ベクトル空間で文字列を表現し、文字列クラスタの「平均」を計算する方法の問題は十分に答えられていないようです。この問題を攻撃するための単純なアプローチは、k-Meansクラスタリングとレーベンシュタイン距離を組み合わせることですが、「ストリングの「手段」をどのように表現するのか?」という疑問は残ります。TF-IDFウェイトと呼ばれるウェイトがありますが、それは単一の単語のクラスタリングではなく、「テキストドキュメント」クラスタリングの領域にほとんど関連しているようです。 http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

この分野での検索はまだ続いていますが、ここからもアイデアを得たいと思いました。この場合、何をお勧めしますか?この種の問題の方法を知っている人はいますか?


1
「K-medoids」という名前のk-meansのバリアントの存在について学びました。en.wikipedia.org/wiki/K-medoids L2ユークリッド距離では機能せず、平均の計算は必要ありません。クラスタ内の他のデータポイントに最も近いデータポイントを「medoid」として使用します。
ウフクカンビチチ14年

1
It seems that there are some special string clustering algorithms。統計/データ分析ではなく、特にテキストマイニングフィールドから来ている場合、このステートメントは保証されます。ただし、クラスタリングブランチをそのまま習得すると、文字列データ用の「特別な」アルゴリズムが存在しないことがわかります。「特殊」とは、クラスター分析に入力する前に、このようなデータを前処理する方法です。
ttnphns


Affinity PropagationとK-Meansクラスタリングの違いと、それが計算時間に与える影響に注意してください。quora.com/...
ガブリエルアロン

回答:


37

アフィニティ伝播に関する@micanの推奨を再確認します。

論文から:Lフレイ、ブレンダンJ.、およびデルバートデューク 「データポイント間でメッセージを渡すことによるクラスタリング。」科学 315.5814(2007):972-976。

その非常に多くのパッケージを介して使いやすい。ペアワイズ類似度を定義できるものなら何でも機能します。これは、レーベンシュタイン距離に-1を掛けることで得られます。

質問の最初の段落を入力として使用して、簡単な例をまとめました。Python 3の場合:

import numpy as np
import sklearn.cluster
import distance

words = "YOUR WORDS HERE".split(" ") #Replace this line
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])

affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster_str))

出力は、クラスターの左側にあるイタリック体の例です。

  • 持っている:チャンス、編集、手、持っている、高い
  • 次:
  • 問題:問題
  • I: I、a、at、etc、in、list、of
  • おそらく:おそらく
  • クラスター:クラスター
  • word: for、and、for、for、need、need、should、very、word、words
  • 類似:類似
  • レーベンシュタイン:レーベンシュタイン
  • 距離:距離
  • the:それ、the、this、to、with
  • 同じ:例、リスト、名前、same、such、surnames
  • アルゴリズム:アルゴリズム、アルゴリズム
  • 登場:登場、登場

50のランダムな名のリストで実行します

  • ダイアン:ディアナ、ダイアン、ディオンヌ、ジェラルド、イリーナ、リゼット、ミンナ、ニッキー、リッキー
  • ジャニ:クレア、ジャニ、ジェイソン、Jc、キミ、ラング、マーカス、マキシマ、ランディ、ラウル
  • Verline: Destiny、Kellye、Marylin、Mercedes、Sterling、Verline
  • グレン:エレノール、グレン、グウェンダ
  • アルマンディーナ:アルマンディーナ、オーガスティナ
  • シーラ:アーメド、エステラ、ミリッサ、シーラ、トレサ、ワイネル
  • ローリーン:オータム、ヘイディー、ローリーン、ローレン
  • アルベルト:アルベルタ、アルベルト、ロバート
  • Lore: Ammie、Doreen、Eura、Josef、Lore、Lori、Porter

私にはとても素晴らしく見えます(楽しかったです)。


sklearnのみを使用して同じアルゴリズムを持つことは可能ですか?またはハミングでscipy.spatial.distanceを使用しますか?レベンシュタインを使用する利点は何ですか?私はこの質問を使用する必要がありますね:stackoverflow.com/questions/4588541/…–
ピエール

1
@pierre Levenshteinは、私が「スペルチェッカーの距離」と呼ぶものであり、人間のスペルミスの可能性の良い代用物です。Damerau Levenshteinはさらに良いかもしれません。ハミング距離が長さが等しくない文字列に対して定義されていることはわかりません。スワップのみを許可し、挿入は許可しません。最も合理的に文字列をパディング/トリミングする方法を決定することは、レーベンシュタイン距離を計算するのとほとんど同じくらい難しいです。スタートをパッド/トリムする必要がありますか?終わり?真ん中から?
リンドンホワイト

距離への依存を本当に避けたい場合。Rossettaコード実装を
リンドンホワイト

en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distanceを読むと、 転位がどのようにタイプミスのために特別な違いを生むことができるかを見ることができ、pythonには新しいパッケージがあります。私は単語のリストに対してこれを使用して「最も近いもの」を取得する方法を見ることができますが、最も重要ではないかもしれません。リストを取得して、tf-idfで確認する必要があります。クールありがとう
ピエール

1
@dduhaimeはほぼ確実に。一般に、アフィニティ伝播は非対称的パーフェクションに対して機能しますが、これは対称的であるため先に進みます。SciPyの何かは、完全な行列としてducktypesする三角行列型を持っていると確信しています。私はjulia-langの土地で長すぎて、これがPythonでどのように行われたか思い出せません。(ジュリアでは使用しますSymmetric
リンドンホワイト

5

Louvainクラスタリング、制限付き近傍検索クラスタリング(RNSC)、Affinity Propgation Clustering(APC)、またはMarkov Clusterアルゴリズム(MCL)などのグラフクラスタリングアルゴリズムを使用します。


私が見つけたK-medoids方法はどうですか?このソリューションをできるだけ早く実装する必要があるので、私にとっては良いソリューションに思えました。私はこれらのグラフベースの方法の存在を知っていますが、それらを理解して実装するために必要な時間を費やすことができないのではないかと心配しています。
ウフクカンビチチ14年

それらすべてのソフトウェアは、GNU GPLなど、かなり制限のないライセンス契約で利用できます。私は主にkパラメータのためにk-mediodsタイプのアルゴリズムの大ファンではありませんが、当然あなた次第です。社内での実装が必要な場合は、おそらくAPCとMCLを実装するのが最も簡単だと思います。あなたがそれをすることになっているなら、もちろん最初にそれらを試してください。
ミカン14年

2

単語のn-gramをベクトル空間エントリとしてベクトル空間モデルを試すことができます。この場合、距離を編集する代わりに、コサイン類似度などの尺度を使用する必要があると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.