NLP基本功-文本相似度 | AI產品經理需要了解的AI技術通識
前言:本文作者Insight ,是我們「AI產品經理大本營」成員,下面是他分享的第3篇文章,歡迎更多有興趣「主動輸出」的朋友們一起加入、共同進步。
一、背景介紹
因為之前做過個性化推薦相關的項目,最近產品的其中一個模塊也需要用到文本相似度,趁此機會做一個全面的整理。
CSDN及各類技術博客上有很多文本相似度方面的文章,但它們的側重點是代碼,目標受眾是開發人員,代碼基礎薄弱的話看起來會比較吃力。
本文側重講述邏輯和使用場景,嘗試將演算法通俗化,盡量多舉例,降低理解門檻。希望讀完本文,大家可以對文本相似度有一個完整而深刻的理解,最好能在非代碼維度上超過開發人員(達到了這種水平,輸出的需求自然會得到開發同學最大的尊重和認同)。
文本相似度,顧名思義是指兩個文本(文章)之間的相似度,在搜索引擎、推薦系統、論文鑒定、機器翻譯、自動應答、命名實體識別、拼寫糾錯等領域有廣泛的應用。
總的來說,文本相似度是自然語言處理(NLP)中必不可少的重要環節,幾乎所有NLP的領域都會涉及到!
與之相對應的,還有一個概念——文本距離——指的是兩個文本之間的距離。文本距離和文本相似度是負相關的——距離小,「離得近」,相似度高;距離大,「離得遠」,相似度低。業務上不會對這兩個概念進行嚴格區分,有時用文本距離,有時則會用文本相似度。
二、各類演算法
2.1、歐氏距離
數學中的一個非常經典的距離,公式如下:
例2.1.1、計算「產品經理」和「產業經理是什麼」之間的歐氏距離,過程如下:
文本向量A=(產,品,經,理),即x1=產,x2=品,x3=經,x4=理,x5、x6、x7均為空;
文本向量B=(產,業,經,理,是,什,么),即y1=產,y2=業,y3=經,y4=理,y5=是,y6=什,y7=么。
這裡規定,若xi=yi,則xi-yi=0;
若xi≠yi,|xi-yi|=1
所以,歐氏距離是2
適用場景
編碼檢測等類似領域。兩串編碼必須完全一致,才能通過檢測,這時一個移位或者一個錯字,可能會造成非常嚴重的後果。比如下圖第一個二維碼是「這是一篇文本相似度的文章」,第二個是「這是一篇文本相似度文章」。從人的理解來看,這兩句話相似度非常高,但是生成的二維碼卻千差萬別。
這是一個文本相似度文章 (二維碼自動識別)
這是一個文本相似度的文章 (二維碼自動識別)
不適用場景
文本相似度,意味著要能區分相似/差異的程度,而歐氏距離更多的只能區分出是否完全一樣。而且,歐氏距離對位置、順序非常敏感,比如「我的名字是孫行者」和「孫行者是我的名字」,在人看來,相似度非常高,但是用歐氏距離計算,兩個文本向量每個位置的值都不同,即完全不匹配。
2.2、曼哈頓距離
和歐氏距離非常相似(把平方換成了絕對值,拿掉了根號),公式如下:
適用場景同歐氏距離。
2.3、編輯距離(Levenshtein距離、萊文斯坦距離)
顧名思義,編輯距離指的是將文本A編輯成文本B需要的最少變動次數(每次只能增加、刪除或修改一個字)。
例2.3.1、計算「椰子」和「椰子樹」之間的編輯距離。
因為將「椰子」轉化成「椰子樹」,至少需要且只需要1次改動(反過來,將「椰子樹」轉化成「椰子」,也至少需要1次改動,如下圖),所以它們的編輯距離是1。
因此,編輯距離是對稱的,即將A轉化成B的最小變動次數和將B轉化成A的最小變動次數是相等的。
同時,編輯距離與文本的順序有關。
比如,「椰子」和「子椰」,雖然都是由「椰」「子」組成,但因為順序變了,編輯距離是2(如下圖),而不是0。
適用場景
編輯距離算出來很小,文本相似度肯定很高。如果用演算法語言來說的話,就是精確率很高(即雖然會漏掉一些好的case,但可以確保選出來的case一定非常好)。
不適用場景
反過來說,雖然精確率很高,但召回率不高(準確率、精確率、召回率的定義見文章底部外鏈)。在某些業務場景中,漏掉的case會引起嚴重後果,比如「批發零售」和「零售批發」,人的理解應該非常相似,可編輯距離卻是4,相當於完全不匹配,這顯然不符合預期。
2.4、Jaccard相似度(傑卡德相似度)
傑卡德相似度,指的是文本A與文本B中交集的字數除以並集的字數,公式非常簡單:
例2.4.1、計算「荒野求生」和「絕地求生」的傑卡德相似度。
因為它們交集是{求,生},並集是{荒,野,求,生,絕,地},所以它們的傑卡德相似度=2/6=1/3。
傑卡德相似度與文本的位置、順序均無關,比如「王者榮耀」和「榮耀王者」的相似度是100%。無論「王者榮耀」這4個字怎麼排列,最終相似度都是100%。
在某些情況下,會先將文本分詞,再以詞為單位計算相似度。比如將「王者榮耀」切分成「王者/榮耀」,將「榮耀王者」切分成「榮耀/王者」,那麼交集就是{王者,榮耀},並集也是{王者,榮耀},相似度恰好仍是100%。
適用場景
1)對字/詞的順序不敏感的文本,比如前述的「零售批發」和「批發零售」,可以很好地兼容。
2)長文本,比如一篇論文,甚至一本書。如果兩篇論文相似度較高,說明交集比較大,很多用詞是重複的,存在抄襲嫌疑。
不適用場景
1)重複字元較多的文本,比如「這是是是是是是一個文本」和「這是一個文文文文文文本」,這兩個文本有很多字不一樣,直觀感受相似度不會太高,但計算出來的相似度卻是100%(交集=並集)。
2)對文字順序很敏感的場景,比如「一九三八年」和「一八三九年」,傑卡德相似度是100%,意思卻完全不同。
如果要計算Jaccard距離,公式稍作變更即可:
2.5、餘弦相似度
餘弦相似度的靈感來自於數學中的餘弦定理,這裡對數學內容不做過多解釋,直接上公式:
其中,A、B分別是文本一、文本二對應的n維向量,取值方式用語言比較難描述,直接看例子吧:
例2.5.1、文本一是「一個雨傘」,文本二是「下雨了開雨傘」,計算它們的餘弦相似度。
它們的並集是{一,個,雨,傘,下,了,開},共7個字。
若並集中的第1個字元在文本一中出現了n次,則A1=n(n=0,1,2……)。
若並集中的第2個字元在文本一中出現了n次,則A2=n(n=0,1,2……)。
依此類推,算出A3、A4、……、A7,B1、B2、……、B7,最終得到:
A=(1,1,1,1,0,0,0)。
B=(0,0,2,1,1,1,1)。
將A、B代入計算公式,得到
適用場景
餘弦相似度和傑卡德相似度雖然計算方式差異較大,但性質上很類似(與文本的交集高度相關),所以適用場景也非常類似。
餘弦相似度相比傑卡德相似度最大的不同在於它考慮到了文本的頻次,比如上面例子出現了2次「雨」,和只出現1次「雨」,相似度是不同的;再比如「這是是是是是是一個文本」和「這是一個文文文文文文本」,餘弦相似度是39%,整體上符合「相同的內容少於一半,但超過1/3」的觀感(僅從文本來看,不考慮語義)。
不適用場景
向量之間方向相同,但大小不同的情況(這種情況下餘弦相似度是100%)。
比如「太棒了」和「太棒了太棒了太棒了」,向量分別是(1,1,1)和(3,3,3),計算出的相似度是100%。這時候要根據業務場景進行取捨,有些場景下我們認為它們意思差不多,只是語氣程度不一樣,這時候餘弦相似度是很給力的;有些場景下我們認為它們差異很大,哪怕意思差不多,但從文本的角度來看相似度並不高(最直白的,一個3個字,一個9個字),這時候餘弦相似度就愛莫能助了。
2.6、Jaro相似度
Jaro相似度據說是用來判定健康記錄上兩個名字是否相同,公式如下:
其中,m是兩個字元串中相互匹配的字元數量;|s1|和|s2|表示兩個字元串的長度(字元數量);t是換位數量。
這裡著重說一下「匹配」和「換位」的概念,先列一個公式,我稱之為「匹配閾值」:
當s1中某字元與s2中某字元相同,且它們的位置相距小於等於k時,就說它們是匹配的。
比如「我明白了」和「快一點告訴我」,按公式算出k=2。雖然兩個字元串中都有「我」字,但一個在第1位,另一個在第6位,相距為5,大於k值,所以這兩個字元串沒有任何一個字元是匹配的。
再比如「我明白了」和「明白了我」,k=1,所以這兩個字元串的「明」「白」「了」是匹配的,但是「我」是不匹配的,所以它們有3個字元是匹配的。
換位的意思,是將s1和s2匹配的字元依次抽出來,看它們順序不一樣的字元有多少個,這個數就是換位數量。
例2.6.1、計算「我表白了一個女孩」和「近幾天我白表了一次情」的Jaro相似度。
|s1|=8,|s2|=10,k=4,匹配的字元有5個,即m=5,分別是「我」「表」「白」「了」「一」。
將s1中的匹配字元依次抽出來,得到一個向量r1=(我,表,白,了,一)。
將s2中的匹配字元依次抽出來,得到一個向量r2=(我,白,表,了,一)。
比對r1和r2,發現有2個位置的值不一樣(第2位和第3位),所以換位數t=2。
於是,d=1/3[5/8+5/10+(5-2)/5]=57.5%。
適用場景
對位置、順序敏感的文本。
文本位置的偏移,很容易使匹配字元數m變少;文本順序的變換,會使換位數量t增大。它們都會使Jaro相似度減小。換句話說,如果某業務場景下需要考慮文本位置偏移、順序變換的影響,既不希望位置或順序變了相似度卻保持不變,又不希望直接一刀切將相似度變為0,那Jaro距離是十分合適的。
不適用場景
未知(什麼!作者這麼任性的嗎?)。
其實,我自己確實沒想清楚,也沒有在實踐中使用過這個演算法。
整體來說,Jaro距離是比較綜合的文本相似度演算法,從換位字元數來看,有點像編輯距離;從匹配字元的抽取來看,又有點像「交集」。
最後,對例2.6.1做個橫向對比:
1)編輯距離算出來是8,s1長度是8,s2長度是10,編輯距離等於8,從數據上看非常不相似,與人的感官差異很大。
2)傑卡德相似度算出來是38.5%,數值比較低,和人的感官差異較大。
3)餘弦相似度算出來是55.9%,和Jaro距離算出來差不多,都是50%+,比較符合人的感官——超過一半的內容是相同的,同時有將近一半內容是不同的。
4)如果在此例中,調整字元順序,讓換位數量t變大,匹配數量m變小,餘弦相似度不變,Jaro相似度會降低。
三、拓展閱讀
3.1、名詞解釋
演算法中的重要概念(指標)——準確率、精確率、召回率。其中準確率和精確率很容易混淆,詳細差別可以點開以下鏈接:http://t.cn/R6y8ay9
3.2、貝葉斯公式
NLP領域,我個人認為有兩個非常重要的、頻繁出現的基本公式,一個是前述的文本相似度,另一個就是貝葉斯公式了。對這塊有興趣的同學,可以閱讀下文:http://t.cn/haY0x
作者寫的非常易於理解——我在《深度學習》這本書里看NLP相關內容時,有幾個公式怎麼都理解不了,看這篇文章簡直是秒懂。
3.3、代碼
編輯距離的代碼見百度百科最底部,有興趣的同學可以擴展閱讀:http://t.cn/R850kBe
餘弦相似度的代碼見這篇CSDN博客 ,寫的比較詳細:http://t.cn/R850ru8
切記,一定要在電腦上打開鏈接查看代碼(別問我怎麼知道的)。
PS. 代碼這一塊我就意思一下,不是重點,不再每個演算法都一一列舉了。
注1: Insight 同學的歷史文章:
- 《面經分享 | 原來,騰訊機器人項目是這樣面試的》
- 《團員分享_我的2017與2018》
注2:飯糰「AI產品經理大本營」 ,是黃釗hanniman建立的、行業內第一個「AI產品經理成長交流社區」,通過每天乾貨分享、每月線下交流、每季職位內推等方式,幫助大家完成「AI產品經理成長的實操路徑」,詳情可見 http://fantuan.guokr.net/groups/219/ 。
---------------------
作者:黃釗hanniman,圖靈機器人-人才戰略官,前騰訊產品經理,5年AI實戰經驗,8年互聯網背景,微信公眾號/知乎/在行ID「hanniman」,飯糰「AI產品經理大本營」,分享人工智慧相關原創乾貨,200頁PPT《人工智慧產品經理的新起點》被業內廣泛好評,下載量1萬+。
推薦閱讀:
※互聯網的下一站----產業互聯網
※百家號改版,還記得你的初心嗎?
※互聯網神經學2016-2017研究報告,七個值得研究的顛覆性創新領域
※新浪UC成IM早期通訊軟體「終結者」,80後的回憶!
※不花錢開3家600平水果o2o店,年銷售1個億!