Струнное совпадение с 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"