【问题标题】:Algorithm to calculate percent difference between two blobs of text [closed]计算两个文本块之间百分比差异的算法[关闭]
【发布时间】:2010-06-24 03:10:03
【问题描述】:

我一直在研究寻找有效的解决方案。我研究了不同的引擎(谷歌的 diff-match-patch,python 的 diff)和一些最长的通用链算法。

我希望得到你们关于如何解决这个问题的建议。您特别想推荐任何算法或库?

【问题讨论】:

  • 看来您已经回答了自己的问题。如果您正在查看“最长公共子序列”和“差异”,您就会知道这是一个经典问题并且是 NP 难题。这里没有人会比几代计算机科学家做得更好。 en.wikipedia.org/wiki/Longest_common_subsequence_problem
  • DNA [精确] 匹配springerlink.com/content/k2uq2r0037105466 怎么样?
  • 你想要什么,“百分比差异”(如何定义?)或“最长的共同点”(可能 == 子字符串;“链”???)或两者兼而有之(它们不是相同的)?举个例子,例如s1 = "thequickbrownfox", s2 = "thequickvrownfox",你期望什么输出?你会把结果用来做什么?你做了什么研究,到目前为止你得出了什么结论?这是作业吗?
  • @john s1 = "thequickbrownfox" s2 = "thequickbrownfoxes" 输出,相似度 = 98%(差异 = 2%)不,这不是硬件,我正在努力将其集成到一个维基。
  • @colorful:如何通过在 16 个字符的字符串中添加 2 个字符来获得差异 = 2%?我再次问:您如何定义百分比差异?如果您需要帮助而不是闲逛,请回答其他问题。

标签: python algorithm string


【解决方案1】:

我不知道“最长的公共 [[链?子字符串?]]”与“百分比差异”有什么关系,特别是在看到评论中您期望两个字符串之间的差异非常小之后中间一个字符(所以它们最长的公共子字符串大约是字符串长度的一半)。

忽略“最长常见”的奇异性,并将“百分比差异”定义为字符串之间的编辑距离除以最大长度(当然是 100 倍;-),那么:

def levenshtein_distance(first, second):
    """Find the Levenshtein distance between two strings."""
    if len(first) > len(second):
        first, second = second, first
    if len(second) == 0:
        return len(first)
    first_length = len(first) + 1
    second_length = len(second) + 1
    distance_matrix = [[0] * second_length for x in range(first_length)]
    for i in range(first_length):
       distance_matrix[i][0] = i
    for j in range(second_length):
       distance_matrix[0][j]=j
    for i in xrange(1, first_length):
        for j in range(1, second_length):
            deletion = distance_matrix[i-1][j] + 1
            insertion = distance_matrix[i][j-1] + 1
            substitution = distance_matrix[i-1][j-1]
            if first[i-1] != second[j-1]:
                substitution += 1
            distance_matrix[i][j] = min(insertion, deletion, substitution)
    return distance_matrix[first_length-1][second_length-1]

def percent_diff(first, second):
    return 100*levenshtein_distance(a, b) / float(max(len(a), len(b)))

a = "the quick brown fox"
b = "the quick vrown fox"
print '%.2f' % percent_diff(a, b)

Levenshtein 函数来自Stavros' blog。在这种情况下,结果将是 5.26(百分比差异)。

【讨论】:

  • 该算法在空间(不必要)和时间上都是 O(MN)。 Stavros 说他用它来检查平均长度为 8 的单词,比 OP 的“段落到页面之间的任何地方”要少一点。
【解决方案2】:

除了difflib 和其他常见的子序列库,如果它是自然语言文本,您可能会考虑词干提取,它将单词规范化为其根形式。您可以在 Natural Language Toolkit (http://www.nltk.org/) 库中找到几个实现。您还可以使用 N-Grams (http://en.wikipedia.org/wiki/N-gram) 更语义地比较自然语言文本的 blob。

【讨论】:

    【解决方案3】:

    最长的公共链?也许这会有所帮助:http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

    【讨论】:

      【解决方案4】:

      另一个感兴趣的领域可能是 here 描述的 Levenshtein 距离。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多