私のトピックは、(多数の)テキストの類似性とクラスタリングです。一言で言えば、私は収集されたテキストを一緒にクラスター化したいので、それらは最後に意味のあるクラスターに表示されるはずです。これを行うために、これまでの私のアプローチは次のとおりです。私の問題はクラスタリングにあります。現在のソフトウェアはphpで書かれています。
1)類似性:私はすべてのドキュメントを「単語の袋」として扱い、単語をベクトルに変換します。私が使う
- フィルタリング(「実際の」単語のみ)
- トークン化(文を単語に分割)
- ステミング(単語を基本形に縮小します;ポーターのステマー)
- 剪定(頻度が高すぎたり低すぎたりする単語のカット)
次元削減の方法として。その後、私はコサイン類似性を使用しています(ウェブ上のさまざまなサイトやここで提案/説明されているように) 。
結果は、次のような類似性マトリックスになります。
A B C D E
A 0 30 51 75 80
B X 0 21 55 70
C X X 0 25 10
D X X X 0 15
E X X X X 0
A…Eは私のテキストであり、数字はパーセントでの類似性です。高いほど、テキストは類似しています。sim(A、B)== sim(B、A)であるため、行列の半分だけが入力されます。したがって、テキストAとテキストDの類似性は71%です。
ここで、この行列から事前に不明な(!)数のクラスターを生成したいと思います。クラスターは、類似したアイテム(特定の停止基準まで)を一緒に表す必要があります。
私は基本的な実装を自分で試しましたが、これは基本的に次のようなものでした(固定類似性しきい値として60%)
foreach article
get similar entries where sim > 60
foreach similar entry
check if one of the entries already has a cluster number
if no: assign new cluster number to all similar entries
if yes: use that number
それは(どういうわけか)機能しましたが、まったく良くなく、結果はしばしばモンスタークラスターでした。ですから、これをやり直したいと思い、すでにあらゆる種類のクラスタリングアルゴリズムを調べましたが、どれが最適かはまだわかりません。最初はテキストのすべてのペアをクラスターと見なすことができるため、これは凝集アルゴリズムである必要があると思います。しかし、それでも問題は、stopp基準が何であるか、そしてアルゴリズムが既存のクラスターを分割および/またはマージする必要があるかどうかです。
いくつかのものが基本的なように思われる場合は申し訳ありませんが、私はこの分野では比較的新しいです。助けてくれてありがとう。