web-dev-qa-db-ja.com

scikit-learn:DBSCANを使用したテキストドキュメントのクラスタリング

Scikit-learnを使用してテキストドキュメントをクラスター化しようとしています。全体的に、私は自分の道を見つけますが、特定の問題に問題があります。私が見つけた例のほとんどは、クラスタリングアルゴリズムとしてk-meansを使用したscikit-learnを使用したクラスタリングを示しています。これらの例をk-meansで私の設定に採用すると、原則として機能します。ただし、クラスターの数がわからないため、k-meansは適切ではありません。私がこれまで読んだことから、必要に応じてここで修正してください。私の場合は、DBSCANまたはMeanShiftの方が適切と思われます。 scikit-learn Webサイトには、各クラスターアルゴリズムの例が記載されています。問題は、DBSCANとMeanShiftの両方で、解決はもちろんのこと、理解できないエラーが発生することです。

私の最小限のコードは次のとおりです。

_docs = []
for item in [database]:
    docs.append(item)

vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(docs)

X = X.todense() # <-- This line was needed to resolve the isse

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
...
_

(マイドキュメントはすでに処理されています。つまり、ストップワードが削除され、Porter Stemmerが適用されています。)

このコードを実行すると、DBSCANをインスタンス化してfit()を呼び出すと、次のエラーが発生します。

_...
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 248, in fit
clust = dbscan(X, **self.get_params())
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 86, in dbscan
n = X.shape[0]
IndexError: Tuple index out of range
_

エラーをスローする_dbscan_.py_の行をクリックすると、次の行に気づきました。

_...
X = np.asarray(X)
n = X.shape[0]
...
_

これらをテスト用のコードで直接行に使用すると、同じエラーが発生します。ここでnp.asarray(X)が何をしているのかはよくわかりませんが、コマンドX.shape = ()の後です。したがって、_X.shape[0]_爆弾-以前は、_X.shape[0]_はドキュメントの数を正しく参照していました。好奇心から、_dbscan_.py_からX = np.asarray(X)を削除しました。これを行うと、何かが大量に計算されます。しかし、数秒後、別のエラーが発生します。

_...
File "/usr/lib/python2.7/dist-packages/scipy/sparse/csr.py", line 214, in extractor
(min_indx,max_indx) = check_bounds(indices,N)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/csr.py", line 198, in check_bounds
max_indx = indices.max()
File "/usr/lib/python2.7/dist-packages/numpy/core/_methods.py", line 17, in _amax
out=out, keepdims=keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity
_

つまり、DBSCANを機能させる方法や、一般的に見逃していた可能性のあるものがわかりません。

21
Christian

sklearnの実装は、有限のベクトル空間を扱っていることを前提としているようで、次元を見つけたいと考えています。あなたのデータセットの。テキストデータは通常、sparseベクトルとして表されますが、現在は同じ次元になっています。

入力データはおそらくデータマトリックスではありませんが、sklearnの実装ではそれらが1つである必要があります。

別の実装を見つける必要があります。たぶん [〜#〜] elki [〜#〜] の実装を試してみてください。これは非常に高速であり、この制限はありません。

最初に類似性を理解するために時間を費やす必要があります。 DBSCANの場合、データに適した方法でmustepsilonを選択します。経験則はありません。これはドメイン固有です。したがって、最初に、2つのドキュメントが類似していることを意味する類似性のしきい値を把握する必要があります。

平均シフトは、実際にはneedデータを固定次元のベクトル空間にすることができます。

DBSCANのスパース表現がサポートされているようです 2015年1月現在

Sklearnを0.16.1にアップグレードしたところ、テキストで機能しました。

14
cyniphile