2

对于我的数据分析问题,我通常需要规范名称,即名称 A 和 B,如果 A 和 B 共享大量公共子字符串,无论这些子字符串的顺序如何,我都会认为它们相同或非常相似。

例如,对于 "COLD" 和 c("FLOOD", "COLD/WIND CHILL"),我想选择 "COLD/WIND CHILL" 更类似于 "COLD" 而不是 "FLOOD"。

我目前的任务是在 R 中。所以我的具体问题如下:

  1. R中是否已经定义了这样的指标?

  2. 是否可以提供我自己的实现并以某种方式与 R 的 stringdist 包集成?

对于我的要求,我可以简单地使用正则表达式搜索,只要我能在 B 中找到 A 或在 A 中找到 B,我可以认为它们的距离为 0。

非常感谢!

编辑:

在以下情况下:

> vv <- c("FLOOD", "COLD/WIND CHILL")
> sapply(vv, adist, y = "COLD")
          FLOOD COLD/WIND CHILL 
              3              11 

我希望从“COLD”到“COLD/WIND CHILL”的距离小于“COLD”到“FLOOD”。

在找到匹配的子字符串后,指标似乎必须忽略要删除的剩余部分。

编辑1:

我原来的问题已经解决了。以下是在 R中使用amatchof的相关问题的跟进:stringdist

在我看来,我无法重现与 . 相同的结果adist,甚至无法stringdist在与amatch.

下面是插图:

vv <- c("FLOOD", "COLD/WIND CHILL")
sapply(vv, adist, y = "COLD",costs=list(deletions=0))
          FLOOD COLD/WIND CHILL 
              2               0 

    stringdist("COLD", c("FLOOD", " COLD/WIND CHILL"), method = 'lv', weight=c(0.001, 0.99, 0.99, 0.99))
[1] 1.981 1.002

amatch("COLD", c("FLOOD", " COLD/WIND CHILL"), method = 'lv', weight=c(0.0001, 0.999, 0.999, 0.999), maxDist = 100)
[1] 1

在上述上下文中,通过使用 的计算stringdistamatch应该返回2,而不是1

基于stringdist的文档,

“权重:
对于method='osa'或'dl',删除、插入、替换和转置的惩罚,依此顺序。当method='lv'时,转置的惩罚被忽略。”

我相应地选择了权重以消除对删除的惩罚,同时最大化对其他操作的惩罚。令人鼓舞的是stringdist,使用权重设置显示了预期的行为。

我假设这amatch将用于进行计算,但与 ! 的行为相矛盾的行为stringdist似乎很奇怪!amatchstringdist

我希望开始amatch工作,这样我就不必使用adistor重新实现它stringdist

再次感谢您的帮助。

4

2 回答 2

2

您可以adist用于模糊距离。该距离是广义的 Levenshtein 距离。

vv <- c("COLD","FLOOD")
sapply(vv,adist,y="COLD/WIND CHILL")
## COLD FLOOD   
##  11    13    ## the distance to COLD < distance to FLOOD

OP更新后编辑:

您可以使用costs参数来设置如何计算距离:删除、替换、插入。这里例如:

sapply(vv, adist, y = "COLD",costs=list(deletions=0))
  FLOOD COLD/WIND       CHILL 
          2               0 
于 2015-03-14T10:26:45.200 回答
1

这是一个追求的方向。基本上,它打算将您的文本分解为三元组(三个字母的序列)并返回每个三元组与所有其他三元组之间的关联,如果它们达到您设置的水平(此处为 0.8)。问题是这段代码只能在单词级别上工作,而不是应该在三元组上工作。也许如果文本文件更大会有所不同?

library(tm)
library("RWeka")
text <- c("FLOOD", "COLD/WIND CHILL", "OLD", "FRIGID", "FLOW") 

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))

corpus <- Corpus(VectorSource(text))

tdm <- TermDocumentMatrix(corpus, control = list(tokenize = BigramTokenizer))

lapply(tdm$dimnames$Terms, function(x) findAssocs(tdm, x, 0.8))
于 2015-03-14T10:20:45.283 回答