Струнное совпадение с R: поиск наилучшего возможного совпадения

У меня есть два вектора слов.

Corpus<- c('animalada', 'fe', 'fernandez', 'ladrillo')

Lexicon<- c('animal', 'animalada', 'fe', 'fernandez', 'ladr', 'ladrillo')

Мне нужно сделать наилучший возможный матч между Лексиконом и Корпусом. Я перепробовал много методов. Это одна из них.

library(stringr)

match<- paste(Lexicon,collapse= '|^') # I use the stemming method (snowball), so the words in Lexicon are root of words

test<- str_extrac_all (Corpus,match,simplify= T)

test

[,1]
[1,] "animal"
[2,] "fe"
[3,] "fe"
[4,] "ladr"

Но совпадение должно быть:

[1,] "animalada"
[2,] "fe"
[3,] "fernandez"
[1,] "ladrillo"

Вместо этого совпадение с первым словом в алфавитном порядке в моем лексиконе. Кстати, эти векторы являются образцом большего списка, который у меня есть.

Я не пробовал с regex(), потому что я не уверен, как это работает. Возможно, решение идет по этому пути.

Не могли бы вы помочь мне решить эту проблему? Спасибо за помощь.

3 ответа

Вы можете просто использовать match функция.

Index <- match(Corpus, Lexicon)

Index
[1] 2 3 4 6

Lexicon[Index]
[1] "animalada"  "fe"   "fernandez"  "ladrillo"

Я попробовал оба метода, и правильный подход был предложен @Psidorm. Если использовать функцию match() это найдет совпадение в любой части слова, не обязательно в начале. Например:

Corpus<- c('tambien')
Lexicon<- c('bien')
match(Corpus,Lexicon)

Результат - "тамбьен", но это не правильно.

Еще раз спасибо вам обоим за вашу помощь!!

Вы можете заказать Lexicon по количеству символов в шаблонах в порядке убывания, поэтому наилучшее совпадение идет первым:

match<- paste(Lexicon[order(-nchar(Lexicon))], collapse = '|^')

test<- str_extract_all(Corpus, match, simplify= T)

test
#     [,1]       
#[1,] "animalada"
#[2,] "fe"       
#[3,] "fernandez"
#[4,] "ladrillo" 
Другие вопросы по тегам