4

2 つのベクトルの各単語間の Jaccard 類似度を計算する必要があります。一言一句、一句一句。そして最も類似した単語を抽出します。

これが私の悪い悪い遅いコードです:

txt1 <- c('The quick brown fox jumps over the lazy dog')
txt2 <- c('Te quick foks jump ovar lazey dogg')

words <- strsplit(as.character(txt1), " ")
words.p <- strsplit(as.character(txt2), " ")

r <- length(words[[1]])
c <- length(words.p[[1]])

m <- matrix(nrow=r, ncol=c)
for (i in 1:r){
  for (j in 1:c){
    m[i,j] = stringdist(tolower(words.p[[1]][j]), tolower(words[[1]][i]), method='jaccard', q=2)
  }
}

ind <- which(m == min(m))-nrow(m)
words[[1]][ind]

大きなデータ フレーム用にこのコードを改善して美しくするのを手伝ってください。

4

1 に答える 1

3

準備(tolowerここに追加):

txt1 <- c('The quick brown fox jumps over the lazy dog')
txt2 <- c('Te quick foks jump ovar lazey dogg')

words <- unlist(strsplit(tolower(as.character(txt1)), " "))
words.p <- unlist(strsplit(tolower(as.character(txt2)), " "))

各単語の距離を取得します。

dists <- sapply(words, Map, f=stringdist, list(words.p), method="jaccard")

の各単語について、wordsから最も近い単語を見つけますwords.p

matches <- words.p[sapply(dists, which.min)]

cbind(words, matches)
              matches
 [1,] "the"   "te"
 [2,] "quick" "quick"
 [3,] "brown" "ovar"
 [4,] "fox"   "foks"
 [5,] "jumps" "jump"
 [6,] "over"  "ovar"
 [7,] "the"   "te"
 [8,] "lazy"  "lazey"
 [9,] "dog"   "dogg"

編集:

最も一致する単語のペアを取得するには、最初に の各単語wordsから のすべての単語までの最小距離を選択する必要がありwords.pます。

mindists <- sapply(dists, min)

これにより、各単語の可能な限り最高の距離が得られます。words次に、距離が最小の単語を選択します。

words[which.min(mindists)]

または1行で:

words[which.min(sapply(dists, min))]
于 2016-11-25T11:57:16.717 に答える