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

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

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

相關焦點

  • 思必馳在中文文本相似度計算任務上的探索與進展
    文本相似度計算旨在識別兩段文本在語義上是否相似,是自然語言處理領域的一個重要研究方向,其在智能問答、信息檢索等領域都發揮重要作用,具有很高的商業價值。  該會議是國內知識圖譜、語義技術、連結數據等領域的核心學術會議,聚集了知識表示、自然語言理解、知識獲取、智能問答、連結數據、圖資料庫、圖計算、自動推理等相關技術領域的和研究人員的學者和研究人員。  2)在「千言數據集:文本相似度」評測[2]中取得階段性進展。
  • 自然語言處理的應用前景
    自然語言處理(NLP)的定義 自然語言處理(NLP)是人工智慧技術的一個分支,它使計算機能夠像人們一樣理解、處理和生成語言,並且在商業中的應用正在迅速增長。 雖然自然語言處理(NLP)這一術語最初指的是人工智慧系統的閱讀能力,但它後來成為所有計算語言學的一種通俗說法。
  • 阿爾伯塔大學博士畢業論文:基於圖結構的自然語言處理
    機器之心發布機器之心編輯部自然語言處理(Natural Language Processing)是人工智慧的核心問題之一,旨在讓計算機理解語言,實現人與計算機之間用自然語言進行通信。這篇博士論文將自然語言處理和文本挖掘的多個核心任務與圖結構的強大表示能力結合起來,從而充分利用深度學習的表示能力和文本中的結構信息來解決諸多問題:(1)組織信息(Information Organization):提出了基於樹/圖結構的短文本/長文本對的分解算法以提高語意匹配任務(semantic matching)。
  • 自然語言處理之詞性標註
    從組合和聚合關係來說,一個詞類是指:在一個語言中,眾多具有相同句法功能、能在同樣的組合位置中出現的詞,聚合在一起形成的範疇。 詞性是語言學中的術語,是最普遍的語法的聚合。它是指在語言中以詞本身的特點(語法特徵、句法功能、形態變化等)、兼顧詞彙意義等對詞語進行劃分分類的依據,詞類即根據詞性進行劃分後的結果。
  • 科普丨什麼是NLP(自然語言處理)
    自然語言處理(NLP)是一種專業分析人類語言的人工智慧。(下文皆簡稱為「NLP」),它的工作原理是這樣的:接收自然語言,這種語言是通過人類的自然使用演變而來的,我們每天都用它來交流轉譯自然語言,通常是通過基於概率的算法分析自然語言並輸出結果
  • 信息工程學院承辦第九屆CCF自然語言處理與中文計算國際會議
    2020年10月16-17日,第九屆CCF自然語言處理與中文計算國際會議(The Ninth CCF Conference會議開幕式由中國計算機學會自然語言處理專委會秘書長萬小軍教授主持,鄭州大學黨委副書記、副校長王宗敏到會致辭,王校長代表鄭州大學向蒞臨會議的各位領導、專家表示誠摯歡迎。王校長介紹了鄭州大學的辦學規模、學科特點,重點對鄭州大學信息學科的建設情況和取得的成績以及自然語言處理實驗室進行了介紹。
  • 自然語言處理中的9個不可不知的研究熱點
    IJCAI是人工智慧領域的頂級國際學術會議,在演講中,賈珈基於IJCAI 2020的錄用論文內容,按算法層面和任務層面兩個維度,從無監督預訓練、跨語言學習、元學習和少樣本學習、遷移學習、誤差、知識融合、問答、自然語言生成、多模態這九個方面介紹了關於自然語言處理的主要成果和研究趨勢。
  • 送10本HanLP作者新書《自然語言處理入門》,人人都能看懂的NLP入門書
    然而我認為一本書不應當局限於代碼,而應當讓讀者知其所以然,而彼時我覺得自己才疏學淺,寫不出滿意之作。後來經過幾年的完善,HanLP 成為 GitHub 上最受歡迎的自然語言處理項目,我對自然語言處理的理解也系統化了一些。正巧圖靈的王軍花老師跟我約稿, 我想是時候將這些年的收穫總結一下了。並且,最終,這是一本通用的 NLP 入門書,HanLP 只是作為案例展現。
  • NLP的文本分析與特徵工程
    摘要在本文中,我將使用NLP和Python解釋如何為機器學習模型分析文本數據和提取特徵。自然語言處理(NLP)是人工智慧的一個研究領域,它研究計算機與人類語言之間的相互作用,特別是如何對計算機進行編程以處理和分析大量自然語言數據。NLP常用於文本數據的分類。
  • 竹間智能:從一年跨越到12秒,文本智能處理讓石油巨頭科研效率提千倍
    對於新上傳的項目書通過文檔抽取工具完成文本轉換及抽取,將文檔抽取的轉換的文本入查重庫,對待查文檔及歷史文檔進行語義分析、詞句分析,計算相似結果。將查重結果匯總,供用戶瀏覽或下載。這一系列看似複雜的流程,而通過竹間智能的Gemini認知知識推理平臺即可進行可視化操作。現在該企業進行新文檔查重平均僅需12s,效率至少提高上千倍。
  • 除了自然語言處理,你還可以用Word2Vec做什麼?
    本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。儘管詞嵌入(Word2Vec)技術目前主要用在自然語言處理的應用中,例如機器翻譯;但本文指出,該技術還可以用於分類特徵處理,把文本數據轉換成便於機器學習算法直接使用的實值向量,從而提供了一種看待詞嵌入(Word2Vec)應用的新視角。
  • 自然語言處理暢談之機器翻譯技術發展歷程
    據統計,世界上大約有6000多種語言,但很多語言已經接近絕跡。利用計算機軟體實現不同語言之間的智能翻譯,成為了人工智慧領域的一個夢想。也有人稱機器翻譯是自然語言處理領域的皇冠明珠,只有解決了語言分析的所有難題,才能真正攻破機器翻譯這座堡壘。
  • Python文本處理工具都有哪些?
    從網頁上獲取文本數據之後,依據任務的不同,就需求進行根本的文本處理了,譬如關於英文來說,需求根本的tokenize,關於中文,則需求常見的中文分詞。那麼,Python文本處理東西都有哪些呢?今天就跟隨小編一起來了解下吧!
  • 當前計算語言學發展的幾個特點
    當今網際網路的普及又對自然語言的計算機處理水平提出了更高的要求,世界各國也因此更加重視計算語言學的研究。當前計算語言學發展的特點主要表現在以下五個方面。 第一,基於句法—語義規則的理性主義方法受到質疑。隨著語料庫建設和語料庫語言學的崛起,大規模真實文本的處理成為計算語言學研究的主要戰略目標,基於語言大數據的經驗主義方法在計算語言學中獨佔鰲頭。理性主義方法的一個重要弱點表現在實踐方面。
  • 大規模數據的相似度計算方法 Min Hashing 和 LSH
    在數據挖掘任務中都涉及了海量數據的相似度計算,例如檢索文檔的相似度,用戶之間的相似度等。這些數據通常維度很高,用 one-hot 編碼的文檔數據維度等於字典的大小,在數據量大,數據維度高的情況下,計算對象兩兩之間的相似度需要耗費大量的時間。
  • 文本挖掘實操|用文本挖掘剖析54萬首詩歌,我發現了這些
    針對上述目標,本文的實現路線圖,同時也是本文的行文脈絡,如下所示(點擊圖片可放大查看):值得注意的是,上述實現路徑中,涉及到自然語言處理的兩大組成部分,即自然語言理解(分詞、語義建模、語義相似度、聚類和分類等)和自然語言生成(詩歌生成和詩歌翻譯), 看完也會對自然語言處理有一定的了解。
  • 文本分類六十年
    作者 | Lucy出品 | AI科技大本營文本分類是自然語言處理中最基本而且非常有必要的任務,大部分自然語言處理任務都可以看作是個分類任務。近年來,深度學習所取得的前所未有的成功,使得該領域的研究在過去十年中保持激增。
  • 中文語言處理專家慧科訊業AI Lab助力「金融+AI」
    在2018年第七屆國際自然語言處理與中文計算大會(NLPCC 2018)「單文本摘要」技術評測中,慧科訊業Wisers AI Lab自動摘要技術從包括清華、北大、中科院等國內頂級院校和研究機構在內的18個參賽團隊中脫穎而出,獲得第一名。
  • Facebook 自然語言處理新突破:新模型能力趕超人類 & 超難 NLP 新...
    儘管近年來基於深度學習的方法加速了語言處理的進展,但在處理大量標記訓練數據不易獲得的任務時,現有系統的處理水平仍然是有限的。因此,Facebook 聯合 Deepmind Technologies、紐約大學(NYU)及華盛頓大學(UW)合作構建新基準 SuperGLUE,並發布了相關內容介紹該高難度測試基準,雷鋒網 AI 開發者將其整理及編譯如下。
  • 使用Python和GloVe詞嵌入模型提取新聞和文章的文本摘要
    機器學習的自然語言處理(NLP)模塊提供了許多可用於文本摘要的算法。文本摘要有兩種主要方法:創建抽象式摘要:該技術使用高級的NLP方法來生成摘要,該摘要所使用的單詞句子是全新的。這意昧著,摘要是用文章中未使用的詞創建的。