2015-08-27 3 views
1

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

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 

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

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

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

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

В принципе, как мне получить от матрицы расстояния до групповой переменной, не зная количества скоплений, которые мне бы хотелось?

+1

Этот вопрос, вероятно, слишком широк, но [это] (https://en.wikipedia.org/wiki/Soundex) может дать вам некоторые идеи, чтобы начать работу с. – joran

+1

... действительно, некоторые простые Googling приводят к пакет ** ** stringdist **, который может быть полезен. – joran

+0

Действительно - я, должно быть, только что вставил часть своего кода. Stringdistmatrix - это функция в пакете stringdist, которая генерирует расстояния между элементами. После этого у меня возникли проблемы с кластеризацией на расстоянии, но я думаю, что Хак ниже показал отличный пример, с которым я могу работать. – Kath05

ответ

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); 

enter image description here

С уважением, huck

+0

Нет необходимости в точках с запятой в конце операторов R (если они не находятся на одной линии, конечно). – jlhoward

+0

Спасибо, Huck за то, что показал мне, как реализовать кластерный анализ для такого проекта. Похоже, что это будет работать с небольшой игрой! – Kath05

+0

@jlhoward Извините за рутину с точкой с запятой. Я старый хромирующий человек, который был утоплен в 90-х годах в perl и pascal code ;-) – huckfinn

3

Вы также можете использовать adist(...) в базе R для расчета расстояний Левенштейна и кластера на основе этого.

n<- c("Mary", "Mery", "Mari", "Joe", "Jo", "Joey", "Bob", "Beb", "Paul") 
d <- adist(n) 
rownames(d) <- n 
cl <- hclust(as.dist(d)) 
plot(cl) 

+0

Спасибо. Для того, что я делаю, мне нравится возможность выбирать мои дистанционные методы, которые позволяет использовать stringdist. В зависимости от списка имен я могу сгруппировать сначала фонетическим расстоянием (soundex), а затем другим. Это потому, что я думаю, что некоторые из имен, с которыми я работаю, будут транслитерированы с другого языка и алфавита. – Kath05

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

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