列表中更有效的字符串比较

时间:2019-02-15 14:11:55

标签: python list comparison fuzzywuzzy

我正在编写一个程序,以检测来自不同来源的大量文本中引用的法院案件,并计算每个文本中被引用多少次。问题源于大多数文件中的两个州存在案件的事实:在给定的案文中(例如“ Timothy Ivory Carpenter诉美利坚合众国”)完整引用了它们一次或两次,然后以较短的形式引用表格的其余部分(例如“ Carpenter诉美国”)。目前,我将标题附加到大量列表中,然后通过FuzzyWuzzy字符串相似性检测程序包运行列表。

现在,我每次都将每个变量与其他每个变量进行比较,这是非常低效的。我的问题是:有没有办法只运行尚未执行的比较?我知道我可以将列表切成两半并使其效率更高一些,但是我仍然会比较列表本身的1/2。我的另一个想法是创建一个已被比较的列表,并交叉引用每对及其镜像版本(即“ 1:5”和“ 5:1”),就处理时间而言,最终占34%比蛮力逼迫要慢。

if variable_list = ['1','2','3','4','5']

我现在正在做的是比较以下各项:

1:1 1:2 1:3 1:4 1:5
2:1 2:2 2:3 2:4 2:5
3:1 3:2 3:3 3:4 3:5
4:1 4:2 4:3 4:4 4:5
5:1 5:2 5:3 5:4 5:5

这很糟糕,我知道

有没有办法让python运行它呢?

问题的一部分是您不能仅仅检查 如果由于重叠而进行比较 支票是镜像的,不完全相同(即, 3:1是已经比较了1:3,而不是3:1)

我不喜欢自我介绍,但我包括了 因为我认为这将基于 检查比较是否完成。

1:1 1:2 1:3 1:4 1:5
2:2 2:3 2:4 2:5
3:3 3:4 3:5
4:4 4:5
5:5

代码:

for var_1 in variable_list:

    for var_2 in variable_list:

    ### The chunk below sets the parameters to filter the strings

        if fuzz.token_set_ratio(var_2_reg_filt, var_1_reg_filt) > 91:

            if fuzz.ratio(var_2_reg_filt, var_1_reg_filt) > 87:

                if fuzz.partial_ratio(var_2_reg_filt, var_1_reg_filt) > 87:

                    if fuzz.token_sort_ratio(var_2_reg_filt, var_1_reg_filt) > 83:

                        ### This code then removes the longer of the two strings
                        ### -- and replaces it with the shorter version

                        if (len(var_1_reg_filt)) > (len(var_2_reg_filt)):

                            <<< Code to Replace var_1 with var_2 >>>

                        if (len(var_1_reg_filt)) < (len(var_2_reg_filt)):

                            <<< Code to Replace var_1 with var_2 >>>

这不是一个“错误”代码问题,而是一个概念上的问题。我加入了代码来显示自己的工作:通过三个不同的过滤器运行var_1var_2的每个迭代以剔除闭合但不正确的匹配。

1 个答案:

答案 0 :(得分:1)

我假设您想使用变量组合,请参见itertools包中的combinations迭代器

import itertools
vars = ['1','2','3','4','5']
list(itertools.combinations(vars,2))
>>>
[('1', '2'),
 ('1', '3'),
 ('1', '4'),
 ('1', '5'),
 ('2', '3'),
 ('2', '4'),
 ('2', '5'),
 ('3', '4'),
 ('3', '5'),
 ('4', '5')]

如果需要将它们与自己进行比较,可以使用combinations_with_replacement

因此最终,您的循环应类似于

for var_1, var_2 in itertools.combinations(variable_list,2):
    ....