Вычислить сходство Жаккара между каждым словом в 2 векторах

Мне нужно рассчитать сходство Жаккара между каждым словом в двух векторах. Каждое слово за каждым словом. И извлеките наиболее похожее слово.

Вот мой плохой плохой медленный код:

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]

Пожалуйста, помогите мне улучшить и украсить этот код для большого фрейма данных.


person Dennix    schedule 25.11.2016    source источник
comment
Насколько велик размер и сколько времени занимает использование вашего кода?   -  person lukeA    schedule 25.11.2016
comment
Попробуйте это sapply(words.p, function(x) mapply(stringdist, words, x, method='jaccard')). Это напрямую даст вам матрицу, которую вы можете легко изучить.   -  person Chirayu Chamoli    schedule 25.11.2016


Ответы (1)


Подготовка (добавлено 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)]

Или в одну строку:

words[which.min(sapply(dists, min))]
person Karolis Koncevičius    schedule 25.11.2016
comment
Спасибо! Но я хочу получить только одно лучшее слово, в данном случае это быстро. Как его извлечь? - person Dennix; 25.11.2016
comment
@Dennix добавил строку о том, как это сделать в ответ (после РЕДАКТИРОВАТЬ) - person Karolis Koncevičius; 25.11.2016
comment
@KarolisKoncevičius, спасибо за ваше решение. Я искал что-то подобное, но для соответствия списку адресов. Итак, у меня есть набор данных, содержащий около 70 000 различных адресов, и еще один большой набор данных, содержащий около 4 записей об отсутствии (0,4 миллиона). Я хочу сопоставить каждый адрес с большим набором данных, глядя на слова адреса. Как я могу этого добиться? Я разместил вопрос по ссылке stackoverflow.com/questions/42486172/ Пожалуйста, помогите!! - person user1412; 04.03.2017