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+h)/len(z)/2>=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+h)/len(a)/2>=c:
                            m.append(z)
                return m
            else:
                print('相關度必須為浮點型且在0—1之間')
        else:
            print('匹配語料必須為列表')
    else:
        print('匹配語句必須為字符串')

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM