首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串距离度量,它支持子字符串,并且与字序无关?

字符串距离度量,它支持子字符串,并且与字序无关?
EN

Stack Overflow用户
提问于 2015-03-14 09:33:38
回答 2查看 462关注 0票数 2

对于我的数据分析问题,我通常需要调整名称,即名称A和B,我认为它们是相同的或非常相似的,如果A和B共享大量的公共子字符串,而不管这些子字符串的顺序如何。

例如,对于“冷”和“c”(“洪水”、“冷/风冷”),我想选择“冷/风冷”来比“冷”更接近“冷”。

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

  1. 在R中是否已经定义了这样的度量?
  2. 是否有可能提供我自己的实现,并以某种方式与R的字符串包集成?

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

非常感谢!

编辑:

在以下方面:

代码语言:javascript
运行
复制
> vv <- c("FLOOD", "COLD/WIND CHILL")
> sapply(vv, adist, y = "COLD")
          FLOOD COLD/WIND CHILL 
              3              11 

我希望从“冷”到“冷/风冷”的距离比“冷”到“水”的距离小。

在找到匹配的子字符串之后,似乎度量必须忽略要删除的其余部分。

Edit1:

我原来的问题已经解决了。下面是在R中使用amatch of stringdist的相关问题的后续:

在我看来,我无法复制与adist相同的结果,甚至stringdist也无法复制到与amatch相同的包中。

下图如下:

代码语言:javascript
运行
复制
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

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

根据弦乐的文件,

“重量:

对于方法=‘osa’或'dl',按该顺序对删除、插入、替换和换位的惩罚。当方法=‘lv’时,换位的惩罚被忽略。“

我选择了相应的权重来删除惩罚,而将惩罚最大化到其他操作。令人鼓舞的是,stringdist通过设置权重来显示预期的行为。

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

我希望amatch能够正常工作,这样我就不必使用adiststringdist重新实现它。

再次感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-14 10:26:45

您可以使用adist来表示模糊距离。距离是一个广义Levenshtein距离。

代码语言:javascript
运行
复制
vv <- c("COLD","FLOOD")
sapply(vv,adist,y="COLD/WIND CHILL")
## COLD FLOOD   
##  11    13    ## the distance to COLD < distance to FLOOD

在OP更新后编辑:

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

代码语言:javascript
运行
复制
sapply(vv, adist, y = "COLD",costs=list(deletions=0))
  FLOOD COLD/WIND       CHILL 
          2               0 
票数 2
EN

Stack Overflow用户

发布于 2015-03-14 10:20:45

这是一个值得追求的方向。基本上,它打算将您的文本分解为trigram (三个字母的序列),如果它们达到您设置的级别(此处,0.8),则返回每个trigram与其他所有trigram之间的关联。问题是,这段代码只在单词级别上工作,而不是像它所期望的那样在trigram上工作。也许如果文本文件更大,就会有区别吗?

代码语言:javascript
运行
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29047424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档