Python Levenshtein实现能够处理大型字符串和向量

Python Levenshtein实现能够处理大型字符串和向量,python,r,perl,levenshtein-distance,stringdist,Python,R,Perl,Levenshtein Distance,Stringdist,R中有一个名为stringdist,其中包含用于计算Levenshtein字符串距离的函数。我对这个软件包有两个问题: 1st它不适用于大字符串,例如: set.seed(1) a.str <- paste(sample(0:9, 100000, replace = T), collapse="") set.seed(2) b.str <- paste(sample(0:9, 100000, replace = T), collapse="") stringdist(a.str,

R中有一个名为
stringdist
,其中包含用于计算Levenshtein字符串距离的函数。我对这个软件包有两个问题:

1st它不适用于大字符串,例如:

set.seed(1)
a.str <- paste(sample(0:9, 100000, replace = T), collapse="")

set.seed(2)
b.str <- paste(sample(0:9, 100000, replace = T), collapse="")

stringdist(a.str, b.str, method = "lv")
# THE LAST COMMAND RESTARTS R SESSION
是否有任何实现(最好是python、perl或R)能够满足我的需求?多谢各位


PPS我有多个文件,其中每行包含1~500的数字(这就是为什么我需要将例如347视为一个元素,而不是由3,4,7组成的字符串,因为3,4,7是另一个单独的数字)。这些文件大约有250000行。我想知道这些文件彼此有多相似。我想10k*10k的尺寸才是问题所在。但是提到了Levenshtein算法,它只使用2*10k大小(如果两个字符串都是10k长的)。我想诀窍在于它只计算结果,而忘记了结果是如何计算的,但这对我来说是可以的。汉明距离对我来说是不够的,因为我需要考虑插入、删除和替换,在汉明中,这两个字符串
1234567890
0123456789
完全不同,但在Levenshtein中,它们是相似的。

这里是内存问题的解决方案:

library(RecordLinkage)

set.seed(1)
a.str <- paste(sample(0:9, 100000, replace = T), collapse="")
set.seed(2)
b.str <- paste(sample(0:9, 100000, replace = T), collapse="")
levenshteinDist(a.str, b.str)
[1] 73969

100000*100000是10GB。不确定你的目标是什么。为什么要对如此大的字符串计算
stringdist
?例如,
method=JW
stringdist
中的相同两个字符串生成一个结果。算法是不同的,不需要平方内存。至于向量化方法的另一个问题
stringdist
,这对于大多数用例来说是一件非常好的事情。如果您确实不想将这两个输入视为向量,可以使用
stringdist(粘贴(a.vec,collapse='')、粘贴(b.vec,collapse='')、方法=“lv”)
这可能会有所帮助:@Gopala我可以,例如,在所有元素的前面加上零,然后得到,例如,
007
455
,但问题是,它甚至会增加已经很大的字符串,所以我想避免这种情况,而是使用向量。谢谢,我已经投了赞成票,但我仍然需要向量。请问你是怎么找到这个软件包的?我过去用它来链接记录,但我忘了。所以,重新加载并尝试。将进行编辑以添加矢量方面。希望这能满足您的需求。它并非在所有情况下都有效。在这里检查我的问题:
a.vec <- c(1, 2, 3)
b.vec <- c(1, 2, 2, 3)
stringdist(a.vec, b.vec, method = "lv")
# [1] 0 0 1 1
# Warning message:
# In stringdist(a.vec, b.vec, method = "lv") :
#   longer object length is not a multiple of shorter object length
adist(a.str,b.str, counts = T)
# Error in adist(a.str, b.str, counts = T) : 
#   'Calloc' could not allocate memory (1410265409 of 8 bytes)
library(RecordLinkage)

set.seed(1)
a.str <- paste(sample(0:9, 100000, replace = T), collapse="")
set.seed(2)
b.str <- paste(sample(0:9, 100000, replace = T), collapse="")
levenshteinDist(a.str, b.str)
[1] 73969
a.vec <- c(1, 2, 3, 4, 5, 666)
b.vec <- c(1, 2, 4, 3, 6, 777)
levenshteinDist(paste(a.vec, collapse = ''), paste(b.vec, collapse = ''))
[1] 5