【问题标题】:More efficient string comparison in list列表中更有效的字符串比较
【发布时间】:2019-02-15 14:11:54
【问题描述】:

我正在编写一个程序来检测在来自不同来源的大量文本中引用的法庭案例,并计算每个文本在文本中被引用的次数。问题源于大多数文件中存在两个州的案例:在给定文本中完整引用一次或两次(即“Timothy Ivory Carpenter v. United States of America”),然后以较短的形式引用表格贯穿文件的其余部分(即“Carpenter v. U.S.”)。目前我正在将标题附加到一个庞大的列表中,然后通过 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_1 的每次迭代:var_2 通过三个不同的过滤器来剔除接近但不正确的匹配项。

【问题讨论】:

    标签: python list comparison fuzzywuzzy


    【解决方案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):
        ....
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多