當前位置:成語大全網 - 新華字典 - NLP基礎知識和綜述

NLP基礎知識和綜述

壹種流行的自然語言處理庫、自帶語料庫、具有分類,分詞等很多功能,國外使用者居多,類似中文的jieba處理庫

為單詞序列分配概率的模型就叫做語言模型。

通俗來說, 語言模型就是這樣壹個模型:對於任意的詞序列,它能夠計算出這個序列是壹句話的概率。或者說語言模型能預測單詞序列的下壹個詞是什麽。

** n-gram Language Models **

N-gram模型是壹種典型的統計語言模型(Language Model,LM),統計語言模型是壹個基於概率的判別模型.統計語言模型把語言(詞的序列)看作壹個隨機事件,並賦予相應的概率來描述其屬於某種語言集合的可能性。給定壹個詞匯集合 V,對於壹個由 V 中的詞構成的序列S = ?w1, · · · , wT ? ∈ Vn,統計語言模型賦予這個序列壹個概率P(S),來衡量S 符合自然語言的語法和語義規則的置信度。用壹句簡單的話說,統計語言模型就是計算壹個句子的概率大小的這種模型。

n-gram模型可以減輕單詞序列沒有在訓練集中出現過而引起的問題,即數據稀疏問題

n-gram模型問題

對於n-gram模型的問題,這兩頁ppt說的很明白

N-gram模型基於這樣壹種假設,當前詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。這些概率可以通過直接從語料中統計N個詞同時出現的次數得到。常用的是二元的Bi-Gram(N=2)和三元的Tri-Gram(N=3).Bi-Gram所滿足的假設是馬爾科夫假設。

壹般常用的N-Gram模型是Bi-Gram和Tri-Gram。分別用公式表示如下:

Bi-Gram:  P(T)=p(w1|begin) p(w2|w1) p(w3|w2)***p(wn|wn-1)

Tri-Gram:  P(T)=p(w1|begin1,begin2) p(w2|w1,begin1) p(w3|w2w1)***p(wn|wn-1,wn-2)

註意上面概率的計算方法:P(w1|begin)=以w1為開頭的所有句子/句子總數;p(w2|w1)=w1,w2同時出現的次數/w1出現的次數。以此類推。

對於其中每項的計算舉個例子:

由上可見Bi-Gram計算公式中的begin壹般都是加個<s>標簽。

N-gram存在的問題:

舉壹個小數量的例子進行輔助說明:假設我們有壹個語料庫(註意語料庫),如下:

老鼠真討厭,老鼠真醜,妳愛老婆,我討厭老鼠。

想要預測“我愛老”這壹句話的下壹個字。我們分別通過 bigram 和 trigram 進行預測。

1)通過 bigram,便是要對 P(w|老)進行計算,經統計,“老鼠”出現了3次,“老婆”出現了1次,通過最大似然估計可以求得P(鼠|老)=0.75,P(婆|老)=0.25, 因此我們通過 bigram 預測出的整句話為: 我愛老鼠。

2)通過 trigram,便是要對便是要對 P(w|愛老)進行計算,經統計,僅“愛老婆”出現了1次,通過最大似然估計可以求得 P(婆|愛 老)=1,因此我們通過trigram 預測出的整句話為: 我愛老婆。顯然這種方式預測出的結果更加合理。

問題壹:隨著 n 的提升,我們擁有了更多的前置信息量,可以更加準確地預測下壹個詞。但這也帶來了壹個問題,當N過大時很容易出現這樣的狀況:某些n-gram從未出現過, 導致很多預測概率結果為0, 這就是稀疏問題。 實際使用中往往僅使用 bigram 或 trigram 。(這個問題可以通過平滑來緩解參考: /s/NvwB9H71JUivFyL_Or_ENA )

問題二:同時由於上個稀疏問題還導致N-gram無法獲得上下文的長時依賴。

問題三:n-gram 基於頻次進行統計,沒有足夠的泛化能力。

n-gram總結:統計語言模型就是計算壹個句子的概率值大小,整句的概率就是各個詞出現概率的乘積,概率值越大表明該句子越合理。N-gram是典型的統計語言模型,它做出了壹種假設,當前詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。它其中存在很多問題,再求每壹個詞出現的概率時,隨著N的提升,能夠擁有更多的前置信息量,可以使得當前詞的預測更加準確,但是當N過大時會出現稀疏問題,導致很多詞的概率值為0,為解決這壹問題,因此常用的為bigram 或 trigram,這就導致N-gram無法獲得上文的長時依賴。另壹方面N-gram 只是基於頻次進行統計,沒有足夠的泛化能力。

神經網絡語言模型

2003年 Bengio 提出,神經網絡語言模型( neural network language model, NNLM)的思想是提出詞向量的概念,代替 ngram 使用離散變量(高維),采用連續變量(具有壹定維度的實數向量)來進行單詞的分布式表示,解決了維度爆炸的問題,同時通過詞向量可獲取詞之間的相似性。

結合下圖可知它所建立的語言模型的任務是根據窗口大小內的上文來預測下壹個詞,因此從另壹個角度看它就是壹個使用神經網絡編碼的n-gram模型。

它是壹個最簡單的神經網絡,僅由四層構成,輸入層、嵌入層、隱藏層、輸出層。(從另壹個角度看它就是壹個使用神經網絡編碼的n-gram模型)

輸入是單詞序列的index序列,例如單詞‘這’在字典(大小為∣V∣)中的index是10,單詞‘是’的 index 是23,‘測’的 index 是65,則句子“這是測試”通過‘這是測’預測‘試’,窗口大小內上文詞的index序列就是 10, 23, 65。嵌入層(Embedding)是壹個大小為∣V∣×K的矩陣(註意:K的大小是自己設定的,這個矩陣相當於隨機初始化的詞向量,會在bp中進行更新,神經網絡訓練完成之後這壹部分就是詞向量),從中取出第10、23、65行向量拼成3×K的矩陣就是Embedding層的輸出了。隱層接受拼接後的Embedding層輸出作為輸入,以tanh為激活函數,最後送入帶softmax的輸出層,輸出概率,優化的目標是使得待預測詞其所對應的softmax值最大。

缺點:因為這是通過前饋神經網絡來訓練語言模型,缺點顯而易見就是其中的參數過多計算量較大,同時softmax那部分計算量也過大。另壹方面NNLM直觀上看就是使用神經網絡編碼的 n-gram 模型,也無法解決長期依賴的問題。

RNNLM

它是通過RNN及其變種網絡來訓練語言模型,任務是通過上文來預測下壹個詞,它相比於NNLM的優勢在於所使用的為RNN,RNN在處理序列數據方面具有天然優勢, RNN 網絡打破了上下文窗口的限制,使用隱藏層的狀態概括歷史全部語境信息,對比 NNLM 可以捕獲更長的依賴,在實驗中取得了更好的效果。RNNLM 超參數少,通用性更強;但由於 RNN 存在梯度彌散問題,使得其很難捕獲更長距離的依賴信息。

Word2vec中的CBOW 以及skip-gram,其中CBOW是通過窗口大小內的上下文預測中心詞,而skip-gram恰恰相反,是通過輸入的中心詞預測窗口大小內的上下文。

Glove 是屬於統計語言模型,通過統計學知識來訓練詞向量

ELMO 通過使用多層雙向的LSTM(壹般都是使用兩層)來訓練語言模型,任務是利用上下文來預測當前詞,上文信息通過正向的LSTM獲得,下文信息通過反向的LSTM獲得,這種雙向是壹種弱雙向性,因此獲得的不是真正的上下文信息。

GPT是通過Transformer來訓練語言模型,它所訓練的語言模型是單向的,通過上文來預測下壹個單詞

BERT通過Transformer來訓練MLM這種真正意義上的雙向的語言模型,它所訓練的語言模型是根據上下文來預測當前詞。

以上部分的詳細介紹在NLP之預訓練篇中有講到

語言模型的評判指標

具體參考: position,SVD) 的方法來尋找該矩陣的壹個低階近似。

概率潛在語義分析(Probability Latent Semantic Analysis ,PLSA)模型

概率潛在語義分析(PLSA)模型其實是為了克服潛在語義分析(LSA)模型存在的壹些缺點而被提出的。LSA 的壹個根本問題在於,盡管我們可以把 U k 和 V k 的每壹列都看成是壹個話題,但是由於每壹列的值都可以看成是幾乎沒有限制的實數值,因此我們無法去進壹步解釋這些值到底是什麽意思,也更無法從概率的角度來理解這個模型。

PLSA模型則通過壹個生成模型來為LSA賦予了概率意義上的解釋。該模型假設,每壹篇文檔都包含壹系列可能的潛在話題,文檔中的每壹個單詞都不是憑空產生的,而是在這些潛在的話題的指引下通過壹定的概率生成的。

在 PLSA 模型裏面,話題其實是壹種單詞上的概率分布,每壹個話題都代表著壹個不同的單詞上的概率分布,而每個文檔又可以看成是話題上的概率分布。每篇文檔就是通過這樣壹個兩層的概率分布生成的,這也正是PLSA 提出的生成模型的核心思想。

PLSA 通過下面這個式子對d和 w 的聯合分布進行了建模:

該模型中的 *z * 的數量是需要事先給定的壹個超參數。需要註意的是,上面這 個式子裏面給出了 P (w, d ) 的兩種表達方式,在前壹個式子裏, *d * 和 w 都是在給定 *z * 的前提下通過條件概率生成出來的,它們的生成方式是相似的,因此是 ‘‘對稱’’ 的;在後壹個式子裏,首先給定 d ,然後根據 P ( z | d ) 生成可能的話題 z ,然後再根據 P (w| z ) 生成可能的單詞 w,由於在這個式子裏面單詞和文檔的生成並不相似, 所以是 ‘‘非對稱’’ 的。

上圖給出了 PLSA 模型中非對稱形式的 Plate Notation表示法。其中d表示 壹篇文檔,z 表示由文檔生成的壹個話題,w 表示由話題生成的壹個單詞。 在這個模型中, d和w 是已經觀測到的變量,而z是未知的變量(代表潛在的話題)。

容易發現,對於壹個新的文檔而言,我們無法得知它對應的 P ( d ) 究竟是什麽, 因此盡管 PLSA 模型在給定的文檔上是壹個生成模型,它卻無法生成新的未知的文檔。該模型的另外的壹個問題在於,隨著文檔數量的增加, P ( z | d ) 的參數也會隨著線性增加,這就導致無論有多少訓練數據,都容易導致模型的過擬合問題。這兩點成為了限制 PLSA 模型被更加廣泛使用的兩大缺陷。

潛在狄利克雷分配(Latent Dirichlet Analysis , LDA)模型

為了解決 PLSA 模型中出現的過擬合問題,潛在狄利克雷分配(LDA)模型被 Blei 等人提出,這個模型也成為了主題模型這個研究領域內應用最為廣泛的模 型。LDA就是在PLSA的基礎上加層貝葉斯框架,即LDA就是PLSA的貝葉斯版本(正因為LDA被貝葉斯化了,所以才需要考慮歷史先驗知識,才加的兩個先驗參數)。

從上壹節我們可以看到,在 PLSA 這個模型裏,對於壹個未知的新文檔 d ,我們對於 P ( d ) 壹無所知,而這個其實是不符合人的經驗的。或者說,它沒有去使用本來可以用到的信息,而這部分信息就是 LDA 中所謂的先驗信息。

具體來說,在 LDA 中,首先每壹個文檔都被看成跟有限個給定話題中的每壹個存在著或多或少的關聯性,而這種關聯性則是用話題上的概率分布來刻畫的, 這壹點與 PLSA 其實是壹致的。

但是在 LDA 模型中,每個文檔關於話題的概率分布都被賦予了壹個先驗分布,這個先驗壹般是用稀疏形式的狄利克雷分布表示的。 這種稀疏形式的狄利克雷先驗可以看成是編碼了人類的這樣壹種先驗知識:壹般而言,壹篇文章的主題更有可能是集中於少數幾個話題上,而很少說在單獨壹篇文章內同時在很多話題上都有所涉獵並且沒有明顯的重點。

此外,LDA 模型還對壹個話題在所有單詞上的概率分布也賦予了壹個稀疏形式的狄利克雷先驗,它的直觀解釋也是類似的:在壹個單獨的話題中,多數情況是少部分(跟這個話題高度相關的)詞出現的頻率會很高,而其他的詞出現的頻率則明顯較低。這樣兩種先驗使得 LDA 模型能夠比 PLSA 更好地刻畫文檔-話題-單詞這三者的關系。

事實上,從 PLSA 的結果上來看,它實際上相當於把 LDA 模型中的先驗分布轉變為均勻分布,然後對所要求的參數求最大後驗估計(在先驗是均勻分布的前提下,這也等價於求參數的最大似然估計) ,而這也正反映出了壹個較為合理的先驗對於建模是非常重要的。

分詞就是將連續的字序列按照壹定的規範重新組合成詞序列的過程。

現有的分詞算法可分為三大類:基於字符串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。

按照是否與詞性標註過程相結合,又可以分為單純分詞方法和分詞與標註相結合的壹體化方法。

中文分詞根據實現原理和特點,主要分為以下2個類別:

(1)基於詞典分詞算法

也稱字符串匹配分詞算法。該算法是按照壹定的策略將待匹配的字符串和壹個已建立好的“充分大的”詞典中的詞進行匹配,若找到某個詞條,則說明匹配成功,識別了該詞。常見的基於詞典的分詞算法分為以下幾種:正向最大匹配法、逆向最大匹配法和雙向匹配分詞法等。

基於詞典的分詞算法是應用最廣泛、分詞速度最快的。很長壹段時間內研究者都在對基於字符串匹配方法進行優化,比如最大長度設定、字符串存儲和查找方式以及對於詞表的組織結構,比如采用TRIE索引樹、哈希索引等。

(2)基於統計的機器學習算法

這類目前常用的是算法是HMM、CRF(條件隨機場)、SVM、深度學習等算法,比如stanford、Hanlp分詞工具是基於CRF算法。以CRF為例,基本思路是對漢字進行標註訓練,不僅考慮了詞語出現的頻率,還考慮上下文,具備較好的學習能力,因此其對歧義詞和未登錄詞的識別都具有良好的效果。

常見的分詞器都是使用機器學習算法和詞典相結合,壹方面能夠提高分詞準確率,另壹方面能夠改善領域適應性。

隨著深度學習的興起,也出現了 基於神經網絡的分詞器 ,例如有人員嘗試使用雙向LSTM+CRF實現分詞器, 其本質上是序列標註 ,所以有通用性,命名實體識別等都可以使用該模型,據報道其分詞器字符準確率可高達97.5%。算法框架的思路與論文《Neural Architectures for Named Entity Recognition》類似,利用該框架可以實現中文分詞,如下圖所示:

首先對語料進行字符嵌入,將得到的特征輸入給雙向LSTM,然後加壹個CRF就得到標註結果。

目前中文分詞難點主要有三個:

1、分詞標準 :比如人名,在哈工大的標準中姓和名是分開的,但在Hanlp中是合在壹起的。這需要根據不同的需求制定不同的分詞標準。

2、歧義 :對同壹個待切分字符串存在多個分詞結果。

歧義又分為組合型歧義、交集型歧義和真歧義三種類型。

壹般在搜索引擎中,構建索引時和查詢時會使用不同的分詞算法。常用的方案是,在索引的時候使用細粒度的分詞以保證召回,在查詢的時候使用粗粒度的分詞以保證精度。

3、新詞 :也稱未被詞典收錄的詞,該問題的解決依賴於人們對分詞技術和漢語語言結構的進壹步認識。

典型的文本分類過程可以分為三個步驟:

1. 文本表示(Text Representation)

這壹過程的目的是把文本表示成分類器能夠處理的形式。最常用的方法是向量空間模型,即把文本集表示成詞-文檔矩陣,矩陣中每個元素代表了壹個詞在相應文檔中的權重。選取哪些詞來代表壹個文本,這個過程稱為特征選擇。常見的特征選擇方法有文檔頻率、信息增益、互信息、期望交叉熵等等。為了降低分類過程中的計算量,常常還需要進行降維處理,比如LSI。

2. 分類器構建(Classifier Construction)

這壹步驟的目的是選擇或設計構建分類器的方法。不同的方法有各自的優缺點和適用條件,要根據問題的特點來選擇壹個分類器。我們會在後面專門講述常用的方法。選定方法之後,在訓練集上為每個類別構建分類器,然後把分類器應用於測試集上,得到分類結果。

3. 效果評估(Classifier Evaluation)

在分類過程完成之後,需要對分類效果進行評估。評估過程應用於測試集(而不是訓練集)上的文本分類結果,常用的評估標準由IR領域繼承而來,包括查全率、查準率、F1值等等。

1. Rocchio方法

每壹類確定壹個中心點(centroid),計算待分類的文檔與各類代表元間的距離,並作為判定是否屬於該類的判據。Rocchio方法的特點是容易實現,效率高。缺點是受文本集分布的影響,比如計算出的中心點可能落在相應的類別之外。

2. 樸素貝葉斯(na?ve bayes)方法

將概率論模型應用於文檔自動分類,是壹種簡單有效的分類方法。使用貝葉斯公式,通過先驗概率和類別的條件概率來估計文檔對某壹類別的後驗概率,以此實現對此文檔所屬類別的判斷。

3. K近鄰(K-Nearest Neightbers, KNN)方法

從訓練集中找出與待分類文檔最近的k個鄰居(文檔),根據這k個鄰居的類別來決定待分類文檔的類別。KNN方法的優點是不需要特征選取和訓練,很容易處理類別數目多的情況,缺點之壹是空間復雜度高。KNN方法得到的分類器是非線性分類器。

4. 支持向量機(SVM)方法

對於某個類別,找出壹個分類面,使得這個類別的正例和反例落在這個分類面的兩側,而且這個分類面滿足:到最近的正例和反例的距離相等,而且是所有分類面中與正例(或反例)距離最大的壹個分類面。SVM方法的優點是使用很少的訓練集,計算量小;缺點是太依賴於分類面附近的正例和反例的位置,具有較大的偏執。

文本聚類過程可以分為3個步驟:

1. 文本表示(Text Representation)

把文檔表示成聚類算法可以處理的形式。所采用的技術請參見文本分類部分。

2. 聚類算法選擇或設計(Clustering Algorithms)

算法的選擇,往往伴隨著相似度計算方法的選擇。在文本挖掘中,最常用的相似度計算方法是余弦相似度。聚類算法有很多種,但是沒有壹個通用的算法可以解決所有的聚類問題。因此,需要認真研究要解決的問題的特點,以選擇合適的算法。後面會有對各種文本聚類算法的介紹。

3. 聚類評估(Clustering Evaluation)

選擇人工已經分好類或者做好標記的文檔集合作為測試集合,聚類結束後,將聚類結果與已有的人工分類結果進行比較。常用評測指標也是查全率、查準率及F1值。

1.層次聚類方法

層次聚類可以分為兩種:凝聚(agglomerative)層次聚類和劃分(divisive)層次聚類。凝聚方法把每個文本作為壹個初始簇,經過不斷的合並過程,最後成為壹個簇。劃分方法的過程正好與之相反。層次聚類可以得到層次化的聚類結果,但是計算復雜度比較高,不能處理大量的文檔。

2.劃分方法

k-means算法是最常見的劃分方法。給定簇的個數k,選定k個文本分別作為k個初始簇,將其他的文本加入最近的簇中,並更新簇的中心點,然後再根據新的中心點對文本重新劃分;當簇不再變化時或經過壹定次數的叠代之後,算法停止。k-means算法復雜度低,而且容易實現,但是對例外和噪聲文本比較敏感。另外壹個問題是,沒有壹個好的辦法確定k的取值。

3.基於密度的方法

為了發現任意形狀的聚類結果,提出了基於密度的方法。這類方法將簇看作是數據空間中被低密度區域分割開的高密度區域。常見的基於密度的方法有DBSCAN, OPTICS, DENCLUE等等。

4.神經網絡方法

神經網絡方法將每個簇描述為壹個標本,標本作為聚類的"原型",不壹定對應壹個特定的數據,根據某些距離度量,新的對象被分配到與其最相似的簇中。比較著名的神經網絡聚類算法有:競爭學習(competitive learing)和自組織特征映射(self-organizing map)[Kohonen, 1990]。神經網絡的聚類方法需要較長的處理時間和復雜的數據復雜性,所以不適用於大型數據的聚類。