計算中有哪些好用的文本相似度演算法?
這種演算法有很多,但沒有哪一種是完美的,一般實際應用的時候會採用多種手段相結合的方式。或者根據具體的應用場合來優化其中一項或者多項演算法。
一、編輯距離
編輯距離演算法比較容易理解,就是如果需要比對兩個字元串是否相似時,只需要算出從字元串A變化為字元串B所需要的步驟數即可,這個步驟數就是編輯距離。可以看到,兩個字元串之間的編輯距離越短,則越相似,編輯距離為零的兩個字元串完全相等。
演算法比對兩個字元串的每一個字元,當需要發生刪除、插入和改寫操作的時候,則計數一次。例如判斷 dog 與 dig 的相似性是,可以看到,首尾兩個字母是相同的,只有中間字母由o變成成了i,那麼這兩個單詞的編輯距離就是1,也就是說兩者很相似。
編輯距離演算法很容易實現,對通過替換近義詞來實現偽原創的文章相似度判斷非常有效,是被普遍採用的演算法之一。常用的編輯距離演算法有歐氏距離演算法、海明距離演算法等等。
二、TF-IDF
TF-IDF演算法,即詞頻(Term Frequency)和I逆向文件頻率(Inverse Document Frequency)演算法。它利用統計學原理,來計算一個關鍵詞在文本中出現的頻率,從而判斷這個關鍵詞相對於文本的重要性。
這種演算法一般主要用於搜索引擎權重分析,也就是說,如果某個關鍵詞只在很少的的網頁中出現,那麼搜索引擎就會給這些網頁極高的權重,當用戶搜索這個關鍵詞時,這些網頁會被優先展示。相反的,如果某個關鍵詞在大量的頁面出現,那麼這個關鍵詞的權重就很低,搜索引擎需要更深入的計算來決定這些頁面的相關性。
當把文本信息向量化並表示到二維空間時,可以利用餘弦相似度演算法,來判斷兩份文件之間的相似性。眾所周知,餘弦的取值範圍在負1和正1之間,值越趨近於1,代表兩個向量的方向越接近。越趨近於-1,則方向越相反。而接近於0,則表示兩個向量幾乎是正交的。在做文本相似性判斷時,只需要判斷向量化後的數據之間的餘弦值是不是接近1就可以得出是否相似的結論。
三、Simhash
Simhash演算法主要用於搜索引擎重複信息識別。由於傳統的編輯距離演算法和餘弦相似度演算法需要大量的運算,對於每天都要收錄海量信息的搜索引擎來說,這個計算量需要太大了,很難滿足實際應用的需求。
傳統的Hash演算法可以給數據生成一串唯一的指紋信息,比如常見的MD5和SHA-1演算法等等。這種Hash演算法廣泛應用於數據防篡改領域,因為它們只能比對完全相同的數據,只要原始信息中有一處改變,那麼最終的Hash值就會發生巨大的變化。
如果有一種Hash演算法,既可以給數據生成唯一的指紋信息,又能夠在遇到近似內容時產生相類似的Hash值,而Hash值的近似程度同原始信息的相似程度成正比,那麼就可以用來做重複信息識別了。
Simhash演算法是局部敏感Hash演算法的一種。它可以實現相似內容產生相似Hash值的功能,並且有運算速度快的優點,被諸如Google之類的搜索引擎廣泛採用。
四、LDA
LDA(Latent Dirichlet Allocation)是一種文檔主題生成模型,也被稱為一個三層貝葉斯概率模型。同樣是運用統計學原理,通過分析關鍵詞與主題之間相互的概率選擇來判斷彼此之間的概率分布,從而得到文本中潛藏的主題信息。
LDA通常與機器學習演算法相配合,是一種數據降維技術。簡單來講,就是將數據向量化,例如轉換為二維平面信息,然後再將數據降維投射到更低的維度,比如一維直線上。通過在更低維度上的投影點的密度及分布情況,來判斷數據的相似性。
當然,在實際應用中,原始數據很有可能是超過二維的,投影后的數據一般也不是直線,而是一個低維的超平面。LDA演算法還可以通過計算各個類別投影數據的均值和方差,進而得到該類別高斯分布的概率密度函數,最終實現數據分類的功能。
五、doc2vec 和 word2vec
這兩種演算法比較類似,都是神經網路機器學習演算法的一種。以word2vec為例,其利用深度學習的手段,通過訓練學習,把對數據信息的處理簡化為 K 維向量空間中的向量運算,而向量空間上的相似度通常和文本語義上的相似呈正相關。word2vec是基於關鍵詞的語義分析,它並不具備針對上下文的語義分析能力。所以在實際應用中也有一定的局限性。
doc2vec演算法在word2vec演算法的基礎上增加了一個段落向量,使之成為一個能處理可變長度文本的總結性方法,並可以在給定上下文和段落向量的情況下預測單詞的概率。類似的演算法還有sentence2vec等等。
六、依存句法
依存句法由法國語言學家L.Tesniere最先提出。它將文本信息分析成一顆句法樹,描述出各個關鍵詞之間的依存關係。也即指出了關鍵詞之間在句法上的搭配關係,這種搭配關係是和語義相關聯的。
同時,利用樹形分析法可以計算出文本中的詞序和層次的幾何值,也能計算出文本中的詞類、片語類型、句法功能、邏輯關係、語義關係的代數值。
依存句法的好處是其使用了二叉樹的結構,這種數據結構非常簡單,可以通過遞歸實現,代碼簡潔容易理解。但依存關係在實際應用中非常複雜,其計算結果往往不能直接使用,還需要進一步處理,這裡面牽扯演算法很多,就不細講了。
推薦閱讀:
※深度學習最終會淘汰掉其他所有機器學習演算法嗎?
※GitHub上最好的機器學習開源項目有哪些?
※神經網路能否發現諸如π、e等無限不循環小數的內在規律?
※能用計算機圖形學技術和機器學習等實現精細模仿人類畫手的漫畫/日式動畫風格渲染嗎?
※SVM在線性不可分的情況下,利用核函數升維後就一定線性可分嗎?