有利于子串且独立于词序的字符串距离度量?
String distance metrics that is in favor of substring, and word order independent?
对于我的数据分析问题,我通常需要规范名称,即名称 A 和 B,如果 A 和 B 共享大量公共子字符串,我会认为它们相同或非常相似,无论这些子串的顺序。
例如,对于 "COLD" 和 c("FLOOD", "COLD/WIND CHILL"),我想选择 "COLD/WIND CHILL" 以更类似于 "COLD" 而不是 "FLOOD"。
我目前的任务是在 R 中。所以我的具体问题如下:
R 中是否已经定义了此类指标?
是否可以提供我自己的实现并以某种方式与 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:
中使用 stringdist
的 amatch
的相关问题的跟进
在我看来,我无法重现与 adist
相同的结果,甚至无法在与 amatch
相同的包中重现 stringdist
的结果。
下图为:
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
应该 return 2
而不是 1
.
根据stringdist的文档,
"体重:
对于 method='osa' 或 'dl',按顺序删除、插入、替换和转置的惩罚。当method='lv'时,转置的惩罚被忽略。 “
我相应地选择了权重以消除对删除的惩罚,同时最大化对其他操作的惩罚。令人鼓舞的是 stringdist
显示了权重设置的预期行为。
我假设 amatch
会使用 stringdist
进行计算,但 amatch
的行为与 stringdist
的行为相矛盾似乎很奇怪!
我希望 amatch
可以正常工作,这样我就不必使用 adist
或 stringdist
重新实现它。
再次感谢您的帮助。
这是一个追求的方向。基本上,它打算将您的文本分解为三元组(三个字母的序列)和每个三元组与所有其他元组之间的 return 关联,如果它们达到您设置的级别(此处为 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))
可以使用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
对于我的数据分析问题,我通常需要规范名称,即名称 A 和 B,如果 A 和 B 共享大量公共子字符串,我会认为它们相同或非常相似,无论这些子串的顺序。
例如,对于 "COLD" 和 c("FLOOD", "COLD/WIND CHILL"),我想选择 "COLD/WIND CHILL" 以更类似于 "COLD" 而不是 "FLOOD"。
我目前的任务是在 R 中。所以我的具体问题如下:
R 中是否已经定义了此类指标?
是否可以提供我自己的实现并以某种方式与 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:
中使用stringdist
的 amatch
的相关问题的跟进
在我看来,我无法重现与 adist
相同的结果,甚至无法在与 amatch
相同的包中重现 stringdist
的结果。
下图为:
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
应该 return 2
而不是 1
.
根据stringdist的文档,
"体重:
对于 method='osa' 或 'dl',按顺序删除、插入、替换和转置的惩罚。当method='lv'时,转置的惩罚被忽略。 “
我相应地选择了权重以消除对删除的惩罚,同时最大化对其他操作的惩罚。令人鼓舞的是 stringdist
显示了权重设置的预期行为。
我假设 amatch
会使用 stringdist
进行计算,但 amatch
的行为与 stringdist
的行为相矛盾似乎很奇怪!
我希望 amatch
可以正常工作,这样我就不必使用 adist
或 stringdist
重新实现它。
再次感谢您的帮助。
这是一个追求的方向。基本上,它打算将您的文本分解为三元组(三个字母的序列)和每个三元组与所有其他元组之间的 return 关联,如果它们达到您设置的级别(此处为 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))
可以使用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