信息检索第二次实验--两个字符串编辑距离的计算

介绍

        编辑距离(Edit Distance的作用主要是用来比较两个字符串的相似度的,主要是指在两个字符串之间,由一个转成另一个所需的最少操作次数,如果它们的编辑距离越大,说明它们越是不同。可用的编辑操作包括字符替换,插入,删除这三种。

具体步骤:

  • 第一步,我们先创建一个矩阵(二维数组),假设有两个字符串,长度分别是m和n,那矩阵的维度就应该是(m+1)*(n+1),初始化:第一行和第一列分别是该矩阵的行号和列号,其他位置的元素值都是0。
  • 第二步,我们分别使用d[i-1,j]+1 来表示增加操作,d[i,j-1]+1 来表示删除操作操作,d[i-1,j-1]+cost 来表示替换操作。
  • 第三步,遍历矩阵中的所有数值,通过if语句进行判断,不断更新矩阵元素值。最后设计输出结果,取这三种操作d[i,j]=min(d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+cost)中的最小值作为两个字符串之间的最少编辑操作次数。
  • 第四步,计算并输出两者之间的相似度:1-d/MAX(str1,str2),结束。

习题:

1、分别输入词项input和insert,计算编辑距离


def minEditDist(sm, sn):
    m, n = len(sm) + 1, len(sn) + 1
    len1 = len(sm)                             # len1计算相似度使用
    if len(sm) < len(sn):
        len1 = len(sn)
    # create a matrix (m*n) 矩阵
    matrix = [[0] * n for i in range(m)]
    matrix[0][0] = 0  # 初始化矩阵
    #
    for i in range(1, m):
        matrix[i][0] = matrix[i - 1][0] + 1     # 每行的首列初始化为本行的行号
    for j in range(1, n):
        matrix[0][j] = matrix[0][j - 1] + 1     # 每列的首行初始化为本列的列号
    for i in range(m):
        print(matrix[i])                        # 展示初始化后的矩阵
    print("**********开始计算**********")

    for i in range(1, m):
        for j in range(1, n):           # 遍历矩阵中的所有数值(i为行,j为列)
            if sm[i - 1] == sn[j - 1]:  # 如果这个位置的字符相同,cost赋值为 0
                cost = 0
            else:
                cost = 1                # 该位置的字符不同,cost赋值为 1
            matrix[i][j] = min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost)
            # print("按行进行计算结果是:\n",matrix[i], '\n')
    for i in range(m):              # 输出计算之后的结果
        print(matrix[i])
    print(1-matrix[m-1][n-1]/len1)  # 输出相似度
    return matrix[m - 1][n - 1]     # 返回最终的编辑距离


if __name__ == '__main__':
    ABC1 = input("input是:")
    ABC2 = input("insert是:")
    mindist = minEditDist(ABC1, ABC2)
    print("二者的编辑距离是:", mindist)

2、分别输入词项solution和source,计算编辑距离


def minEditDist(sm, sn):
    m, n = len(sm) + 1, len(sn) + 1
    len1 = len(sm)                             # len1计算相似度使用
    if len(sm) < len(sn):
        len1 = len(sn)
    # create a matrix (m*n) 矩阵
    matrix = [[0] * n for i in range(m)]
    matrix[0][0] = 0  # 初始化矩阵
    #
    for i in range(1, m):
        matrix[i][0] = matrix[i - 1][0] + 1     # 每行的首列初始化为本行的行号
    for j in range(1, n):
        matrix[0][j] = matrix[0][j - 1] + 1     # 每列的首行初始化为本列的列号
    for i in range(m):
        print(matrix[i])                        # 展示初始化后的矩阵
    print("**********开始计算**********")

    for i in range(1, m):
        for j in range(1, n):           # 遍历矩阵中的所有数值(i为行,j为列)
            if sm[i - 1] == sn[j - 1]:  # 如果这个位置的字符相同,cost赋值为 0
                cost = 0
            else:
                cost = 1                # 该位置的字符不同,cost赋值为 1
            matrix[i][j] = min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost)
            # print("按行进行计算结果是:\n",matrix[i], '\n')
    for i in range(m):              # 输出计算之后的结果
        print(matrix[i])
    print(1-matrix[m-1][n-1]/len1)  # 输出相似度
    return matrix[m - 1][n - 1]     # 返回最终的编辑距离



if __name__ == '__main__':
    ABC1 = input("solution是:")
    ABC2 = input("source是:")
    mindist = minEditDist(ABC1, ABC2)
    print("二者的编辑距离是:", mindist)

猜你喜欢

转载自blog.csdn.net/rui_qi_jian_xi/article/details/130014185
今日推荐