我正在编写一个程序,以检测来自不同来源的大量文本中引用的法院案件,并计算每个文本中被引用多少次。问题源于大多数文件中的两个州存在案件的事实:在给定的案文中(例如“ 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_1
:var_2
的每个迭代以剔除闭合但不正确的匹配。
答案 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):
....