python實現文本相似度排名計算

? ?項目中,客戶突然提出需要根據一份企業名單查找對應的內部系統用戶信息,然后根據直接的企業社會統一信用號和企業名稱進行匹配,發現匹配率只有2.86%,低得可憐。所以根據客戶的要求,需要將匹配率提高到70-80%左右,于是開始了折騰之路。

? ? 上網一查,各種相似度的算法供選擇,簡直是眼花繚亂,感嘆現在python發展的強大,需要做什么研究都能快速運用上各種算法庫,找到的算法有:

1、歐幾里得距離(Eucledian Distance)
歐氏距離是最常用的距離計算公式,衡量的是多維空間中各個點之間的絕對距離。

2、曼哈頓距離(Manhattan Distance)
曼哈頓距離依賴坐標系統的轉度,而非系統在坐標軸上的平移或映射,他是使用在幾何度量空間的幾何學用語,用以標明兩個點在標準坐標系上的絕對軸距總和。

3.切比雪夫距離
在數學中,切比雪夫距離(Chebyshev distance)或是L∞度量,是向量空間中的一種度量,二個點之間的距離定義是其各坐標數值差絕對值的最大值。以數學的觀點來看,切比雪夫距離是由一致范數(uniform norm)(或稱為上確界范數)所衍生的度量,也是超凸度量(injective metric space)的一種。?
4、明可夫斯基距離(Minkowski distance)
明氏距離是歐氏距離的推廣。閔氏距離不是一種距離,而是一組距離的定義。閔氏距離的定義:兩個n維變量a(x11,x12,…,x1n)與b(x21,x22,…,x2n)間的閔可夫斯基距離定義為:
其中p是一個變參數。
當p=1時,就是曼哈頓距離
當p=2時,就是歐氏距離
當p→∞時,就是切比雪夫距離
根據變參數的不同,閔氏距離可以表示一類的距離。
5、詞袋模型 6、TF-IDF 7、余弦相似度8、Python自帶比較相似度函數difflib.SequenceMatcher 9、word2vec 10、JS距離 11、simtext?等等... ...

然后最后我們采用的是?Levenshtein,Levenshtein Distance是一個度量兩個字符序列之間差異的字符串度量標準,兩個單詞之間的Levenshtein Distance是將一個單詞轉換為另一個單詞所需的單字符編輯(插入、刪除或替換)的最小數量。Levenshtein Distance是1965年由蘇聯數學家Vladimir Levenshtein發明的。Levenshtein Distance也被稱為編輯距離(Edit Distance)。
?安裝對應的庫

# conda install python-Levenshtein
# pip install python-Levenshtein

計算字符串的相似度

漢明距離,要求str1和str2必須長度一致。是描述兩個等長字串之間對應位置上不同字符的個數。

編輯距離,也稱為Levenshtein距離,描述由一個字串轉化成另一個字串最少的操作次數,在其中的操作包括插入、刪除、替換。

萊文斯坦比,計算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的長度總和,ldist是類編輯距離
注意:這里的類編輯距離不是2中所說的編輯距離,2中三種操作中每個操作+1,而在此處,刪除、插入依然+1,但是替換+2
這樣設計的目的:ratio(‘a’, ‘c’),sum=2,按2中計算為(2-1)/2 = 0.5,’a’,'c’沒有重合,顯然不合算,但是替換操作+2,就可以解決這個問題。
?

在實際操作中,我們應用了萊文斯坦比來給不同的企業名稱打分

第一步:剔除高頻詞,由于通過企業名稱精確匹配發現很難匹配到對應的用戶名稱,那么很有可能這份企業名單中的企業名稱不是那么符合規范也可能更改了其他后綴、前綴,所以通過剔除高頻詞之后,再進行模糊匹配。

#region 第一步excelname = '*******.xlsx'LoadPath = excelname  #加載excel路徑(這里為相對路徑,excel表與該程序在同一文件夾下就能識別,所以只用excel文件名即可)#excel表格初始化book=load_workbook(LoadPath, data_only=True)#加載已有Excel文檔sheet_current_week_result=book['sheet1']#加載需要的工作簿(這里為excel表中的sheet工作簿)#  剔除企業高頻詞       w = 1w = w + 1while w <= sheet_current_week_result.max_row:strreplace = sheet_current_week_result['A'+str(w)].valuefor qy_gpc in ['有限公司','**省','科技','供應站','分公司','有限責任','有限','貿易','湖南','公司']:            strreplace = strreplace.replace(qy_gpc,'')sheet_current_week_result['E'+str(w)].value = strreplaceprint(w)w = w + 1book.save(LoadPath)
#endregion

第二步:模糊匹配,根據剔除后的企業名稱與內部系統的用戶名進行模糊匹配,可能得到一個企業名稱對應多個用戶名的情況,這樣才需要我們的第三步,用戶名稱相似度排名打分,當然第二步中我們可能獲取到完全匹配的名稱,我們需要另外存放起來。

#region 第二步df = pd.read_excel('***.xlsx', sheet_name='sheet1')df.index = range(1,len(df)+1)df = df[:len(df)+1]df = df.values.tolist()all_zbdc = []zbdc_tup = []for row in df: # 2. 將剔除后的企業名稱、匹配后用戶名稱完全相等的記錄找出來,得到表AllMateqy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm = rowzbdc = row[0]res_zbdc = []flag = Trueif qy_nm == qy_mate_nm:res_row = [qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm,100,1,Levenshtein.ratio(qy_nm, qy_tc_gpc) * 100]print(res_row)all_zbdc.append(res_row)flag = False if flag:zbdc_tup.append([qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm])df = pd.DataFrame(all_zbdc)df.to_excel('AllMate.xlsx', sheet_name='mate', index=False)#endregion

第三步:相似度排名打分

#region 第三步print(len(zbdc_tup))res = []for row in zbdc_tup:qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm = rowres_zbdc = []strreplace = qy_mate_nmfor qy_mate_gpc in ['有限公司','**省','科技','供應站','分公司','有限責任','有限','貿易','**','公司']:            strreplace = strreplace.replace(qy_mate_gpc,'')d_n =  intersection(strreplace, qy_tc_gpc)sim = max(Levenshtein.ratio(strreplace, d_n),Levenshtein.ratio(qy_tc_gpc, d_n))res_row = [qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm,strreplace,sim * 100]res_zbdc.append(res_row)res.append(get_top3(res_zbdc))df = pd.concat(res)df.to_excel('SimilarMate.xlsx', sheet_name='mate', index=False)#endregion

涉及到的自定義函數:

def intersection(string1, string2):return [cha for cha in string2 if cha in string1]def get_top3(datas:list):df = pd.DataFrame(datas,columns=["企業名稱","區塊","統一社會信用代碼","經營范圍","企業匹配結果名稱","企業匹配結果名稱剔除高頻","名稱相似度"])df = df.sort_values("名稱相似度",ascending=False)df.index = range(1,len(df)+1)df = df[:3]df['相似度排名'] = df.indexall_sim = []for i in range(len(df)):row = df.iloc[i].to_list()all_sim.append(Levenshtein.ratio(row[0], row[3]) * 100)df['全名相似度'] = all_simprint(df)return df

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38248.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue2+百度地圖web端開發

在Vue 2中開發百度地圖Web端應用&#xff0c;你可以使用百度地圖JavaScript API來實現地圖功能。以下是一個簡單的示例&#xff1a; 簡單的示例&#xff1a; 首先&#xff0c;在你的Vue項目中安裝vue-baidu-map插件&#xff1a; npm install vue-baidu-map --save在你的Vue組…

大數據Flink(五十九):Flink on Yarn的三種部署方式介紹以及注意

文章目錄 Flink on Yarn的三種部署方式介紹以及注意 一、Pre-Job 模式部署作業

對任意類型數都可以排序的函數:qsort函數

之前我們學習過冒泡排序&#xff1a; int main() {int arr[] { 9,7,8,6,5,4,3,2,1,0 };int sz sizeof(arr)/sizeof(arr[0]);int i 0;for (i 0; i < sz-1; i) {int j 0;for (j 0; j < sz-1-i; j) {if (arr[j] > arr[j 1]){int temp 0;temp arr[j];arr[j] ar…

接口測試及接口抓包常用的測試工具

接口 接口測試是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換&#xff0c;傳遞和控制管理過程&#xff0c;以及系統間的相互邏輯依賴關系等。 接口測試的重要性 是節省時間前后端不…

七、dokcer-compose部署springboot的jar

1、準備 打包后包名為 ruoyi-admin.jar 增加接口 httpL//{ip}:{port}/common/test/han #環境變量預application.yml 中REDIS_HOSTt的值&#xff0c;去環境變量去找&#xff1b;如果找不到REDIS_HOST就用myredis 1、Dockerfile FROM hlw/java:8-jreRUN ln -sf /usr/share/z…

私密相冊管家-加密碼保護私人相冊照片安全

App Store史上最安全、最強大、最卓越的私密相冊App&#xff01;再也不用擔心私密照片視頻被別人看見了&#xff01;?私密相冊為你提供多重密碼保護機制、簡單便捷的照片存儲空間&#xff0c;完美地將你的私密照片遠離一切惡意偷窺者的窺探&#xff01; 【產品功能】? √ 支…

Redis—持久化

這里寫目錄標題 AOF三種寫回策略寫回策略的優缺點AOF 重寫機制AOF后臺重寫AOF優缺點使用命令 RDBRDB 持久化的工作原理執行快照時&#xff0c;數據能被修改嗎RDB 持久化的優點RDB 持久化的缺點 混合持久化大key對持久化的影響 AOF 保存寫操作命令到日志的持久化方式&#xff0…

開源數據庫Mysql_DBA運維實戰 (DML/DQL語句)

DML/DQL DML INSERT 實現數據的 插入 實例&#xff1a; DELETE 實現數據的 刪除 實例&#xff1a; UPDATE 實現數據的 更新 實例1&#xff1a; 實例2&#xff1a; 實例3&#xff1a; DQL DML/DQL DML語句 數據庫操縱語言&#xff1a; 插入數據INSERT、刪除數據DELE…

2023年即將推出的CSS特性對你影響大不大?

Google開發者大會每年都會提出有關于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了許多新功能&#xff0c;今天就從中找出了影響最大的幾個功能給大家介紹一下 :has :has() 可以通過檢查父元素是否包含特定子元素或這些子元素是否處于特定狀態來改變樣式&#xff0c;也…

Python|OpenCV-繪制圖形和添加文字的方法(2)

前言 本文是該專欄的第2篇,后面將持續分享OpenCV計算機視覺的干貨知識,記得關注。 OpenCV作為一個強大的計算機視覺功能庫,除了能解決圖像處理和計算機視覺任務之外,它還有著非常豐富的圖像繪制功能。可以說,不論是在計算機視覺任務中標記目標領域,還是在圖像上繪制一些…

二刷LeetCode--155. 最小棧(C++版本),思維題

思路:本題需要使用兩個棧,一個就是正常棧,執行出入操作,另一個棧只負責將對應的最小值進行保存即可.每次入棧的時候,最小值棧的棧頂也需要入棧元素,不過這個元素是最小值,那么就需要進行比較,因此在getmin()的時候只需要將最小值棧的棧頂元素彈出即可.初始化的時候只需要將最小…

【vue3】點擊按鈕彈出卡片,點擊卡片中的取消按鈕取消彈出的卡片(附代碼)

實現思路&#xff1a; 在按鈕上綁定一個點擊事件&#xff0c;默認是true&#xff1b;在export default { }中注冊變量給卡片標簽用v-if判斷是否要顯示卡片&#xff0c;ture則顯示&#xff1b;在卡片里面寫好你想要展示的數據&#xff1b;給卡片添加一個取消按鈕&#xff0c;綁…

JVM G1垃圾回收機制介紹

G1(Garbage First)收集器 (標記-整理算法)&#xff1a; Java堆并行收集器&#xff0c;G1收集器是JDK1.7提供的一個新收集器&#xff0c;G1收集器基于“標記-整理”算法實現&#xff0c;也就是說不會產生內存碎片。此外&#xff0c;G1收集器不同于之前的收集器的一個重要特點是&…

vue中 contenteditable 中如何將光標聚焦到最后位置

場景: 1. 在vue中, 又在for循環中, 給div元素配置contenteditable屬性, 但是使用不了v-model綁定 2. 點擊外部元素需要聚焦并將光標聚焦到最后位置 方案: 1. 使用vue-input-contenteditable第三方包, 可以使用v-model綁定, // 下載 yarn add vue-input-contenteditable…

每日一學——網絡層

網絡層是計算機網絡體系結構中的一個關鍵層級。它負責將數據從源主機發送到目標主機&#xff0c;通過路由選擇和路徑管理實現在不同網絡之間的數據傳輸。以下是網絡層的詳細資料&#xff0c;包括應用、案例和常見問題&#xff1a; 功能&#xff1a;網絡層的主要功能是提供端到端…

[Poetize6] IncDec Sequence

題目描述 給定一個長度為 n 的數列 a_1,a_2,...,a_n&#xff0c;每次可以選擇一個區間[l,r]&#xff0c;使這個區間內的數都加 1 或者都減 1。 請問至少需要多少次操作才能使數列中的所有數都一樣&#xff0c;并求出在保證最少次數的前提下&#xff0c;最終得到的數列有多…

django部署到centos服務器上

具體的操作步驟 步驟一 更新系統和安裝依賴&#xff0c; sudo yum update sudo yum install python3 python3-pip python3-devel git步驟二&#xff1a;創建并激活虛擬環境 在終端中執行以下命令&#xff1a; python3 -m venv myenv source myenv/bin/activate可以不創建虛擬…

Python 基礎教程,Python 是什么?

Python 的誕生是極具戲曲性的&#xff0c;據 Guido 自述記載&#xff0c;Python 語言是在圣誕節期間為了打發無聊的時間而開發的&#xff0c;之所以會選擇 Python 作為該編程語言的名字&#xff0c;是因為 Guido 是 Monty Python 戲劇團的忠實粉絲。 Python 語言是在 ABC 語言的…

深度學習的“前世今生”

1、“感知機”的誕生 20世紀50年代&#xff0c;人工智能派生出了這樣兩個學派&#xff0c;分別是“符號學派”及“連接學派”。前者的領軍學者有Marvin Minsky及John McCarthy&#xff0c;后者則是由Frank Rosenblatt所領導。 符號學派的人相信對機器從頭編程&#xff0c;一個…

JavaScript基礎:學習JavaScript語言的基本語法和常用操作,了解網頁交互的基本原理

JavaScript是一種廣泛應用于網頁開發中的腳本語言&#xff0c;它可以與HTML和CSS一起使用&#xff0c;實現網頁交互及動態效果。 以下是JavaScript的基本語法和常用操作&#xff1a; 變量聲明&#xff1a;使用var、let或const關鍵字聲明變量。 var name "John";let …