レーベンシュタイン距離によるテキストクラスタリング 質問する

レーベンシュタイン距離によるテキストクラスタリング 質問する

私は小さな文字列(3〜6文字)のセット(2k〜4k)を持っており、それらをクラスタ化したいと考えています。文字列を使用するので、以前の回答クラスタリング (特に文字列クラスタリング) はどのように機能しますか?、私に知らせてくれたレーベンシュタイン距離文字列の距離関数として使うのが良いでしょう。また、クラスターの数は事前に分からないので、階層的クラスタリングこれが正しい方法であり、k-means ではありません。

問題を抽象的に理解しているものの、実際にそれを実行する簡単な方法がわかりません。たとえば、カスタム関数 (レーベンシュタイン距離) を使用した階層的クラスタリングを実際に実装するには、MATLAB と R のどちらが適しているでしょうか。どちらのソフトウェアでも、レーベンシュタイン距離の実装は簡単に見つかります。クラスタリングの部分は難しいようです。たとえば、MATLAB でのテキストのクラスタリングすべての文字列の距離配列を計算しますが、実際にクラスタリングを取得するために距離配列を使用する方法がわかりません。MATLAB または R でカスタム関数を使用して階層的クラスタリングを実装する方法を教えていただけますか?

ベストアンサー1

少し単純すぎるかもしれませんが、R でレーベンシュタイン距離に基づく階層的クラスタリングを使用するコード例を次に示します。

set.seed(1)
rstr <- function(n,k){   # vector of n random char(k) strings
  sapply(1:n,function(i){do.call(paste0,as.list(sample(letters,k,replace=T)))})
}

str<- c(paste0("aa",rstr(10,3)),paste0("bb",rstr(10,3)),paste0("cc",rstr(10,3)))
# Levenshtein Distance
d  <- adist(str)
rownames(d) <- str
hc <- hclust(as.dist(d))
plot(hc)
rect.hclust(hc,k=3)
df <- data.frame(str,cutree(hc,k=3))

この例では、30 個のランダムな char(5) 文字列のセットを 3 つのグループ (「aa」、「bb」、「cc」で始まる) に人工的に作成します。 を使用してレーベンシュタイン距離行列を計算しadist(...)、 を使用して階層的クラスタリングを実行しますhclust(...)。次に、を使用して樹状図を 3 つのクラスターに分割しcutree(...)、クラスター ID を元の文字列に追加します。

おすすめ記事