自然語言處理之文本相似度計算

2020-12-13 金融科技實戰

文 | 光大科技大數據部 盧格潤

在金融科技的業務場景下,我們不可避免地應用到自然語言處理(NLP)的技術去解決問題,比如智能問答系統、資訊輿情的分析等……

在自然語言處理中,很多實際應用具有共性問題,本文就以文本相似度的計算為例介紹自然語言處理解決問題的思路。

文本向量化相似度的計算相關示例總結

文本向量化

無論是中文、英文還是標點符號,都是機器無法直接做計算的,需要先將文本轉化為可計算和比較的數學表示的形式。

如何將一句話轉化為數學的形式呢?人們能想到最簡單的方式就是統計一句話有多少個詞;然後很自然的比較兩句話的相似程度就看它們有多少個詞一樣就好了;再比上兩個句子的總詞數,就能得到一個 0-1 之間的相似度了。這就是 Jaccard 相似度計算方法:

僅從一個詞語是否出現的角度,進行數學表示,進而進行相似度計算顯然是沒有充分利用文本中的信息的。人們希望對一句話數學的表示能夠更多地體現它包含的語義信息。因此人們想到,比起統計詞的總數,記錄每個出現的詞和其出現的頻率會獲得更多的信息,這就是構造 Bag of words(詞袋)。比如下列一個片段:

1.it was the best of times

2.it was the worst of times

3.it was the age of wisdom

4.it was the age of foolishness

這個片段中出現的所有詞構成一個詞袋["it","was","the","best","of","times","worst","age","wisdom","foolishness"],詞袋中共有10個詞,根據每個詞是否出現可以將每個句子轉化為10維的向量。對應詞語在整個片段中出現的順序,第一句話可以轉化為向量, 相應地,第二、三、四句話分別為,,。

在詞袋的基礎上能獲得哪些語義特徵呢?首先每個詞的重要性是不同的,希望比較相似度時更重要的詞能佔有更多的權重。因此需要想辦法能夠給句子中的詞做關鍵詞排序,一個經典的評估一個單詞重要程度的方法是 TF-IDF(詞頻-逆文檔頻率)。人們在閱讀時知道一個詞重要是因為人們讀過很多書,學習到了這個詞是重要的。TF-IDF 在做重要性排序時,也是學習了很多文檔才獲得的有關重要性的信息。基本思想是一個詞在一篇文章中出現的頻率越高且在其它文章中出現的頻率越低,這個詞就越重要。計算一個詞在一篇文檔中的重要性時考慮:

該詞在該文檔中出現的頻率該文檔所有詞出現的詞頻總數

語料庫的文檔總數包含該次的文檔數

詞語的權重就是 。對於之前例子中的向量,每個元素都需要乘上這個對應的權重。

之後人們又想到,詞袋模型並不能保留原本語句的語序信息,而我們或許可以通過語序得到一些同義詞,這些詞本身就比另一些詞更相似。這時一個假設被提出:如果兩個詞的上下文相似,那麼這兩個詞更有可能是同義詞。Word2Vec[1]就是利用這一假設訓練出詞向量來表示一個詞。Word2Vec 有兩種訓練方法,這裡介紹通過上下文預測中間這個詞被稱為 CBOW(Continuous Bag-of-Words Model)的方法(另一種訓練方法SKIP-GRAM與它正相反,通過中間詞預測上下文)。它其實是一個三層神經網絡模型。如圖所示:

以圖中的神經網絡為例,它Input Layer 是一個詞上下文各兩個詞的 one-hot 編碼4個10維的向量:,實際的 Output 是一個概率分布,訓練目標是讓這個概率分布儘可能接近所要預測詞的 one-hot 編碼.

具體過程如下:

這裡one-hot 編碼是 10維向量,假設需要得到的是 8 維詞向量。通過訓練得到兩個權值矩陣 ()和 ()。從 Input Layer 到 Hidden Layer,分別乘上 W 得到4個 8 維的向量,再取平均得到一個 8 維向量;從 Hidden Layer 到 Output Layer, 又與 相乘,再用 Softmax 處理得到一個概率分布。這個概率分布與要預測的詞的 one-hot 編碼越接近越好。事實上,就是我們需要的8維詞向量;有了每個詞對應的詞向量後,我們可以將句子轉化為一組向量表示。例如詞向量為8維,片段一中的每句話有6個詞,就將每個句子轉化為6個8維的向量作為一組。

將詞轉化為詞向量也就稱之為詞嵌入(Word Embedding),這裡所說的 Word2Vec 是實現詞嵌入的一種算法。

由詞嵌入再往下就要講到預訓練語言模型了。預訓練語言模型是 NLP 中很重要的研究領域,它的想法等同要讓一個小孩去寫作,要先讓其識字、讀書、理解文字的意義之後再動筆寫東西。為了讓機器實現這一想法,先通過一些任務預訓練(Pre-training)出一個模型,這個模型能夠提取出一些通用的語義特徵,然後再在一些具體的任務上比如文本分類、序列標註上做精調(Fine-tuning),這樣通過之前對語義理解能夠去做各種各樣的下遊任務。

其實詞嵌入就相當於預訓練語言模型中預訓練的這一部分。當然現在的預訓練語言模型已經在 CBOW 的基礎上改進了很多,並且運用了特徵抽取器使學習到的語義能夠更好地運用於下遊任務。

關於預訓練語言模型這裡暫不做更多的介紹,先繼續講講將句子轉化為能比較的向量以後該怎樣計算相似度。

相似度的計算

從第一部分的內容我們將一個句子轉化成了兩種形式:一種是一個句子轉化為一個向量的形式;另一種是句子中的每個詞都轉化為一個向量(Word2Vec)。

通常比較兩個長度相等的向量(N 維)可以計算餘弦距離或歐式距離:

餘弦相似度:歐氏距離:而 Word2Vec 將每個句子轉化為了一組 N 維向量,要比較兩組 N 維向量,我們需要再將每組 N 維向量轉化為一個 N 維向量再計算餘弦相似度或歐氏距離。這個過程稱為 Sentence embedding。

首先可以將一個句子中所有詞向量取平均;另外可以結合第一部分所說的 TF-IDF 給所有詞向量賦予權重後做加權平均。

還有一種取權重做加權的方法稱為SIF(smooth inverse frequency)[2],這種方法的核心是通過去掉一組句子的共有成分來保留各自關鍵的部分,以之前的片段為例,共有4個句子,每個句子包含6個詞向量,每個詞向量有8維:

首先對每個詞 計算一個權重為 其中 為超參數,為 在所有句子中的詞頻(通過在訓練集句子中的詞頻做估計),得詞頻越低權重越大;對每個句子中6個詞向量根據對應詞的權重做加權平均得到4個8維的句向量 ~;~作為列得到一個矩陣 X,X 的第一主成分為 u(通過奇異值分解得到);最後減去在 u 上的投影得到最終的句向量 :相關示例

利用gensim 庫[3]訓練 word2vec 模型:

from gensim.models import Word2Vec#text為語料庫model = Word2Vec(text, size=8, window=5, min_count=1)model.save("word2vec.model")sentence0=['it', 'was', 'the', 'best', 'of', 'times']sentence1=['it', 'was', 'the', 'worst', 'of', 'times']#vector0和vector1分別存兩組詞向量vector0=dict()for word in sentence0: vector0[word]=model.wv[word]vector1=dict()for word in sentence1: vector1[word]=model.wv[word]在實際訓練時 text 為我們所準備的語料庫,size 是我們所需要的詞向量維度,window 是每次去上下文共多少個詞訓練,min_count 為詞最少出現的次數。之後通過這個 word2vec.model 我們可以將需要計算相似度的句子做一個 word embedding。

利用 gensim 庫訓練 TF-IDF 模型:

from gensim.models import TfidfModelfrom gensim.corpora import Dictionary#document為一組句子,包括sentence0和sentence0dct = Dictionary(document) corpus = [dct.doc2bow(line) for line in document]model1= TfidfModel(corpus) 根據TF-IDF模型找到每個詞向量與對應的權重,每個句子中所有詞向量加權平均得到句向量 s0 和 s1:

s0=0wd=dict(model1[corpus[0]])for word in sentence0: w=wd[dct.token2id[word]] s0+= vector0[word]*ws0=s0/len(sentence0)s1=0wd1=dict(model1[corpus[1]])for word in sentence1: w=wd1[dct.token2id[word]] s1+= vector1[word]*ws1=s1/len(sentence1)利用公式計算餘弦相似度:

import numpy as npd1=np.dot(s0,s1)/(np.linalg.norm(s0)*np.linalg.norm(s1))總結

NLP 是一個發展很快的人工智慧領域,新的算法不斷出現打敗之前的算法,本文講解了做文本相似度計算在內的自然語言處理任務一個很基本的思路:都是需要先在大量的語料上進行學習,然後根據所學將文本用數學表示,再根據數學表示的形式進行之後的處理。

本文介紹的方法也存在一些明顯缺點,主要有兩點:1、沒有考慮多義詞;2、沒法根據具體任務做動態優化。

在此希望對自然語言處理感興趣的讀者能持續關注這一專題,之後會繼續給大家分享現在的 NLP 算法是如何處理這些問題的。

參考資料

[1]Efficient Estimation of Word Representation in Vector Space: https://arxiv.org/pdf/1301.3781v3.pdf

[2]Sanjeev Arora, et al. 2017. A Simple but Tough-to-Beat Baseline for Sentence Embeddings: https://openreview.net/pdf?id=SyK00v5xx

[3]GENSIM: https://radimrehurek.com/gensim/models/word2vec.html

我們是光大科技公司的追光實驗室團隊,將不定期推出數據挖掘和算法相關的數據科學原創文章。團隊定位打造基於知識驅動的機器學習實驗室,由實踐經驗豐富的數據分析挖掘工程師和專注算法的數據科學家精心準備相關作品,志在分享結合實際業務的理論應用和算法創新,以及其中的心得體會。

相關焦點

  • 自然語言語義相似度計算方法
    由於文本相似度計算在文檔複製檢查、信息檢索和機器翻譯等領域都有十分廣泛的應用,所以,近年來有越來越多的學者致力於文本相似度算法的研究。總體來看,文本相似度的計算方法主要分為兩大類:一類是基於統計學的計算方法,此種方法需要大規模的語料庫,並且在計算時沒有考慮文本的句子結構信息和語義信息,計算的結果有時會與人對自然語言的理解不相符合;另一類是基於語義理解的計算方法,這種方法不需要大規模的語料庫,但需要依賴於具有層次結構關係的語義詞典,計算結果相對準確,與人對自然語言的理解較為符合。
  • 計算文本相似度常用的四種方法
    在這篇博文中,作者比較了各種計算句子相似度的方法,並了解它們是如何操作的。詞嵌入(word embeddings)已經在自然語言處理領域廣泛使用,它可以讓我們輕易地計算兩個詞語之間的語義相似性,或者找出與目標詞語最相似的詞語。然而,人們關注更多的是兩個句子或者短文之間的相似度。如果你對代碼感興趣,文中附有講解細節的Jupyter Notebook地址。以下是論智的編譯。
  • 思必馳在中文文本相似度計算任務上的探索與進展
    文本相似度計算旨在識別兩段文本在語義上是否相似,是自然語言處理領域的一個重要研究方向,其在智能問答、信息檢索等領域都發揮重要作用,具有很高的商業價值。近期,思必馳知識服務團隊在中文文本相似度計算方向投入研究,並取得階段性成果:1)在第十四屆全國知識圖譜與語義計算大會(CCKS: China Conference on Knowledge Graph and Semantic Computing)[1]上發表相關論文一篇《Neural Fusion Model for Chinese Semantic Matching》
  • 【論文】文本相似度計算綜述
    相關度體現在文本共現或者以任何形式相互關聯(包括上下位關係、同義關係、反義關係、部件-整體關係、值-屬性關係等)反映出文本的組合特點。而相似度是相關度的一種特殊情況,包括上下位關係和同義關係。由此得出,文本的相似度越高,則相關度越大,但是相關度越大並不能說明相似度高。相似度一般用[0,1]表示,該實數可以通過語義距離計算獲得。
  • Python自然語言處理實戰:兩篇文章相似度清晰透明
    Python自然語言處理實戰:兩篇文章相似度清晰透明 工程師譚軍 發表於 2018-07-09 09:22:58 此書專注於中文的自然語言處理,以Python及其相關框架為工具
  • 一文講述常見的文本相似度計算方法
    作者 | LU_ZHAO責編 | 徐威龍前言在自然語言處理中,我們經常需要判定兩個東西是否相似。在對語料進行預處理的時候,我們需要給予文本的相似度,把相似度高的重複主題過濾掉。總之,相似度是一種非常有用的工具,可以幫助我們解決很多問題。
  • 人工智慧實踐應用——自然語言處理入門介紹
    自然語言處理(NLP)是計算機科學,人工智慧,語言學關注計算機和人類(自然)語言之間的相互作用的領域。因此,自然語言處理是與人機互動的領域有關的。在自然語言處理面臨很多挑戰,包括自然語言理解,因此,自然語言處理涉及人機互動的面積。
  • Kaggle文本語義相似度計算Top5解決方案分享
    今年和去年前後相繼出現了多個關於句子相似度判定的比賽,即得定兩個句子,用算法判斷是否表示了相同的語義或者意思。數據集未經過脫敏處理,用真實的英文單詞標識https://dc.cloud.alipay.com/index#/topic/intro?id=8問題相似度計算,即給定客服裡用戶描述的兩句話,用算法來判斷是否表示了相同的語義。
  • NLP實戰之基於TFIDF的文本相似度計算
    0,此時就需要對IDF做平滑處理,改善後的IDF計算公式如下所示:那麼最終詞條:當一個詞條在文檔中出現的頻率越高,且新鮮度低(即普遍度低),則其對應的TF-IDF值越高。)中的TF-IDF值為:更多詳細的關於TFIDF的介紹可以參考關於TF-IDF的其他實戰:基於TFIDF計算文本相似度
  • 十分鐘學習自然語言處理概述
    2 什麼是自然語言處理?自然語言處理是計算機科學領域與人工智慧領域中的一個重要方向。它研究人與計算機之間用自然語言進行有效通信的理論和方法。融語言學、計算機科學、數學等於一體的科學。自然語言處理原理:形式化描述-數學模型算法化-程序化-實用化語音的自動合成與識別、機器翻譯、自然語言理解、人機對話、信息檢索、文本分類、自動文摘等。3 常用中文分詞?
  • 使用gensim進行文本相似度計算
    評論和商品描述的相似度越高,說明評論的用語比較官方,不帶太多感情色彩,比較注重描述商品的屬性和特性,角度更客觀。再比如知乎、貼吧等問答社區內問題下面有很多回復者,如何快速過濾掉與問題無關的回答或者垃圾廣告??那麼Python 裡面有計算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強大。
  • 【TF-IDF】傳統方法TF-IDF解決短文本相似度問題
    學校 | 中國藥科大學 藥學信息學碩士知乎專欄 | 自然語言處理相關論文前幾天寫了一篇短文本相似度算法研究的文章,不過裡面介紹的方法基本上都是基於詞向量生成句子向量的方法。今天在這裡就介紹一下傳統算法TF-IDF是如何計算短文本相似度的。TF-IDF是英文Term Frequency–Inverse Document Frequency的縮寫,中文叫做詞頻-逆文檔頻率。那麼,TF-IDF是怎麼產生的?又是從何而來呢?在一個文本中,當一個詞彙出現很多次時,我們往往認為這個詞是重要的,可以代表該文本。
  • 文本分析 詞頻與餘弦相似度
    上一期,我們介紹了文本相似度的概念,通過計算兩段文本的相似度,我們可以:對垃圾文本(比如小廣告)進行批量屏蔽;對大量重複信息(比如新聞)進行刪減;對感興趣的相似文章進行推薦,等等。那麼如何計算兩段文本之間的相似程度?
  • 慧科訊業AI實驗室競技國際自然語言處理與中文計算大會文本摘要技術奪冠
    第七屆國際自然語言處理與中文計算大會(NLPCC 2018)「單文本摘要」技術評測結果公布,慧科訊業AI實驗室
  • 計算相似度
    在機器學習中,經常要度量兩個對象的相似度,例如k-最近鄰算法,即通過度量數據的相似度而進行分類。在無監督學習中,K-Means算法是一種聚類算法,它通過歐幾裡得距離計算指定的數據點與聚類中心的距離。在推薦系統中,也會用到相似度的計算(當然還有其他方面的度量)。
  • 機器不學習:基於深度學習CNN的短文本相似度計算方案
    機器學習深度學習乾貨棧 www.jqbxx.com基於CNN模型的短文本相似度的計算方法可以大致分為兩類:一類是基於Siamese結構的神經網絡模型,先分別學習輸入的文本對兒的句子向量表達,再基於句子向量計算相似度;另一類是直接以詞語粒度的相似度矩陣作為輸入,學習並計算文本相似度。
  • 深度學習在自然語言處理研究上的進展
    本文從詞嵌入、基礎模型和應用三個方面簡要地回顧和梳理近兩年深度學習在自然語言處理領域的進展。1.詞嵌入自然語言由詞構成。深度學習模型首先需要將詞表示為稠密向量,也叫詞嵌入。早期研究者並沒有太多關注詞嵌入的語言學解釋,僅僅將其作為模型參數。因為詞嵌入是一個稠密向量,這樣不同詞嵌入就存在了距離(或相似度)。一個好的詞嵌入模型應該是:對於相似的詞,他們對應的詞嵌入也相近。
  • 自然語言處理技術在證券行業的應用
    一、背景及意義近年來自然語言處理技術在金融領域得到了廣泛的應用,包括粗粒度的資訊輿情分析,中粒度的表格提取與識別和細粒度的勾稽關係檢查。自然語義處理的核心技術包含文檔結構識別、文本內容理解、表格理解以及跨期和跨區的文本塊理解。目前在金融領域的應用主要是在投行和風控領域。
  • R語言自然語言處理:文本向量化——詞嵌入(Word Embedding)
    作者:黃天元,復旦大學博士在讀,目前研究涉及文本挖掘、社交網絡分析和機器學習等。
  • CCF NLPCC 2018 自然語言處理與中文計算國際會議
    CCF 自然語言處理與中文計算國際會議 (NLPCC) 是由中國計算機學會主辦的中文信息技術專業委員會年度學術會議,是專注於自然語言處理及中文計算領域的國際會議。去年,第六屆自然語言處理及中文計算大會(NLPCC 2017)在大連成功舉辦。為此,雷鋒網(公眾號:雷鋒網)AI科技評論曾採訪 CCF 中文信息技術專委會主任、微軟亞洲研究院副院長周明博士及 CCF 中文信息技術專委會秘書長、北京大學趙東巖研究員,了解了中國 NLP 研究及 NLPCC 大會的發展歷程及未來規劃。