python3 本身寫的一個小算法(比對中文文本類似度)

函數使用說明:算法

函數的三個參數分別是「匹配語句」,「匹配語料」,「相關度」;app

匹配語句,和匹配預料中的語句匹配的語句,必須爲字符串;函數

匹配語料,被匹配語句來匹配的語句列表,必須爲列表;spa

相關度,函數只會輸出匹配預料中匹配度大於相關度的的語句;code

函數返回類型爲列表;blog

算法原理:從文本內容匹配度與文本順序匹配度兩個維度進行衡量。字符串

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('匹配語句必須爲字符串')
相關文章
相關標籤/搜索