python模糊查询_python实现字符串模糊匹配
之前筆者寫過一篇文章關于如何做搜索,但那篇文章的角度是從文本相似度角度寫的。那種方式是目前發展的趨勢,但是真正的搜索特別是網頁搜索不可能在大范圍的文本之間兩兩算相似度的。那樣搜索引擎的效率會變得特別低下。本文將從字符串模糊匹配的角度介紹一下搜索引擎。
一般的搜索,要分為兩個步驟:搜索和排序。搜索的方法有很多,為了高效一般進行字符串或關鍵詞匹配,而用戶提供的一些關鍵詞可能不是數據庫中保存的,例如使用倒排的方法很難找到Head節點,此處需要使用模糊匹配的方式。這里簡單列舉一下Learning-to-Rank排序的方法:BM25算法、TF-IDF算相似度、SVD奇異值分解(主題模型)得到向量表示算相似度、再就是之前介紹的文本相似度計算的方法。如果是網頁的排序,可能會涉及到網址質量好壞需要使用PageRank排序算法等。
本文主要從模糊匹配的角度,簡單介紹下搜索。主要解決的問題類似,“劉得華演過的電影”與“劉德華演過的電影”表示的是同一個意思。
1. 編輯距離
首先給大家介紹一下編輯距離,編輯距離就是用于衡量兩個字符串之間的差異。具體描述為:string1通過多少次最少操作(增添字符、刪除字符、替換字符)得到string2,最少操作的次數就定義為編輯距離。例如句子劉得華演過的電影”與“劉德華演過的電影”只需要一次替換“得”為“德”,所以二者之間的距離為1。如果兩個字符串S1和S2,長度分別為i,j。那么二者之間的距離D(i,j)可以表示為:
(1)min(i,j)==0,即S1,S2中存在空字符串
D(i,j)=max(i,j)
(2)min(i,j) != 0,
去掉S1或S2的最后一個字符進行比較,分別得到距離
D(i,j-1), D(i-1,j),D(i-1,j-1)
由動態規劃的思想可以得到:
D(i,j) = min{D(i,j-1), D(i-1,j),D(i-1,j-1)+sigma(i,j)} 其中sigma(i,j)取值為0或 1,1表示S1和S2最后一個字符不相同,0表示相同。具體實現如下:
intLevenshteinDistance(constchar*s,intlen_s,constchar*t,intlen_t){intcost;if(len_s==)returnlen_t;if(len_t==)returnlen_s;if(s[len_s-1]==t[len_t-1])cost=;elsecost=1;returnminimum(LevenshteinDistance(s,len_s-1,t,len_t)+1,LevenshteinDistance(s,len_s,t,len_t-1)+1,LevenshteinDistance(s,len_s-1,t,len_t-1)+cost);}
2. fuzzywuzzy
Python提供fuzzywuzzy模塊,不僅可用于計算兩個字符串之間的相似度,而且還提供排序接口能從大量候選集中找到最相似的句子。
(1)安裝
需要安裝python-Levenshtein庫用于計算上述講解的編輯距離。
pip install python-Levenshtein
pip install fuzzywuzzy
(2)接口說明
兩個模塊:fuzz, process,fuzz主要用于兩字符串之間匹配,process主要用于搜索排序。
fuzz.ratio(s1,s2)直接計算s2和s2之間的相似度,返回值為0-100,100表示完全相同;
fuzz.partial_ratio(S1,S2)部分匹配,如果S1是S2的子串依然返回100;
fuzz.token_sort_ratio(S1,S2)只比較S1,S2單詞是否相同,不考慮詞語之間的順序;
fuzz.token_set_ratio(S1,S2)相比fuzz.token_sort_ratio不考慮詞語出現的次數;
process.extract(S1, ListS,limit=n),表示從列表ListS中找出Top n與S1最相似的句子;
process.extractOne(S1,ListS),返回最相似的一個
(3)使用
運行結果:
說明str1和str2之間相似度是對稱的。
總結
以上是生活随笔為你收集整理的python模糊查询_python实现字符串模糊匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python硬件测试开发_用python
- 下一篇: python抢票_50 个加速包都抢不到