CompanyName <- c('Kraft', 'Kraft Foods', 'Kfraft', 'nestle', 'nestle usa', 'GM', 'general motors', 'the dow chemical company', 'Dow')我想要任何一种:
CompanyName2
Kraft
Kraft
Kraft
nestle
nestle
general motors
general motors
Dow
Dow但是完全可以这样:
CompanyName2
1
1
1
2
2
3
3我看到了计算两个单词之间距离的算法,所以如果我只有一个奇怪的名字,我会将它与所有其他名字进行比较,并选择距离最小的一个。但是我有成千上万的名字,我想把它们都分组。
我对弹性搜索一无所知,但elastic包中的某个函数或其他函数能帮我解决这个问题吗?
很抱歉这里没有程序。我知道呀。但这远远超出了我的正常专业领域。
发布于 2016-03-31 04:18:48
解决方案:使用字符串距离
你在正确的轨道上。以下是一些R代码,可以帮助您入门:
install.packages("stringdist") # install this package
library("stringdist")
CompanyName <- c('Kraft', 'Kraft Foods', 'Kfraft', 'nestle', 'nestle usa', 'GM', 'general motors', 'the dow chemical company', 'Dow')
CompanyName = tolower(CompanyName) # otherwise case matters too much
# Calculate a string distance matrix; LCS is just one option
?"stringdist-metrics" # see others
sdm = stringdistmatrix(CompanyName, CompanyName, useNames=T, method="lcs") 让我们来看看。这些是使用最长公共子序列度量(尝试其他度量,例如cosine,Levenshtein)计算出的字符串之间的距离。从本质上讲,它们都是衡量字符串共有多少个字符。它们的优缺点超出了这个问答的范围。你可能会发现,对于包含完全相同的子字符串的两个字符串(如dow),其相似度更高。
sdm[1:5,1:5]
kraft kraft foods kfraft nestle nestle usa
kraft 0 6 1 9 13
kraft foods 6 0 7 15 15
kfraft 1 7 0 10 14
nestle 9 15 10 0 4
nestle usa 13 15 14 4 0一些可视化效果
# Hierarchical clustering
sdm_dist = as.dist(sdm) # convert to a dist object (you essentially already have distances calculated)
plot(hclust(sdm_dist))

如果你想显式地分组到k个组中,可以使用k-medoids。
library("cluster")
clusplot(pam(sdm_dist, 5), color=TRUE, shade=F, labels=2, lines=0)

https://stackoverflow.com/questions/35691268
复制相似问题