iT邦幫忙

1

(筆記)文字相似度:Jaro-Winkler Distance

  • 分享至 

  • xImage
  •  

在程式中,比對A資料與B資料是否一致或者是有關連的時候,除了基本的equal、Contain、正規等方式,在一些情境下也會使用文字相似度的演算法,來判斷兩者的相似度距離/比例,但是在使用文字相似度的時候需要注意:

文字相似度只能提供一個參考值。你可以在初步用文字相似度比對後,得到一個數值標準(ex:定義相似度在91%時,視為兩者相等),定義這個案例超過此數值時,則視為相等。但是這個標準並非完全準確,可能會有數值明明超過相似度的標準,實際檢查資料才發現這兩者其實根本無關,反之亦然。若你需要100%完全判斷正確A是否等於B,則不適合用文字相似度的方式去比對資料。因為文字相似不代表文義相似。

首先要介紹的是Jaro-Winkler Distance演算法:

  • Jaro Distance / Similarity

    m = 兩個字串相匹配的字元個數(不管Index是否一樣)。
    |s1|、|s2|:兩個字串各自的長度。
    t = 0.5 * 換位數目
    換位數目 = 兩個字串相匹配的字元中,有幾個是Index不同的。
    舉例:A ="abcd", B= "dbce",則此時m = 3('b','c','d'),換位數目 = 1(兩者的'd'index不同)

除上述公式之外,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...

    • 特性:從上面的公式可以看出,Jaro-Winkler Distance 對於前綴字越相符的,相似度的結果會越高。

Reference:
https://www.twblogs.net/a/5ca89b9bbd9eee59d333342d


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言