python3 自己写的一个小算法(比对中文文本相似度)

函数使用说明:

函数的三个参数分别是“匹配语句”,“匹配语料”,“相关度”;

匹配语句,和匹配预料中的语句匹配的语句,必须为字符串;

匹配语料,被匹配语句来匹配的语句列表,必须为列表;

相关度,函数只会输出匹配预料中匹配度大于相关度的的语句;

函数返回类型为列表;

算法原理:从文本内容匹配度与文本顺序匹配度两个维度进行衡量。

a=["早上吃了没",'吃过没','吃了没','刚吃过吗']
b='吃了吗'
ltextmatch(b,a,0.5)

但就从中文来说,本来写这个主要是因为自己和同学再尝试做一个智能聊天机与数据分析可视化机器人,自己是负责聊天这一块。由于中文复杂的语法和歧义,在语句匹配中,或者说是在对话匹配中其实最重要的还是语料库,从理论上来说只要语料库够全,程序要做的只需要匹配就可以了,算法只能是一个锦上添花的东西,可能这也就是现在没什么人写这个的原因。

源码:

def ltextmatch(a,b,c):
    if isinstance(a,str):
        if isinstance(b,list):
            if isinstance(c,float)and 0<c<=1:
                m=[]
                for z in b:
                    z=str(z)
                    l,k,j,h=0,0,0,0
                    if len(z)>=len(a):
                        for x in a:
                            if x in z:
                                l+=1
                        for x in a:
                            if x in z:
                                k=z.index(x)
                                j=a.index(x)
                                break
                        if len(z)-k>=len(a)-j:
                            for x in range(0,len(a)-j):
                                if z[k+x]==a[j+x]:
                                    h+=1
                        else:
                            for x in range(0,len(z)-k):
                                if z[k+x]==a[j+x]:
                                    h+=1
                        if (l*0.2+h*0.8)/len(z)>c:
                            m.append(z)
                    else:
                        for x in z:
                            if x in a:
                                l+=1
                        for x in z:
                            if x in a:
                                k=z.index(x)
                                j=a.index(x)
                                break
                        if len(z)-k>=len(a)-j:
                            for x in range(0,len(a)-j):
                                if z[k+x]==a[j+x]:
                                    h+=1
                        else:
                            for x in range(0,len(z)-k):
                                if z[k+x]==a[j+x]:
                                    h+=1
                        if (l*0.2+h*0.8)/len(z)>c:
                            m.append(z)
                return m
            else:
                print('相关度必须为浮点型且在0—1之间')
        else:
            print('匹配语料必须为列表')
    else:
        print('匹配语句必须为字符串')

猜你喜欢

转载自www.cnblogs.com/busishum/p/11812778.html