R: Размито съпоставяне на низове с помощта на jarowinkler

Имам два вектора от тип символ в R.

Искам да мога да сравня референтния списък със списъка със сурови символи с помощта на jarowinkler и да присвоя % резултат за сходство. Така че, например, ако имам 10 референтни елемента и двадесет елемента необработени данни, искам да мога да получа най-добрия резултат за сравнението и това, с което алгоритъмът го е съпоставил (така че 2 вектора от 10). Ако имам необработени данни с референтни елементи с размер 8 и 10, трябва да завърша само с 2 векторен резултат от 8 елемента с най-добро съвпадение и резултат за елемент

артикул, кибрит, съвпадение_с лед, 78, сладолед

По-долу е моят код, който не е много за гледане.

NumItems.Raw = length(words)
NumItems.Ref = length(Ref.Desc)

for (item in words) 
{
  for (refitem in Ref.Desc)
  {
    jarowinkler(refitem,item)

    # Find Best match Score
    # Find Best Item in reference table
    # Add both items to vectors
    # decrement NumItems.Raw
    # Loop
  }
} 

person John Smith    schedule 17.03.2015    source източник
comment
Може би пакетът RecordLinkage и функция, която се изгражда от това? compareJW ‹- функция(низ, vec, прекъсване) { изискване(RecordLinkage) jarowinkler(низ, vec) › прекъсване}   -  person lawyeR    schedule 17.03.2015
comment
Какви са вашите критерии за съпоставяне, ако има множество най-добри съвпадения с един и същ резултат на jarowinkler? Избирате ли първото съвпадение или използвате произволна селекция от най-добрите съвпадения?   -  person    schedule 17.03.2015


Отговори (2)


Използване на пример за играчка:

library(RecordLinkage)
library(dplyr)

ref <- c('cat', 'dog', 'turtle', 'cow', 'horse', 'pig', 'sheep', 'koala','bear','fish')
words <- c('dog', 'kiwi', 'emu', 'pig', 'sheep', 'cow','cat','horse')

wordlist <- expand.grid(words = words, ref = ref, stringsAsFactors = FALSE)
wordlist %>% group_by(words) %>% mutate(match_score = jarowinkler(words, ref)) %>%
summarise(match = match_score[which.max(match_score)], matched_to = ref[which.max(match_score)])

дава

 words     match matched_to
1   cat 1.0000000        cat
2   cow 1.0000000        cow
3   dog 1.0000000        dog
4   emu 0.5277778       bear
5 horse 1.0000000      horse
6  kiwi 0.5350000      koala
7   pig 1.0000000        pig
8 sheep 1.0000000      sheep

Редактиране: Като отговор на коментара на OP, последната команда използва конвейерния подход от dplyr и групира всяка комбинация от необработените думи и препратките по необработените думи, добавя колона match_score с резултата на jarowinkler и връща само обобщение на най-високия резултат за съвпадение (индексиран от which.max(match_score)), както и препратката, която също е индексирана от максималния match_score.

person Community    schedule 17.03.2015
comment
Здравей Джим М. Благодаря ти за отговора, никога не знам за функцията expand.grid. Можете ли да ми обясните как работи последната команда? - person John Smith; 17.03.2015
comment
Благодаря @Jim M, успях да го накарам да работи с вашия код без никакви проблеми, но се сблъсках с проблема, очертан тук, което основно се свежда до използването на NSL в групата и функцията jarowinkler. Все пак ще си поиграя с него, отговорът ви е отличен и отвори нови области на R за мен... Благодаря ви много - person John Smith; 18.03.2015
comment
@Jim M мога ли да постигна това и за огромни кадри с данни? - person KRU; 12.05.2015
comment
@KRU: Зависи какво имаш предвид под огромно. Вярвам, че ограничението ще бъде data.frame от 2^31 - 1 реда, които могат да бъдат достъпни наведнъж, в противен случай може да се наложи данните да бъдат подразделени на части за анализ. - person ; 13.05.2015

Има пакет, който вече прилага разстоянието Jaro-Winkler.

> install.packages("stringdist")
> library(stringdist)
> 1-stringdist('ice','ice-cream',method='jw')
[1] 0.7777778
person Ken Yeoh    schedule 17.03.2015
comment
Здравей @Ken Yeoh, благодаря ти за отговора. Това по същество ми дава същото нещо като jarowinkler(refitem,item), но проблемът ми е, че ако имам много неща, към които да се позовавам, искам само да върне най-доброто съвпадение и процентното съвпадение. Така че имам 1 елемент, който искам да проверя, и 8 елемента, срещу които да го проверя, искам да мога да върна само един отговор, т.е. най-високото съвпадение и какво е това съвпадение в референтната таблица - person John Smith; 17.03.2015
comment
А, съжалявам, че не разбрах въпроса ви. Можете да направите това с stringdistmatrix, но мисля, че отговорът на @Jim M е по-лесен за изпълнение. - person Ken Yeoh; 17.03.2015