類似のデータをグループ化するためのクラスタリングについて聞きました。文字列の特定のケースでどのように機能するか知りたい。
異なる100,000語を超えるテーブルがあります。
いくつかの違いがある同じ単語を特定したい(例:house, house!!, hooouse, HoUse, @house, "house", etc...
)。
類似性を特定し、クラスター内の各単語をグループ化するには何が必要ですか?これにはどのアルゴリズムが推奨されますか?
クラスタリングとはどのようなものかを理解するには、地理的な地図を想像してください。多くの異なるオブジェクト(家など)を見ることができます。それらのいくつかは互いに近くにあり、他は遠くにあります。これに基づいて、すべてのオブジェクトをグループ(都市など)に分割できます。クラスタリングアルゴリズムはこれを正確に行います。これにより、事前にグループの境界を指定しなくても、データをグループに分割できます。
すべてのクラスタリングアルゴリズムは、2つのオブジェクト間の距離(または尤度)に基づいています。地理的な地図では、2つの家の間の通常の距離です。多次元空間では、ユークリッド距離である場合があります(実際、マップ上の2つの家の間の距離もユークリッド距離です)。文字列の比較には、別のものを使用する必要があります。ここで2つの適切な選択肢は ハミング と レベイン距離 です。あなたの特定のケースではLevenshtein distanceより望ましい場合(ハミング距離は同じサイズのストリングでのみ機能します)。
これで、既存のクラスタリングアルゴリズムのいずれかを使用できます。それらはたくさんありますが、すべてがあなたのニーズに合うわけではありません。たとえば、ここですでに説明した純粋なk平均法は、最初のグループ数を見つける必要があるため、ほとんど役に立ちません。文字列の大きな辞書では、100、200、500、10000になる可能性があります。 。そのため、他のアルゴリズムがより適切な場合があります。
それらの1つは expectation maximization アルゴリズムです。その利点は、クラスターの数を自動的に検出できることです。ただし、実際には多くの場合、他のアルゴリズムよりも正確な結果が得られないため、通常はk-means on EMの上にを使用します。つまり、最初にクラスターの数とその中心をEMで見つけ、次にk-meansを使用して結果を調整します。
アルゴリズムのもう1つの可能な分岐は、あなたのタスクに適している可能性があります 階層的クラスタリング です。この場合のクラスター分析の結果は、独立したグループのセットではなく、ツリー(階層)であり、いくつかの小さなクラスターが1つの大きなクラスターにグループ化され、最終的にすべてのクラスターが1つの大きなクラスターの一部になります。あなたの場合、それはすべての単語がある程度まで互いに類似していることを意味します。
stringdist と呼ばれるパッケージがあり、いくつかの 異なるメソッド を使用して文字列を比較できます。そのページからのコピーペースト:
それはあなたに距離を与えるでしょう。クラスター分析を実行する必要がない場合があります。おそらく、文字列の距離自体で並べ替えれば十分です。基本的な機能を提供するスクリプトを作成しました here ...必要に応じて自由に改善してください。