Text Mining с использованием нечеткого сопоставления Jaro-Winkler в R

Я пытаюсь сделать некоторое сопоставление расстояний в R и пытаюсь добиться полезного результата.

У меня есть датафрейм terms который содержит 5 строк текста, а также категорию для каждой строки. У меня есть второй датафрейм notes который содержит 10 плохо написанных слов, а также NoteID.

Я хочу иметь возможность сравнить каждый из моих 5 terms против каждого из моих 10 notes используя алгоритм расстояния, чтобы попытаться захватить простые орфографические ошибки. Я пытался:

near_match<- subset(notes, jarowinkler(notes$word, terms$word) >0.9)

   NoteID    Note
5      e5 thought
10     e5   tough

а также

jarowinkler(notes$word, terms$word)

[1] 0.8000000 0.7777778 0.8266667 0.8833333 0.9714286 0.8000000 0.8000000 0.8266667 0.8833333 0.9500000

Первый экземпляр - это почти то, что мне нужно, просто не хватает слова terms это вызвало матч. Вторая возвращает 10 баллов, но я не уверен, что алгоритм проверил каждый из 5 terms против каждого из 10 notes в свою очередь и просто вернул ближайший матч (наибольшее количество очков) или нет.

Как я могу изменить вышеупомянутое, чтобы достигнуть моего желаемого результата, если то, что я хочу, достижимо, используя jarowinkler() или есть лучший вариант?

Я относительно новичок в R, поэтому я благодарен за любую помощь в углублении моего понимания того, как алгоритм генерирует оценки и каков будет подход для достижения желаемого результата.

пример данных ниже

Спасибо

> notes
   NoteID    word
1      a1     hit
2      b2     hot
3      c3   shirt
4      d4    than
5      e5 thought
6      a1     hat
7      b2     get
8      c3   shirt
9      d4    than
10     e5   tough

> terms
  Category   word
1        a    hot
2        b    got
3        a   shot
4        d   that
5        c though

1 ответ

Решение

Ваши data.frames:

notes<-data.frame(NoteID=c("a1","b2","c3","d4","e5","a1","b2","c3","d4","e5"),
                  word=c("hit","hot","shirt","than","thought","hat","get","shirt","that","tough"))
terms<-data.frame(Category=c("a","b","c","d","e"),
                  word=c("hot","got","shot","that","though"))

использование stringdistmatrix (пакет stringdist) методом "jw" (jarowinkler)

library(stringdist)
dist<-stringdistmatrix(notes$word,terms$word,method = "jw")
row.names(dist)<-as.character(notes$word)
colnames(dist)<-as.character(terms$word)

Теперь у вас есть все расстояния:

dist
              hot       got       shot       that     though
hit     0.2222222 0.4444444 0.27777778 0.27777778 0.50000000
hot     0.0000000 0.2222222 0.08333333 0.27777778 0.33333333
shirt   0.4888889 1.0000000 0.21666667 0.36666667 0.54444444
than    0.4722222 1.0000000 0.50000000 0.16666667 0.38888889
thought 0.3571429 0.5158730 0.40476190 0.40476190 0.04761905
hat     0.2222222 0.4444444 0.27777778 0.08333333 0.50000000
get     0.4444444 0.2222222 0.47222222 0.47222222 0.50000000
shirt   0.4888889 1.0000000 0.21666667 0.36666667 0.54444444
that    0.2777778 0.4722222 0.33333333 0.00000000 0.38888889
tough   0.4888889 0.4888889 0.51666667 0.51666667 0.05555556

Найти слово ближе к заметкам

output<-cbind(notes,word_close=terms[as.numeric(apply(dist, 1, which.min)),"word"],dist_min=apply(dist, 1, min))
output
       NoteID    word word_close   dist_min
    1      a1     hit        hot 0.22222222
    2      b2     hot        hot 0.00000000
    3      c3   shirt       shot 0.21666667
    4      d4    than       that 0.16666667
    5      e5 thought     though 0.04761905
    6      a1     hat       that 0.08333333
    7      b2     get        got 0.22222222
    8      c3   shirt       shot 0.21666667
    9      d4    that       that 0.00000000
    10     e5   tough     though 0.05555556

Если вы хотите, чтобы в word_close были слова под определенным пороговым расстоянием (в данном случае 0.1), вы можете сделать это:

output[output$dist_min>=0.1,c("word_close","dist_min")]<-NA
output
   NoteID    word word_close   dist_min
1      a1     hit       <NA>         NA
2      b2     hot        hot 0.00000000
3      c3   shirt       <NA>         NA
4      d4    than       <NA>         NA
5      e5 thought     though 0.04761905
6      a1     hat       that 0.08333333
7      b2     get       <NA>         NA
8      c3   shirt       <NA>         NA
9      d4    that       that 0.00000000
10     e5   tough     though 0.05555556
Другие вопросы по тегам