R中向量元素的字符串元素之间的相似性度量

时间:2016-02-29 10:26:04

标签: r

我正在努力测量我测量字符串之间相似性的方法。 这种方法的作用是什么:

它测量每个字符串元素与 sentenceMatch 数据框中的另一个字符串元素之间的相似性。我正在使用 levenshteinSimFunction 进行字符串之间的相似性测量,这些字符串稍微纠正了 levenshteinDist 函数。

以下是我的方法。

sentenceMatch <- data.frame(Sentence=c("job not ready time window pmg inc gvu austin timedout pmg inc plm",
                                   "data delay hpsb unable deliver icon scp action required http hpedia osp",
                                   "job completed abnormally wwapo bw kili inc promaster",
                                   "job completed abnormally apo ww promaster net apoww abend apo ww",
                                   "error occurred launching job apo ww inc promaster net errorlaunching apo"))

sentenceMatch$Sentence <- as.character(sentenceMatch$Sentence)

overallMatrix <- matrix(, nrow = dim(sentenceMatch)[1], ncol = dim(sentenceMatch)[1]) # creating output matrix

for (k in 1:dim(sentenceMatch)[1]) {
    for (l in 1:dim(sentenceMatch)[1]) {
      ifelse(k == l, overallMatrix[k, l] <- 0, overallMatrix[k, l] <- levenshteinSimFunction(sentenceMatch[k, ], sentenceMatch[l, ]))
      if (overallMatrix[k, l] < .2) {overallMatrix[k, l] <- 0}
    }
  }

这导致了这些比较的矩阵,其中输出矩阵的每个元素表示 levenshteinSimFunction(sentenceMatch [k,],sentenceMatch [l,]),返回0之间的数字(相似度测量)和1。

levenshteinSimFunction = function (str1, str2) 
{
  if (str1 != "" && str2 != "") {
  return(1 - (levenshteinDist(str1, str2)/max(nchar(str1), 
                                          nchar(str2))))
  }
  else {return (0)}
}

> overallMatrix
          1         2         3         4         5
1 0.0000000 0.2394366 0.2615385 0.2307692 0.3055556
2 0.2394366 0.0000000 0.0000000 0.0000000 0.0000000
3 0.2615385 0.0000000 0.0000000 0.5156250 0.2916667
4 0.2307692 0.0000000 0.5156250 0.0000000 0.4444444
5 0.3055556 0.0000000 0.2916667 0.4444444 0.0000000

一切都按照我的期望工作,但由于两个for循环,我遇到了性能问题。

是否有另一个(更好的)解决方案如何避免这两个for循环并加快性能。

性能由高于2的组合数n驱动,其以指数方式增加处理时间,因此对于例如1000个句子,计算时间为257.97秒。在我的情况下,我有25k的句子。

1 个答案:

答案 0 :(得分:0)

您可以使用包stringdist。使用命令android:theme="@style/AppTheme.NoActionBar",您可以以矩阵形式计算stringdistance。其中一个选项是运行多线程,检查stringdistmatrix。在基本形式中,它的工作方式如下。

??stringdistmatrix