编辑:对于阅读此书的任何人,我已经解决了我的问题,并且找到了一个解决方案,据我估计,该解决方案比使用itertools快得多。我的问题是我使用的是itertools.combinations(),它不会保持列表的顺序,因此,如果在我的函数中将列表项删除为“ b”,则永远不会将其添加为“ a”等。
无论如何,下面的解决方案在测试我遇到的问题类型时,要比itertools.permutations()(相当于维持列表顺序的itertools.combinations())更快。
from difflib import SequenceMatcher
def ratios(data):
d_len = len(data)-1
list_iter= d_len
def inner_ratios(paragraph, current_sentence, list_iter):
output_paragraph = paragraph
paragraph = paragraph[:list_iter]
for sentence in paragraph:
if SequenceMatcher(None, current_sentence, sentence).ratio() > ratio_1:
output_paragraph.remove(current_sentence)
return output_paragraph, list_iter - 1
return output_paragraph, list_iter - 1
while True:
data, list_iter = inner_ratios(data, data[list_iter], list_iter)
if list_iter == 0:
return data
使用相同的句子列表(长度为55),完成上述功能需要0.5678250789642334秒,而使用itertools.permutations的时钟为1.094599723815918。
我使用的是time()而不是timeit,所以它可能不精确,但对我来说似乎是一个很大的速度差异。
希望这可以帮助任何与我自己有类似问题的人。
下面是两个功能。我最初取得第二名是因为 似乎是实现该目标的最基本的实现 想要的结果,我想测试一下完成两者所需的时间 看看itertools版本为我节省了多少时间。
两者的预期结果是相同的,并且意图是 比较句子列表(段落)中的每个句子与每个 同一段落中的其他句子,仅包含在输出中 与同伴的相似度超过预设的那些句子 比率。
结果输出的情况并非一无所获 省略任何内容或为空,但它们都满足了 该功能在不同程度上具有目标 不同的输出长度和/或选择省略/包括不同的 结果确实让我感到困惑。
import itertools
from time import time
from difflib import SequenceMatcher
from copy import copy
dt = dt[0:15]
dt_1 = copy(dt)
dt_2 = copy(dt)
ratio_1 = 0.4
maxlen = len(dt)
#Function 1 --------------------------
start = time()
out = list()
save = str()
for a, b in itertools.combinations(dt, 2):
if a == save:
continue
save = str()
if SequenceMatcher(None, a, b).ratio() > ratio_1:
save = a
continue
if b == dt[maxlen-1]:
out.append(a)
print(time() - start)
#Function 2 --------------------------
out2 = list()
start = time()
save2 = str()
for x in dt_1:
for y in dt_2:
if x == save2:
continue
if x == y:
continue
save2 = str()
if SequenceMatcher(None, x, y).ratio() > ratio_1:
save2 = x
continue
if y == dt[maxlen - 1]:
out2.append(x)
print(time() - start)
我非常感谢您提前提出的见解,对此我充满期待 问题的解决方法促使我为自己不了解而sm愧 问题是我自己。
谢谢!