【问题标题】:R String similarity matrixR字符串相似度矩阵
【发布时间】:2014-12-11 03:20:35
【问题描述】:

我正忙于一个关于大量投诉数据的文本分析项目。数据的问题之一是您会得到同一个词的多个同义词,例如bill, billing, billed, bills 等。通常我会创建一个词频列表并手动匹配明显的词频列表,然后将主要词应用回每个同义词实例的原始语料库,例如billing, billed, bills -> bill(因为它都与账单相关)。我有一段漂亮的代码,这里有人帮助我。

最近我一直在尝试使用字符串距离算法通过识别可能的同义词来让我的生活更轻松。我正在使用 stringdist 包,但我不知道如何有效地实施测试。基本上我需要一个包含所有单词的矩阵,并在交叉处是 stringdist 函数的结果。

我使用stringdist函数如下:

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

相似度得分为 0.955

所以我想从 a,b,c 的单词列表中得到(纯粹是指示性的值):

   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 编码器。

干杯

【问题讨论】:

  • 是否可以对单词进行排序,然后按照第 2 列中的项目不能小于/低于第 1 列的规则制作成对表?
  • 我怀疑stringdist 是矢量化的,所以你注定要陷入缓慢的循环。假设您有 n 单词并且对函数进行 n*(n-1)/2 调用太慢,那么您将不得不在尝试减少问题大小时发挥创造力。例如,只处理以相同字母开头的子词组。
  • 如果你想使用包stringdist那么为什么不使用stringdistmatrix(...)??此外,如果您对 Levenshtein 距离感到满意,您可以在 base R 中使用 adist(...)
  • 您是否可以识别一些少量的关键词,然后使用 stringdistmatrix() 查找与这些关键词之一最小距离内的所有单词。例如,key

标签: r tm synonym stringdist


【解决方案1】:

如上所述删除重复项:

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 是融合的距离矩阵

【讨论】:

    【解决方案2】:

    我建议你使用词干分析器,你会在 tm 包中找到它。如果需要使用距离测量,那么您可以使用余弦相似度而不是 Jaro-winkler。

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 2022-01-12
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多