2016-05-10 2 views
1

Я хотел бы использовать сходство Jaccard в функции stringdist, чтобы определить схожесть мешков слов. Из того, что я могу сказать, использование Jaccard только соответствует буквам внутри символьной строки.Jaccard сходство в пакете stringdist для сопоставления слов в строке символов

c <- c('cat', 'dog', 'person') 
d <- c('cat', 'dog', 'ufo') 

stringdist(c, d, method='jaccard', q=2) 
[1] 0 0 1 

Таким образом, мы видим, что он вычисляет сходство «кошки» и «кошка», «собака» и «собака» и «человека» и «УФО».

Я также попытался преобразовать слова в 1 длинную текстовую строку. Следующие подходы, что мне нужно, но он по-прежнему расчета 1 - (количество разделяемых 2-грамм/количество общего уникального 2-г):

f <- 'cat dog person' 
g <- 'cat dog ufo' 
stringdist(f, g, method='jaccard', q=2) 
[1] 0.5625 

Как бы я получить его, чтобы вычислить сходство словами?

+1

Пожалуйста, объясните, пожалуйста, ваш желаемый результат. Первый экземпляр вычисляет разницу между каждым словом в порядке. Вас интересует сравнение двух пакетов слов (неупорядоченных множеств)? – lmo

ответ

3

Вы можете начать с тонирования предложения и хэширования соответствующего списка слов, чтобы преобразовать ваши предложения в список целых чисел, а затем использовать seq_dist() для расчета расстояния.

library(hashr); library(stringdist) 
f <- 'cat dog person' 
g <- 'cat dog ufo' 
seq_dist(hash(strsplit(f, "\\s+")), hash(strsplit(g, "\\s+")), method = "jaccard", q = 2) 
[1] 0.6666667 
+0

Эта мера также может быть достигнута в первом примере OP: 'wordSim <- 1 - stringdist (c, d, method = 'jaccard', q = 2); sum (wordSim)/length (wordSim) '. – lmo

+0

Я думаю, что пример OP дает, да. Но обычно это может быть неверно. Рассмотрим этот пример 'c <- c ('cat', 'dog', 'person'); d <- c ('cat', 'dog', 'on'); stringdist (c, d, method = 'jaccard', q = 2); [1] 0.0000000 0.0000000 0.8571429' – Psidom

+0

Это интересные предложения. Спасибо. Сначала я рассматривал пакет stringdist как более быструю альтернативу простому вычислению Jaccard similartiy вручную: 'c <- c ('cat', 'dog', 'person') d <- c ('cat', 'dog' , 'ufo') length (intersect (c, d))/length (union (c, d)) '. Похоже, этот простой метод является лучшим. Интересно отметить, что у этого есть 1 для наивысшего сходства, тогда как для формулы строкового разряда 0 для наибольшего сходства. –

Смежные вопросы