【问题标题】:How to create groups of like sounding names in R?如何在 R 中创建发音相似的名称组?
【发布时间】:2015-08-27 20:22:31
【问题描述】:

我想根据所选名称的相似程度创建一个组变量。我已经开始使用 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)

显然,根据我使用的距离度量(我在上面建议了两个),这些组可能会略有不同,但我可能会选择其中一个来运行。

基本上,我如何在不知道我想要的聚类数量的情况下从距离矩阵到组变量?

【问题讨论】:

  • 这个问题可能太宽泛了,但this 可能会给你一些入门的想法。
  • ...确实,一些简单的谷歌搜索会导致一个 stringdist 包,这可能会有所帮助。
  • 确实——我一定只是粘贴了部分代码。 stringdistmatrix 是 stringdist 包中的一个函数,用于生成条目之间的距离。在那之后,我无法按距离进行聚类,但我认为下面的 Huck 提供了一个很好的例子,我可以使用。

标签: r grouping fuzzy-comparison stringdist


【解决方案1】:

您还可以在 base R 中使用adist(...) 来计算 Levenshtein 距离,并以此为基础进行聚类。

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

【讨论】:

  • 谢谢。对于我正在做的事情,我喜欢能够选择 stringdist 允许的距离方法。根据名称列表,我可能首先按语音距离(soundex)分组,然后按其他内容分组。这是因为我认为我正在使用的一些名称将从不同的语言和字母表音译而来。
【解决方案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);

问候哈克

【讨论】:

  • R 语句的末尾不需要分号(当然,除非它们在同一行)。
  • 感谢 Huck 向我展示了如何为这样的项目实施聚类分析。似乎只要稍微玩一下就可以了!
  • @jlhoward 很抱歉分号例程。我是一个跛脚的老人,在 90 年代被 perl 和 pascal 代码淹死 ;-)
  • @huckfinn @Kath05:如果使用 soundex 方法,如果两个单词转换为相同的 soundex 代码,则 stringdist 计算的距离为 0,否则为 1。因此,您可以使用name_group &lt;- phonetic(name) 直接获取您的姓名组。 (当然这不能应用到 Levenshtein 等其他方法。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
相关资源
最近更新 更多