Python 计算两个文本块之间差异百分比的算法

Python 计算两个文本块之间差异百分比的算法,python,algorithm,string,Python,Algorithm,String,我一直在研究如何找到一个有效的解决方案。我已经研究了diffing引擎google的diff match补丁、python的diff和一些最长的通用链算法 我希望能得到你们关于如何解决这个问题的建议。您特别推荐什么算法或库?最长公共链?也许这会有所帮助:除了difflib和其他常见的子序列库之外,如果是自然语言文本,您可以研究词干分析,它将单词规范化为其根形式。您可以在自然语言工具包库中找到几个实现。您还可以使用N-Grams在语义上比较自然语言文本的blob。我不知道最长的公共[[chain?

我一直在研究如何找到一个有效的解决方案。我已经研究了diffing引擎google的diff match补丁、python的diff和一些最长的通用链算法


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

最长公共链?也许这会有所帮助:

除了difflib和其他常见的子序列库之外,如果是自然语言文本,您可以研究词干分析,它将单词规范化为其根形式。您可以在自然语言工具包库中找到几个实现。您还可以使用N-Grams在语义上比较自然语言文本的blob。

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

忽略最长的常见奇怪度,并将百分比差异定义为字符串之间的编辑距离除以最大长度乘以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函数来自。这种情况下的结果是5.26%的差异。

另一个有趣的领域可能是所描述的Levenshtein距离。

您似乎已经回答了自己的问题。如果你看的是最长的公共子序列和差分,你就会知道这是一个经典的NP难问题。这里没有人会比几代计算机科学家做得更好。DNA[精确]匹配如何?你想要什么,百分比差异如何定义?或者最长的公共某物某物可能==子字符串;链条或者两者都不一样?举一个例子,例如s1=快速浏览信息,s2=快速浏览信息,您希望得到什么样的输出?你会把结果用在什么地方?到目前为止,你做了哪些研究,得出了哪些结论?这是家庭作业吗?@john s1=QuickBrownFox s2=QuickBrownFox输出,相似性=98%差异=2%不,这不是用于硬件,我正在努力将其集成到wiki中。@Color:如何通过在16个字符的字符串中添加2个字符来获得差异=2%呢?我再次问:你如何定义百分比差异?如果你需要帮助,而不仅仅是在胡闹,请回答其他问题。该算法在空间和时间上都是不必要的。斯塔夫罗斯说,他用它来检查平均长度为8个字的单词,比OP从一段到一页的任何地方都要少一点。