繁体   English   中英

在Python中比较两大字符串的最佳方法

[英]Best way to compare two large sets of strings in Python

我正在使用Python(并且可以访问pandas,numpy,scipy)。

我有两组字符串设置A和设置B.每组A和B包含c。 2000个元素(每个元素都是一个字符串)。 字符串长约50-100个字符,最多为c。 20个单词(这些集可能会变得更大)。

我想检查集合A的成员是否也是集合B的成员。

现在我认为一个天真的实现可以被视为一个矩阵,其中A和B中的成员相互比较(例如A1 == B1,A1 == B2,A1 == B3等等......)和布尔值来自比较的(0,1)包括矩阵的元素。

有效实施此方法的最佳方法是什么?

两个进一步的阐述:

(i)我也在考虑对于较大的集合,我可以使用Bloom Filter(例如使用PyBloom,pybloomfilter)来散列每个字符串(即我不介意那么多正面...)。 这是一个好方法还是我应该考虑其他策略?

(ii)我正在考虑在字符串之间包含Levenshtein距离匹配(我知道它可能很慢)因为我可能需要模糊匹配 - 有没有办法将它与(i)中的方法相结合或以其他方式使其更有效?

在此先感谢您的帮助!

首先,2000 * 100字符不是那么大,你可以直接使用一套。

其次, 如果你的字符串是排序的 ,有一种快速的方法(我在这里找到)来比较它们,如下所示:

def compare(E1, E2):
    i, j = 0, 0
    I, J = len(E1), len(E2)
    while i < I:
        if j >= J or E1[i] < E2[j]:
            print(E1[i], "is not in E2")
            i += 1
        elif E1[i] == E2[j]:
            print(E1[i], "is in E2")
            i, j = i + 1, j + 1
        else:
            j += 1

它肯定比使用set慢,但它不需要将字符串保存到内存中(同时只需要两个字符串)。

对于Levenshtein来说,有一个C模块可以在Pypi上找到,而且速度非常快。

如评论中所述:

def compare(A, B):
    return list(set(A).intersection(B))

这是@michaelmeyer在这里提供的函数的修改版本https://stackoverflow.com/a/17264117/362951 - 在我们所在页面顶部的问题回答中。

下面的修改版本也适用于未排序的数据,因为该功能现在包括排序。

在许多情况下,这不应该是性能或资源问题,因为python排序非常有效。 预先分配也有帮助。

请注意,'输出'现在也按排序顺序排列。 如果未排序,这将与第一个参数的原始顺序不同。

否则排序不会受到太大影响,即使两个数据集都已经排序。

但是如果要抑制排序,如果已知两个数据集都按升序排序,请按以下方式调用它:

compare(my_data1,my_data2,data_is_sorted=True)

除此以外:

compare(my_data1,my_data2)

并且该函数接受无序数据。

这是修改后的版本。 只添加了前两行和第三个可选参数:

def compare(E1, E2, data_is_sorted=False):
    if not data_is_sorted:
        E1=sorted(E1)
        E2=sorted(E2)
    i, j = 0, 0
    I, J = len(E1), len(E2)
    while i < I:
        if j >= J or E1[i] < E2[j]:
            print(E1[i], "is not in E2")
            i += 1
        elif E1[i] == E2[j]:
            print(E1[i], "is in E2")
            i, j = i + 1, j + 1
        else:
            j += 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM