2015-03-05 2 views
1

Я ищу быстрое решение в R для определения расстояния редактирования текста на уровне слова между двумя предложениями. В частности, я хочу определить минимальное количество дополнений, замещений или исключений слов, чтобы преобразовать предложение A в предложение B. Например, если предложение A является «очень хорошим автомобилем», а предложение B - «красивый красный автомобиль», результат должно быть 2 (1 удаление и 1 дополнение).Расстояние между двумя предложениями на уровне слова в R

Я знаю, что существуют существующие решения в R для расстояния редактирования уровня символа (например, родные adist() и stringdist() из пакета 'stringdist'), но я не нашел ни одного словарного уровня.

ответ

2

Как насчет

intersect(strsplit(levels(factor("very nice car"[1]))," ")[[1]],strsplit(levels(factor("nice red car"[1]))," ")[[1]])

> [1] "nice" "car"

length(intersect(strsplit(levels(factor("very nice car"[1]))," ")[[1]],strsplit(levels(factor("nice red car"[1]))," ")[[1]]))

> [1] 2

Конечно, вы можете сделать свою собственную функцию, которая работает даже с list:

my_function <- function (x, prsep = " ") 
{ 
    if (isTRUE(length(x) != 0) == TRUE && isTRUE(is.na(x)) == 
     FALSE) { 
     if (isTRUE(is.list(x)) == TRUE) { 
      for (i in 1:length(x)) ifelse(isTRUE(length(x[[i]]) != 
       0) == TRUE, x[[i]] <- strsplit(x[[i]], prsep)[[1]], 
       NA) 
      return(x) 
     } 
     else if (isTRUE(is.list(x)) == FALSE) { 
      Lt <- list() 
      for (i in 1:length(x)) Lt[[length(Lt) + 1]] <- strsplit(levels(factor(x[i])), 
       prsep)[[1]] 
      return(Lt[[1]]) 
     } 
    } 
    else { 
    x 
    } 
} 

Так что вам просто нужно

intersect(my_function("very nice car"," "), my_function("nice red car"," "))

+0

К сожалению, пересечение двух предложений не то же самое, как расстояние на уровне слова. Например, если str1 <- «этот красный автомобиль имеет низкое потребление», а str2 <- «этот красивый красный автомобиль имеет низкий пробег» Пересечение этих двух предложений составляет 5, а расстояние между словами - 2 (1 замещение и 1 дополнение) – JackONeill

+1

Это правда. Однако пересечение и функция помогают: inter <- intersect (my_function (str1, ""), my_function (str2, "")) my_function (str1, '') [which (! (My_function (str1, '') % in% inter))] дает '> [1]« потребление »и ' my_function (str2, '') [который (! (my_function (str2, '')% in% inter))] дает '> [1]« nice »« пробег »' Таким образом, вы можете иметь расстояние 'max (length (my_function (str1, '') [который (! (My_function (str1, '')% in% inter)) ]), length (my_function (str2, '') [которая (! (my_function (str2, '')% in% inter))])) 'которая равна '> [1] 2' - – JARO

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

  • Нет связанных вопросов^_^