Как создать группы похожих по звучанию имен в R?

Я хотел бы создать групповые переменные на основе того, насколько похож выбор имен. Я начал с использования пакета stringdist для создания меры расстояния. Но я не уверен, как использовать эту выходную информацию для создания группы по переменной. Я посмотрел на hclust, но похоже, что для использования функций кластеризации вам нужно знать, сколько групп вы хотите в конце, а я этого не знаю. Код, с которого я начинаю, приведен ниже:

name_list <- c("Mary", "Mery", "Mary", "Joe", "Jo", "Joey", "Bob", "Beb", "Paul")

name_dist <- stringdistmatrix(name_list)
name_dist
name_dist2 <- stringdistmatrix(name_list, method="soundex")
name_dist2

Я хотел бы видеть фрейм данных с двумя столбцами, которые выглядят как

name = c("Mary", "Mery", "Mary", "Joe", "Jo", "Joey", "Bob", "Beb", "Paul")

name_group = c(1, 1, 1, 2, 2, 2, 3, 3, 4)

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

По сути, как мне перейти от матрицы расстояний к групповой переменной, не зная желаемого количества кластеров?


person Kath05    schedule 27.08.2015    source источник
comment
Этот вопрос, вероятно, слишком общий, но это может дать вам несколько идей для начала.   -  person joran    schedule 28.08.2015
comment
...действительно, простой поиск в Google приводит к пакету stringdist, который может оказаться полезным.   -  person joran    schedule 28.08.2015
comment
В самом деле -- должно быть, я только что вставил часть своего кода. stringdistmatrix — это функция в пакете stringdist, которая генерирует расстояния между записями. После этого у меня возникли проблемы с кластеризацией по расстоянию, но я думаю, что Гек ниже предоставил отличный пример, с которым я могу работать.   -  person Kath05    schedule 28.08.2015


Ответы (2)


Вы можете использовать кластерный анализ следующим образом:

# loading the package
require(stringdist);

# Group selection by class numbers or height 
num.class <- 5;
num.height <-0.5;

# define names 
n <- c("Mary", "Mery", "Mari", "Joe", 
       "Jo", "Joey", "Bob", "Beb", "Paul");

# calculate distances
d <- stringdistmatrix(n, method="soundex");

# cluster the stuff
h <- hclust(d);

# cut the cluster by num classes
m <- cutree(h, k = num.class);

# cut the cluster by height
p <- cutree(h, h = num.height);

# build the resulting frame
df <- data.frame(names = n, 
                 group.class = m, 
                 group.prob = p);

Он производит:

df;
   names group.class group.prob
1  Mary         1          1
2  Mery         1          1
3  Mari         1          1
4   Joe         2          2
5    Jo         2          2
6  Joey         2          2
7   Bob         3          3
8   Beb         4          3
9  Paul         5          4

И диаграмма дает вам общее представление:

plot(h, labels=n);

введите здесь описание изображения

С уважением, Гек.

person huckfinn    schedule 27.08.2015
comment
Нет необходимости в точках с запятой в конце операторов R (если они, конечно, не находятся в одной строке). - person jlhoward; 28.08.2015
comment
Спасибо, Гек, что показал мне, как реализовать кластерный анализ для такого проекта, как этот. Кажется, что это сработает, если немного поиграть! - person Kath05; 28.08.2015
comment
@jlhoward Извините за рутину с точкой с запятой. Я старый хромой человек, который в 90-х утонул в коде perl и pascal ;-) - person huckfinn; 28.08.2015
comment
@huckfinn @Kath05: Если вы используете метод soundex, расстояние, вычисляемое stringdist, равно 0, если два слова переводятся в один и тот же код soundex, и 1 в противном случае. Таким образом, вы можете получить свои группы имен напрямую, используя name_group <- phonetic(name). (Конечно, это нельзя применить к другим методам, таким как метод Левенштейна.) - person Scarabee; 18.04.2017