Кластеризация похожих слов с использованием R - PullRequest
0 голосов
/ 13 января 2019

Я работаю с R У меня есть два кадра данных. Один содержит 200000 слов, таких как «кошка», «кошки», «cts», «собаки» и «собака», а другой содержит слова, такие как «кошка» и «собака».

Я хочу сгруппировать первый фрейм данных и заменить все подобные слова словом, которое умещается во втором фрейме данных. Например, «кошки» и «ктс» стали «кошками».

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Спасибо за ваш вопрос!

В настоящее время я нахожусь вне своего дома и набираю предложенное решение на своем iPhone, но я применю его к вашему примеру, когда буду дома.

Способ преобразования аналогичных значений - использование функции agrep. Вам не нужен какой-либо пакет, он уже находится в R.

Пожалуйста, оставьте комментарий, если вам нужны конкретные примеры:)

Вот функциональность:

agrep(pattern, x, max.distance = 0.1, costs = NULL, ignore.case = FALSE, 
      value = FALSE, fixed = TRUE, useBytes = FALSE)
0 голосов
/ 13 января 2019

Как уже упоминалось @ G5W, задача требует ввода данных пользователем. Вот пример того, как это можно сделать

# we have here pre-defined choices: any match must out of 'animals'
animals <- c('cat','dog','mouse')
# here is the text we want to match
text <- c('cats', 'cuts', 'dogs', 'dawg', 'frog', 'lion')
# now we use the string distance metric
# via the package stringdist & using metric 'jw'
# c.f. ?stringdist::stringdist
vapply(seq_along(text), 
       function (k) animals[which.min(stringdist::stringdist(text[k], animals, 'jw'))], 
       character(1))
# [1] "cat" "cat" "dog" "dog" "dog" "dog"

Обратите внимание, что, например, lion соответствует dog, так как это наиболее близкое соответствие.

Чтобы дополнительно проиллюстрировать замечания, сделанные в разделе комментариев, рассмотрим следующее

stringdist::stringdist('cts', c('cats','cuts'), 'jw')
# [1] 0.08333333 0.08333333

Слово cts равноудалено от cats и cuts. Предположим, что два слова содержатся в соответствующей таблице animals, тогда в этом случае which.min вернет (по умолчанию) первый экземпляр минимального значения, поэтому мы получим cats.

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

...