Python-基于相似性的名称成对列表(algo和practical)

Python-基于相似性的名称成对列表(algo和practical),python,algorithm,Python,Algorithm,我有一张25万人的名单。如果我使用itertools组合来获得唯一对的列表:(我的列表名为“内容”) 这将是250000的长度选择2,这是一个非常高的数字。对于每一对,我想计算一个我已经写过的文本相似性度量。有几个问题: a) 我是否应该将收益率语句与itertools方法一起使用来 创建生成器,因为我无法在内存中容纳那么多对?但在某些时候,要使用文本相似性函数,我需要将输出保存到内存或写入文件,不是吗 b) 这是否可以概括为一个更常见的问题,而我不是 知道吗?也许是稀疏矩阵 c) 是否有一些预

我有一张25万人的名单。如果我使用itertools组合来获得唯一对的列表:(我的列表名为“内容”)

这将是250000的长度选择2,这是一个非常高的数字。对于每一对,我想计算一个我已经写过的文本相似性度量。有几个问题:

a) 我是否应该将收益率语句与itertools方法一起使用来 创建生成器,因为我无法在内存中容纳那么多对?但在某些时候,要使用文本相似性函数,我需要将输出保存到内存或写入文件,不是吗

b) 这是否可以概括为一个更常见的问题,而我不是 知道吗?也许是稀疏矩阵

c) 是否有一些预处理步骤可以减少 名单

谢谢


Jeff

从您评论中的澄清来看,您似乎不应该无条件地打印这些对,而应该打印通过某些标准的对。比如说,

for lhs, rhs in itertools.combinations(content, 2):
    if dist(lhs, rhs) < thresh:
        print pair
用于itertools中的lhs和rhs。组合(内容2):
如果距离(左、右)小于阈值:
打印对
可能会大大缩小尺寸

请注意,在几乎没有内存的情况下,很容易找到对的数量:

sum((dist(lhs, rhs) < thresh) for lhs, rhs in itertools.combinations(content, 2))
sum(itertools中lhs、rhs的距离(lhs、rhs)
这可以给你一个这样的对数量的估计

如果数字太高,您可能需要随机抽样一些对。您可以对这些对进行统一采样,也可以对
lhs
进行统一采样,并跟踪映射到它们的所有
rhs
s。等等


我想在不进一步了解设置的情况下回答这个问题是可能的。

我最终使用了这个方法:我创建了一个生成器,以避免进程被读入内存

def pair_iter(somelist, n):
    for x in itertools.combinations(somelist, 2):
            if fuzz.partial_ratio(x[0], x[1]) > 90 and abs(len(x[0]) - len(x[1])) < 3:
                yield fuzz.partial_ratio(x[0], x[1]), x
def对(somelist,n):
对于itertools.组合中的x(somelist,2):
如果模糊部分比(x[0],x[1])>90且abs(len(x[0])-len(x[1]))小于3:
屈服模糊部分比(x[0],x[1]),x

:你为什么发现这对情侣之间有相似之处?你想解决什么?试图找到相似的值,然后检查高匹配率,看看它们是否是同一最终用户的变体。这将取决于你的相似性度量。有时你可以优化它,而在其他一些情况下,你不能,你实际上需要比较所有对。这完全取决于相似性函数。
def pair_iter(somelist, n):
    for x in itertools.combinations(somelist, 2):
            if fuzz.partial_ratio(x[0], x[1]) > 90 and abs(len(x[0]) - len(x[1])) < 3:
                yield fuzz.partial_ratio(x[0], x[1]), x