我开始构建一个文本相似性项目,在这个项目中,我获取一个名称列表(100,000+记录),并在较大的文本(文档)中找到最佳匹配。我已经使用过rapidfuzz和fuzzyset库来成功地做到这一点,我想看看是否有更快的方法来满足我的特定用例。使用三元语法和散列三元语法字符串。为了提高性能,我希望尽可能地避免循环(Pythonic)。下面是一个代码片段示例,其中a可能是文档的三元表示法,b可能是一个名称的表示法。
import numpy as np
a = np.array([(1,2,3), (1,3,3), (3,3,3), (3,3,4)])
b = np.array((1,2,3))
print(np.sum(a == b))输出是6,但希望它是3,2,1,0,或者只是最大结果3。
编辑:
在更详细地研究这个问题时,元组的静态长度对于不同长度的名称不起作用。例如,MATTHEW表示为(MAT,ATT,TTH,THE,HEW),而CALEB表示为(CAL,ALE,LEB)。
当前的想法是,最好将文档分解为带有滑动窗口的三元组。或者是列表中所有名称的最大长度,或者是当前正在搜索的名称的大小。欢迎任何想法
发布于 2021-10-27 12:33:00
您可以使用axis参数
>>> np.sum(a==b, axis=1)
array([3, 2, 1, 0])这将跨行求和,并返回一个一维数组。然后,要获得最大值,可以使用以下两种方法之一。
>>> np.max(np.sum(a==b, axis=1))
3
>>> np.sum(a==b, axis=1).max()
3发布于 2021-10-27 12:35:25
由于您希望计算非零值,因此一种替代方法是使用np.count_nonzero
import numpy as np
a = np.array([(1, 2, 3), (1, 3, 3), (3, 3, 3), (3, 3, 4)])
b = np.array((1, 2, 3))
res = np.count_nonzero(a == b, axis=1)
print(res)输出
[3 2 1 0]之后,可以使用.max找到最大值
res.max() # 3对于不是很小的数组,这两种方法似乎在速度方面具有可比性,请参见下面的(不是非常彻底的)比较:
import numpy as np
a = np.array([(1, 2, 3), (1, 3, 3), (3, 3, 3), (3, 3, 4)] * 1000)
b = np.array((1, 2, 3))
%timeit np.count_nonzero(a == b, axis=1)
110 µs ± 744 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.sum(a == b, axis=1)
108 µs ± 379 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)https://stackoverflow.com/questions/69738706
复制相似问题