2015-12-14 4 views
0

Допустим, у меня есть следующие слова:Использование stringdist в R

word1 = 'john lennon' 
word2 = 'john lenon' 
word3 = 'lennon john' 

Ее почти ясно, что эти 3 слова ВЕ и тому же человеку. Имея следующий код:

library(stringdist) 
>stringdist('john lennon','john lenon',method = 'jw') 
[1] 0.06363636 
>stringdist('john lennon','lennon john',method = 'qgram') 
[1] 0 
>stringdist('john lennon','lennon john',method = 'jw') 
[1] 0.33 
>stringdist('john lennon','john lenon',method = 'qgram') 
[1] 1 

Его ясно, что в этом примере, что qgram работает лучше. Но это только тот случай. Мой вопрос в том, как я могу объединить эти два метода?

jw дает лучшие результаты, но не может «поймать» отмененные слова (в моем случае имя-фамилия с фамилией). Любой совет?

ответ

0

У меня была идея, которая вычислительно кажется дорогостоящим, но в по крайней мере, он дает неплохие результаты.

word1 = 'john lennon' 
word2 = 'john lenon' 
word3 = 'lennon john' 

Во-первых удалить пробелы:

word1b = gsub(' ','',word1) 
word2b = gsub(' ','',word2) 
word3b = gsub(' ','',word3) 

Заказать их в алфавитном порядке:

word1c = paste(sort(unlist(strsplit(word1b, ""))), collapse = "") 
word2c = paste(sort(unlist(strsplit(word2b, ""))), collapse = "") 
word3c = paste(sort(unlist(strsplit(word3b, ""))), collapse = "") 

И, наконец, использовать jw метод:

stringdist(word1c,word2c,method = 'jw') 
[1] 0.03333333 
stringdist(word1c,word3c,method = 'jw') 
[1] 0 
stringdist(word2c,word3c,method = 'jw') 
[1] 0.03333333 

удовлетворительных результатов. Недостаток: может иметь нежелательные результаты в словах малой длины.

+0

Если вы сравниваете количество символов, проще использовать stringdist (word1, word2, method = "qgram", q = 1), что не так дорого. –

-2

Мой совет - это двухуровневая схема, в которой вы сопоставляете слова на словах и «предложения» на «предложения», возможно, просто используя все комбинации слов.

Это зависит от вас, чтобы решить, разрешено ли удаление пробелов (johnlennon).

+0

Итак, конкретно, с примером OP? –

+0

@Pascal Вычислить общее расстояние с («john», «lennon») и («lennon», «john») –

+0

Пожалуйста, введите код. –

1

можно интегрировать «если» заявление, в котором будет выполняться метод jw тогда и только тогда, когда qgram не равен 0. т.е. if(stringdist(('john lennon','john lenon',method = 'qgram')!=0){stringdist('john lennon','john lenon',method = 'jw')}

+0

Спасибо за ответ. Но все равно не все дела. Например: 'stringdist ('john lennon', 'lenon john', method = 'qgram')', который не равен нулю с использованием qgram и имеет большое расстояние при использовании 'jw'. –

+0

Чтобы быть понятным, какой ответ вы хотели бы получить по этому делу: 'stringdist ('john lennon', 'lenon john')'? – Sotos

+0

Учитывая, что 'stringdist ('john lennon', 'john lenon', method = 'jw')' дает '0.06', значение' 0,1' для 'stringdist ('john lennon', 'lenon john')' будет будь честен. –

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