在程式中,比對A資料與B資料是否一致或者是有關連的時候,除了基本的equal、Contain、正規等方式,在一些情境下也會使用文字相似度的演算法,來判斷兩者的相似度距離/比例,但是在使用文字相似度的時候需要注意:
文字相似度只能提供一個參考值。你可以在初步用文字相似度比對後,得到一個數值標準(ex:定義相似度在91%時,視為兩者相等),定義這個案例超過此數值時,則視為相等。但是這個標準並非完全準確,可能會有數值明明超過相似度的標準,實際檢查資料才發現這兩者其實根本無關,反之亦然。若你需要100%完全判斷正確A是否等於B,則不適合用文字相似度的方式去比對資料。因為文字相似不代表文義相似。
首先要介紹的是Jaro-Winkler Distance演算法:
除上述公式之外,m的值會需要透過matching_window先確認一次。
matching_window :
兩個字串相匹配的字元,如果在這個Index數值範圍內兩個字符相等,那麼表示匹配成功,如果超出了這個範圍,表示匹配失敗。舉例:A ="abcd", B= "dbce", matching_window = 1,此時m=3 ('b','c','d'),但'd'的Index在A為3,B為0,超過了matching_window的上限,所以m只能=2
以下為實際案例,計算兩者字串的相似度,也可以從這個案例看出,我們得出來的數值僅能代表一個字串相似度的計算結果,實際上這兩者在現實中有沒有真實關聯,則不能單只用文字相似度判斷。
ex1: A = "永豐餘投資控股" , B = "永豐餘工業用紙"
matching_window = 2.5
m = 3 (兩個字串相匹配的字元'永'、'豐'、'餘' 皆有在 <2.5的Index範圍(分別是0,0,0))
換位數目 = 0
結果:Similarity Score = 0.61904761904761904761904761904762
Jaro-Winkler Distance / Similarity
simj = Similarity Score。
l = 表示兩個字符串的共同前綴字符的個數,最大不超過4個。
p = p是縮放因子常量,它描述的是共同前綴對於相似度的貢獻,p越大,表示共同前綴權重越大,最大不超過0.25。p默認取值是0.1。
同樣用ex1的範例,計算出l = 3, p這裡使用默認值0.1
得到結果 : 0.7333...
Reference:
https://www.twblogs.net/a/5ca89b9bbd9eee59d333342d