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

2024-06-17 13:06:02 发布

您现在位置:Python中文网/ 问答频道 /正文

R中有一个名为stringdistpackage,它包含计算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

第二个矢量中的距离是按矢量元素的字符而不是按整个矢量计算的:

^{pr2}$

我想得到上一个命令4的结果:因为需要4个替换(对应位置上的4个向量元素不同)。在这种情况下,我可以获取非0的值并对其进行计数,例如:r <- stringdist(a.vec, b.vec, method = "lv"); length(r[r!=0])。但在以下示例中不起作用:

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

我想得到上一个命令1的结果(在第一个向量的第一个位置插入2)。在

PS也有内置实现,但也不能处理大字符串(老实说,我不知道它是如何处理向量的,因为我不理解它的输出):

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)

有什么实现(最好是用python、perl或R)来满足我的需求吗?非常感谢你。在

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


Tags: 文件字符串元素距离矢量向量lengthmethod
1条回答
网友
1楼 · 发布于 2024-06-17 13:06:02

以下是解决内存问题的方法:

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

仍然需要使用paste将向量转换为字符串,因为这不是包自动假定的。大多数用例需要向量化操作。

请参阅下面的内容,以获取将它们视为字符串的方法:

^{pr2}$

相关问题 更多 >