R字符串相似度矩阵

问题描述:

我忙于处理大量投诉数据的文本分析项目。数据的一个问题是你得到同一单词的多个同义词,例如,账单,计费,账单,账单等。通常我会创建一个词频列表并手动匹配显而易见的词,然后将主词应用回原始语料库以用于每个同义词实例,例如,账单,账单,账单 - >账单(因为它是所有账单相关的)。我有一个漂亮的代码,有人在这里帮助我。R字符串相似度矩阵

最近我一直在玩弄使用字符串距离算法的想法,通过识别可能的同义词来使我的生活更轻松。我正在使用stringdist软件包,但如何高效地实施测试,我感到很茫然。基本上我需要一个所有单词的矩阵,并在交叉点处使用stringdist函数的结果。

我使用stringdist功能如下:

library(stringdist) 
1 - stringdist('MARTHA','MATHRA',method='jw',p=0.1) 

给出了A,B,C的单词列表的0.955

那么的相似性得分,我想要去(值仅供参考):

a b c 
a 1 0.4 0.4 
b 0.4 1 0.4 
c 0.4 0.4 1 

其中交叉点是stringdist函数的结果。

备选地我也可以工作以:

a a 1 
a b 0.4 
a c 0.4 
b a 0.4 
b b 1 
b c 0.4 
c a 0.4 
c b 0.4 
c c 1 

与后者的唯一问题是重复的,例如a,b和b,a可以被消除,因为它会产生相同的结果。

所以聪明的R编码器,请帮助我。我想答案在矩阵函数中,但我不是一个好的R编码器。

干杯

+0

是否有可能订购的话,然后进行与对您的表规定第2列中的项目不能小于/低于第1列? – user2627717 2014-12-11 03:24:35

+0

我怀疑'stringdist'是矢量化的,所以你注定要慢速循环。假设你有'n'个词,并且对该函数调用'n *(n-1)/ 2'的速度太慢,那么在尝试减小问题大小时你必须有创意。例如,只能处理以相同字母开头的子组的单词。 – flodel 2014-12-11 03:35:17

+0

如果你想使用package'stringdist'那么为什么不使用'stringdistmatrix(...)'?另外,如果您对Levenshtein距离感到满意,则可以在基数R中使用'adist(...)'。 – jlhoward 2014-12-11 04:17:45

以便移除重复如上所述:

dist.mat.tab.sort <- t(apply(dist.mat.tab, 1, sort)) 
dist.mat.tab <- dist.mat.tab[!duplicated(dist.mat.tab.sort),] 

凡dist.mat.tab是熔融的距离矩阵

我建议你使用stemmer,你会发现它在tm包。如果需要使用距离测量,则可以使用余弦相似度而不是Jaro-winkler。