【python 走进NLP】LCS算法最长公共子串

输入两个字符串,求它们的最长公共子串。注意,并不要求字符必须连续出现。

例子:
字符串A=kitten,字符串B=sitting
那他们的最长公共子串为ittn

# -*- encoding=utf-8 -*-
import numpy as np

def LCS(x,y):

    c=np.zeros((len(x)+1,len(y)+1))
    b=np.zeros((len(x)+1,len(y)+1))
    for i in range(1,len(x)+1):
        for j in range(1,len(y)+1):
            if x[i-1]==y[j-1]:
                c[i,j]=c[i-1,j-1]+1
                b[i,j]=2
            else:
                if c[i-1,j]>=c[i,j-1]:
                    c[i,j]=c[i-1,j]
                    b[i,j]=1
                else:
                    c[i,j]=c[i,j-1]
                    b[i,j]=3
    return c,b



def getLCS(x,y):
    c,b=LCS(x,y)
    i=len(x)
    j=len(y)
    lcs=''
    while i>0 and j>0:
        if b[i][j]==2:
            lcs=x[i-1]+lcs
            i-=1
            j-=1
        if b[i][j]==1:
            i-=1
        if b[i][j]==3:
            j-=1
        if b[i][j]==0:
            break
    lcs_len=len(lcs)
    return lcs,lcs_len

if __name__ == '__main__':

    a='kitten'
    b='sitting'
    lcs,lcs_len=getLCS(a,b)
    print(lcs)
    print(lcs_len)

运行结果:

ittn
4

Process finished with exit code 0

用途:
计算文本相似度:

# -*- encoding=utf-8 -*-
import numpy as np

def LCS(x,y):

    c=np.zeros((len(x)+1,len(y)+1))
    b=np.zeros((len(x)+1,len(y)+1))
    for i in range(1,len(x)+1):
        for j in range(1,len(y)+1):
            if x[i-1]==y[j-1]:
                c[i,j]=c[i-1,j-1]+1
                b[i,j]=2
            else:
                if c[i-1,j]>=c[i,j-1]:
                    c[i,j]=c[i-1,j]
                    b[i,j]=1
                else:
                    c[i,j]=c[i,j-1]
                    b[i,j]=3
    return c,b



def getLCS(x,y):
    c,b=LCS(x,y)
    i=len(x)
    j=len(y)
    lcs=''
    while i>0 and j>0:
        if b[i][j]==2:
            lcs=x[i-1]+lcs
            i-=1
            j-=1
        if b[i][j]==1:
            i-=1
        if b[i][j]==3:
            j-=1
        if b[i][j]==0:
            break
    lcs_len=len(lcs)
    return lcs,lcs_len

if __name__ == '__main__':

    a='kitten'
    b='kitten'
    lcs,lcs_len=getLCS(a,b)
    similarity=round(lcs_len/max(len(a),len(b)),4)
    print(lcs)
    print(lcs_len)
    print(similarity)
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页