我正在使用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)中的方法相结合或以其他方式制作它效率更高?
提前感谢您的帮助!
答案 0 :(得分:5)
首先,2000 * 100个字符很大,你可以直接使用一套。
其次,如果您的字符串已排序,有一种快速方式(我发现here)来比较它们,如下所示:
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上找到,而且速度非常快。
答案 1 :(得分:1)
如评论中所述:
def compare(A, B):
return list(set(A).intersection(B))
答案 2 :(得分:0)
这是@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