Вычисление сходства между двумя векторами / строками в R - PullRequest
0 голосов
/ 21 октября 2019

Это может быть похожий вопрос, заданный на этом форуме, но я чувствую свое требование особенным. У меня есть фрейм данных df1, в котором он состоит из переменной «WrittenTerms» с 40 000 наблюдений, и у меня есть еще один фрейм данных df2 с переменной «RecommendedTerms» с 17 000 наблюдений

Мне нужно вычислить сходство между «письменным термином»и "рекомендуемые термины"

df1 $ WrittenTerms

боль в голове

рак легкого

боль в животе

df2 $ рекомендуемые термины

сердечный приступ

рак молочной железы

боль в животе

головная боль

рак легкого

Мне нужно получитьвывод следующим образом

df1 $ WrittenTerms df2 $ рекомендуемые термины Similarity_percentage

головная боль головная боль 50%

рак легких 100%

боль в животе боль в животе 80%

Я пишу приведенный ниже код, чтобы выполнить требование, но это занимает больше времени, так как оно связано с циклом и есть ли способ найти сходство с помощью TF IDFИЛИ любой другой подход, который будетзаймет меньше времени

df_list <- data.frame(check.names = FALSE) # Creating empty dataframe

# calculating similarity between strings.

for(i in df1$WrittenTerms){
  df2$oldsim<- stringdist(i,df2$suggestedterms,method = "lv")
  df2$oldsim <- 1 - df2$oldsim / nchar(as.character(df2$suggestedterms))
  df2 <- head(df2[order(df2$oldsim, decreasing = TRUE),],1)
  df_list <- rbind(df_list, df2)
}

df1 <- cbind(df1, df_list)

1 Ответ

0 голосов
/ 21 октября 2019

Функция adist базовой библиотеки дает Левенштейну расстояния между двумя массивами, возвращая матрицу расстояний для каждой пары записей. Вы можете написать функцию, которая преобразует метрику Левенштейна в ваше преобразование:

my_dist <- function(x, y) 1 - adist(x, y) / nchar(y)
x <- my_dist(df1$WrittenTerms, df2$suggestedterms)

Теперь получите максимальное значение вашей метрики для каждой строки x, которое будет наилучшим suggestedterm для каждой WrittenTerms:

mx <- apply(x, 1, function(y) {mx <- which.max(y); c(y[mx], mx)})

Ваш конечный желаемый фрейм данных может быть построен следующим образом:

data.frame(Written.Terms = df1$WrittenTerms, 
           suggestedterms = df2$suggestedterms[mx[2, ]], 
           Similarity_percentage = mx[1, ])
...