web-dev-qa-db-ja.com

クラスタリング(特に文字列クラスタリング)はどのように機能しますか?

類似のデータをグループ化するためのクラスタリングについて聞きました。文字列の特定のケースでどのように機能するか知りたい。

異なる100,000語を超えるテーブルがあります。

いくつかの違いがある同じ単語を特定したい(例:house, house!!, hooouse, HoUse, @house, "house", etc...)。

類似性を特定し、クラスター内の各単語をグループ化するには何が必要ですか?これにはどのアルゴリズムが推奨されますか?

30
Renato Dinhani

クラスタリングとはどのようなものかを理解するには、地理的な地図を想像してください。多くの異なるオブジェクト(家など)を見ることができます。それらのいくつかは互いに近くにあり、他は遠くにあります。これに基づいて、すべてのオブジェクトをグループ(都市など)に分割できます。クラスタリングアルゴリズムはこれを正確に行います。これにより、事前にグループの境界を指定しなくても、データをグループに分割できます。

すべてのクラスタリングアルゴリズムは、2つのオブジェクト間の距離(または尤度)に基づいています。地理的な地図では、2つの家の間の通常の距離です。多次元空間では、ユークリッド距離である場合があります(実際、マップ上の2つの家の間の距離もユークリッド距離です)。文字列の比較には、別のものを使用する必要があります。ここで2つの適切な選択肢は ハミングレベイン距離 です。あなたの特定のケースではLevenshtein distanceより望ましい場合(ハミング距離は同じサイズのストリングでのみ機能します)。

これで、既存のクラスタリングアルゴリズムのいずれかを使用できます。それらはたくさんありますが、すべてがあなたのニーズに合うわけではありません。たとえば、ここですでに説明した純粋なk平均法は、最初のグループ数を見つける必要があるため、ほとんど役に立ちません。文字列の大きな辞書では、100、200、500、10000になる可能性があります。 。そのため、他のアルゴリズムがより適切な場合があります。

それらの1つは expectation maximization アルゴリズムです。その利点は、クラスターの数を自動的に検出できることです。ただし、実際には多くの場合、他のアルゴリズムよりも正確な結果が得られないため、通常はk-means on EMの上にを使用します。つまり、最初にクラスターの数とその中心をEMで見つけ、次にk-meansを使用して結果を調整します。

アルゴリズムのもう1つの可能な分岐は、あなたのタスクに適している可能性があります 階層的クラスタリング です。この場合のクラスター分析の結果は、独立したグループのセットではなく、ツリー(階層)であり、いくつかの小さなクラスターが1つの大きなクラスターにグループ化され、最終的にすべてのクラスターが1つの大きなクラスターの一部になります。あなたの場合、それはすべての単語がある程度まで互いに類似していることを意味します。

45
ffriend

stringdist と呼ばれるパッケージがあり、いくつかの 異なるメソッド を使用して文字列を比較できます。そのページからのコピーペースト:

  • ハミング距離:両方の文字列で同じシンボルを含む位置の数。同じ長さの文字列に対してのみ定義されます。
  • レーベンシュタイン距離:文字列aを文字列bに変換するために必要な最小数の挿入、削除、および置換。
  • (フル)ダメラウ-レーベンシュタイン距離:レーベンシュタイン距離と同様ですが、隣接するシンボルの転置が許可されます。
  • 最適な文字列の配置/制限されたダメラウ-レヴェンシュタイン距離:ダメラウ-レヴェンシュタイン距離に似ていますが、各部分文字列は1回だけ編集できます。
  • 最長共通部分文字列距離:結果の部分文字列が同一になるまで両方の文字列で削除する必要がある記号の最小数。
  • q-gram距離:両方の文字列のN-gramベクトル間の絶対差の合計。
  • コサイン距離:1から両方のN-gramベクトルのコサイン類似度を引いたもの。
  • ジャカード距離:1は、共有されたN-gramとすべての観測されたN-gramの商をマイナスします。
  • ジャロ距離:ジャロ距離は4つの値の式であり、実質的にはp = 0のジャロ-ウィンクラー距離の特別な場合です。
  • Jaro-Winkler距離:この距離は、2つの比較された文字列(A、B、m、t、l)と[0、0.25]から選択されたpによって決定される5つのパラメーターの式です。

それはあなたに距離を与えるでしょう。クラスター分析を実行する必要がない場合があります。おそらく、文字列の距離自体で並べ替えれば十分です。基本的な機能を提供するスクリプトを作成しました here ...必要に応じて自由に改善してください。

4
Amit Kohli