2015-08-05 4 views
1

У меня есть одно предложение, где я хочу заменить только часть строки номером. Если мы имеем точное соответствие, функция gsub работает отлично.Приблизительное соответствие и замена в тексте R

gsub('great thing', 5555 ,c('hey this is a great thing')) 
gsub('good rabbit', 5555 ,c('hey this is a good rabbit in the field')) 

Но теперь у меня есть следующая проблема. Как я могу применить функцию нечеткого соответствия к строке, если в части строки есть ошибка?

gsub('great thing', 5555 ,c('hey this is a graet thing')) 
gsub('good rabbit', 5555 ,c('hey this is a goood rabit in the field')) 

Алгоритм должен понять, что «великая вещь» и «graet вещь» или «хороший кролик» и «GoooD Rabit» очень похожи и должна быть заменена на номере 5555. Лучше всего, если мы можем использовать Расстояние Jaro Winkler, чтобы найти приблизительное соответствие внутри строки, а затем заменить приблизительную подстроку. Мне нужен очень абстрактный алогритм, который может это сделать.

Любые идеи?

+0

Авось 'GSUB ('gr [ae] [ae] t thing', 5555, c ('hey this is graet thing')) ' – akrun

+1

' agrep' за победу! –

+0

ну, я думал о применении алгоритма с нечетким совпадением с расстоянием от jaro-миксера. Это возможно? – OAM

ответ

2

Некоторые agrep примеры:

agrep("lasy", "1 lazy 2") 
agrep("lasy", "1 lazy 2", max = list(sub = 0)) 
agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2) 
agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, value = TRUE) 
agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, ignore.case = TRUE) 

agrep находится в базе. Если вы загружаете stringdist, вы можете рассчитать расстояние до строки с помощью Jarro-Winkler с (как вы догадались) stringdist, или если вы ленивы, вы можете просто использовать ain или amatch. Для моих целей я предпочитаю использовать Damerau-Levenshtein (method="dl") больше, но ваш пробег может отличаться.

Просто убедитесь, чтобы прочитать как именно параметры алгоритма работы, прежде чем использовать его (т.е. установить ваш р, значение Q и MaxDist до уровней, которые делают смысл, учитывая то, что вы делаете)

+0

и как я могу заменить подстроку чем-нибудь, если обнаружено сходство? – OAM

+0

Это сложнее. Я бы, вероятно, использовал некоторые n-граммы строки поиска и сравнил ее с целевой строкой, вычисляя расстояние Левенштейна. Следите за тем, какой n-грамм это, и восстановите вектор с помощью переключателя gsub. Извините, не могу придумать пакет, который уже завершен. Возможно, tm или qdap? –

+0

Или посмотрите этот ответ на аналогичный вопрос, который я задал: http://stackoverflow.com/questions/31843171/position-of-approximate-substring-matches-in-r –

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

  • Нет связанных вопросов^_^