1

私はTfidfVectorizerトランスフォームを行った後に、コサイン_ディスタンスをメトリックとして、DBSCANを使用して文字列の束をクラスタリングしようとしています。 2つの弦があるとします。それらの間のcosine_distance(sklearn.metrics.pairwise.cosine_distanceを使用して計算されたもの)は、それらが2つの文字列である場合、それらが大規模なデータセット(他の多くの文字列を含む)の一部である場合の距離とは異なります。2つの文字列間のsklearn cosine_distancesは、合計データセットのサイズによって異なりますか?

なぜこのようなことが起こり、2つの文字列の間の距離が、そのデータセットのサイズに関係なく同じであることを確認するにはどうすればよいですか?

このように、私のDBSCANはクラスタリングを確実に行うことができます!

EDIT:要求されたとして、サンプルコードを追加:

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_distances 

X = [ 
    'this is a string', 
    'this was a string' 
    ] 

Y = [ 
    'this could be a string', 
    'this may be a string' 
    ] 

Z = [ 
    'this is a string', 
    'this was a string', 
    'this could be a string', 
    'this may be a string' 
    ] 

for d in [X, Y, Z]: 
    tv = TfidfVectorizer() 
    print(cosine_distances(tv.fit_transform(d))) 

出力:

[[ 0.   0.49689739] 
[ 0.49689739 0.  ]] 

[[ 0.   0.39702518] 
[ 0.39702518 0.  ]] 

[[ 0.   0.64740127 0.70225689 0.70225689] 
[ 0.64740127 0.   0.70225689 0.70225689] 
[ 0.70225689 0.70225689 0.   0.46163155] 
[ 0.70225689 0.70225689 0.46163155 0.  ]] 

あなたがここに見ることができるように、this is a stringthis was a stringの間の距離は、データセットX0.497ですが、それは0.647データセットZ。ストリングthis could be a stringthis may be a stringデータセットYにおける上記の例では

Zに対して同じ、IはDBSCANの最大距離(EPS)のパラメータは、その後、データセットXに、0.6であることを選択した場合、両方の文字列が同じクラスタに置かれます、データセットZでは、それらは異なるクラスタに配置されます。

+0

あなたの目標をより明確にするために例/コードを追加してください – sera

答えて

0

コサイン類似度は長い文書に適しています。

短い文字列には十分な単語がありません。

距離が変化するのは、TFIDFのIDF部分によるものです。逆文書頻度加重を選択したので、文書頻度が変わると距離が変わります。

+0

aw snap ..それはまさに正しいことです!なぜそれが私に起こらなかったのか分かりません。その場合、私の要件を処理する正しい方法は何ですか?私は何を使用すべきですか? – shikhanshu

+0

私は分かりません。それはあなたのデータと、解決しなければならない課題に依存します。あなたのデータはおそらく 'this is a string 'ではありません。 –

+0

私はおそらくTfIdfの代わりにCountVectorizerを使用して、文書の頻度に影響を与えないようにする必要があります。それについて考えるでしょう。ありがとう。 – shikhanshu

関連する問題