使用SequenceMatcher从列表中删除相似的单词或句子,并保留相似的第一个条目:

时间:2018-11-03 05:32:20

标签: python function comparison itertools

编辑:对于阅读此书的任何人,我已经解决了我的问题,并且找到了一个解决方案,据我估计,该解决方案比使用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愧   问题是我自己。

     

谢谢!

0 个答案:

没有答案