2016-11-25 71 views
4

我需要計算2個向量中每個單詞之間的Jaccard相似度。每個單詞由每個單詞組成。並提取最相似的單詞。計算2個向量中每個單詞之間的Jaccard相似度

這裏是我不好不好慢代碼:

txt1 <- c('The quick brown fox jumps over the lazy dog') 
txt2 <- c('Te quick foks jump ovar lazzy 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] 

請幫我改善和美化大數據幀此代碼。

+0

如何大是「大」,以及多長時間需要使用你的代碼? – lukeA

+0

試試這個'sapply(words.p,function(x)mapply(stringdist,words,x,method ='jaccard'))''。這將直接爲您提供一個您可以輕鬆檢查的矩陣。 –

回答

3

準備(添加tolower這裏):

txt1 <- c('The quick brown fox jumps over the lazy dog') 
txt2 <- c('Te quick foks jump ovar lazzy 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") 

對於每個單詞wordswords.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" "lazzy" 
[9,] "dog" "dogg" 

編輯:

爲了讓你首先需要在words.p選擇從每個單詞words到所有字的最小距離的最佳匹配詞對:

mindists <- sapply(dists, min) 

這將讓每個字你最好的距離。然後你用最小距離選擇words字:

words[which.min(mindists)] 

或者在同一行:

words[which.min(sapply(dists, min))] 
+0

謝謝!但我只想得到一個最好的詞,在這種情況下,這是「快速」。如何提取它? – Dennix

+0

@Dennix在回答(編輯後)中添加了一條關於如何做到這一點的線 –

+0

@KarolisKoncevičius,感謝您的解決方案。我正在尋找類似的地址,但匹配的地址列表。所以我有一個包含大約70K個不同地址的數據集和另外一個包含大約4個Lack記錄(40萬個)的大型數據集。我想將每個地址與查看地址字的大型數據集進行匹配。我怎樣才能做到這一點?我已經發布了一個問題鏈接,http://stackoverflow.com/questions/42486172/r-string-match-for-address-using-stringdist-stringdistmatrix請幫助! – user1412

相關問題