2016-10-18 14 views
2

私は文字列の配列を持っており、それらをクラスターにソートする必要があるとしましょう。テキスト文字列の類似度を計算する方法は?

クラスタ1:私は現在、nグラム、例えば使用して分析をしています

  • パイプパイプについて、ラスベガスで
  • 作品を固定
    • パイプを固定する固定を

クラスタ2:

  • クラシック音楽
    • クラシック音楽が
    • 素晴らしいですなぜクラシック音楽は何

など

私は、これらの2つの文字列を持っているのは、この配列内ましょうテキスト(その他):

彼らは同じトークン化構造を共有していないよう

日本から

  • 日本人学生
  • 学生は今、N-gram方式は、明らかに、一緒にこれらの2つの文字列を入れていないだろう。私はDamerau-Levenshteinの距離計算とTF/IDFを使ってみましたが、両方ともあまりにも多くの外部ノイズを取得します。これらの2つの文字列が単一のクラスタ内に属していることを理解するために使用できる他のテクニックはどれですか?

答えて

3

ユニグラムとバイグラムの両方を取り出して(おそらくステミングした後に)フレーズの単純な語彙表現を使用し、それらを特徴ベクトルに入れて、例えばコサインを使用してベクトル間の類似性を測定することができます。 hereまたはhereを参照してください。これは長めの文書でも機能しますが、目的に応じて十分に機能する場合があります。

より洗練されたテクニックは、文書のコーパスからdistributed bag-of-words modelを訓練し、それを使用してドキュメントのペアの類似性を見つけることです。

[編集]

あなたはまたword2vecを使用して分散弓モデルを使用することができます。たとえば、Pythonでgensimライブラリと事前訓練を受けたword2vec Google News modelで:

from gensim.models import word2vec 
model = word2vec.Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin.gz', binary=True) 
print model.n_similarity(['students', 'Japan'], ['Japanese', 'students']) 

出力:

0.8718219720170907 
+0

は、おかげでこの1を試します –

1

あなたは、正規化の問題を抱えています。文字列等価は一致アルゴリズムを駆動し、 "Japan"と "Japanese"は文字列に相当しません。いくつかのオプション:

1)トークンをルートフォームに正規化して、 "Japanese"を "Japan"などに正規化します。正規化には「スティーブジョブズ」について「ジョブ」を「ジョブ」に正規化したくないというようないくつかの問題があります。ポーターステマー、その他の形態ツールなどがこれを助けることができます。

2)文字列等価に文字nグラムを使用します。あなたが3〜5グラムをした場合、両方の文章がクラスタリングされる "日本"のインスタンスが存在します。私はクラス分けのためのこれの大ファンであり、クラスタリングについてはあまり確かではありません。

3)Latent Dirichelet Allocationのようなクラスタリングに潜在的な手法を使用します。おおまかに言えば、「東京」などの言葉に強く関連する他の文字列に対応する「日本」と「日本」を関連づけます。

ブレック

関連する問題