Part2文本處理技術(shù):文本數(shù)據(jù)處理、表示、語言模型

六. 文本處理

一. 文本分析流程與分詞

1. 文本分詞流程

就像其他的領(lǐng)域有自己的經(jīng)典流程一樣,一個文本分析的項目也有屬于自己的流程。雖然每一個NLP項目有所不同,但至于流程來說沒有太多本質(zhì)的區(qū)別。這里會涉及到如分詞、停用詞過濾、文本向量的轉(zhuǎn)化等步驟。


2. 分詞工具的使用


分詞是所有工作的第一步,分詞的準(zhǔn)確性直接影響對后續(xù)任務(wù)的表現(xiàn)。但分詞技術(shù)相對比較成熟,也有很多開源的工具可用來做中文或者對其他語言的分詞。在這里,結(jié)巴分詞算是最經(jīng)典且簡單的中文分詞工具。下面以結(jié)巴分詞為例來說明如何使用工具來分詞。


3. 最大匹配算法

是貪心算法,效率很高,只能給到局部最優(yōu)解。

前向最大匹配:需要設(shè)置窗口h大小,需要給定一個詞庫,從前面到后面最大匹配。h取決于詞庫里的單詞有多長,盡量匹配詞庫里的所有單詞。

后向最大匹配

雙向最大匹配

匹配算法缺點:沒有考慮語義,沒考慮單詞與單詞之間的語義關(guān)系。

算法并不能保證找到的是最好的分詞結(jié)果。整個過程是貪心策略,尋求的是局部最好的選項,但從全局來講未必是最好的。另一方面,由于是貪心策略,所以分詞的效率也很高。

4. 考慮語義的一種分詞方法


前提是給定一個詞典,并且給定在語言模型下每個單詞的概率。概率乘積最大的是最好的分詞。

看到乘積很多的,需要將其轉(zhuǎn)化為加法,比如加上log,因為如果某個值小于1,乘以其他小的數(shù),會導(dǎo)致計算機溢出。

維特比算法:看一下維基百科的解釋,維特比算法(Viterbi algorithm)是一種動態(tài)規(guī)劃算法。它用于尋找最有可能產(chǎn)生觀測事件序列的維特比路徑——隱含狀態(tài)序列,特別是在馬爾可夫信息源上下文和隱馬爾可夫模型中。維特比算法就是求所有觀測序列中的最優(yōu),求所有路徑中最優(yōu)路徑,最容易想到的就是暴力解法,直接把所有路徑全部計算出來,然后找出最優(yōu)的。這方法理論上是可行,但當(dāng)序列很長時,時間復(fù)雜夫很高。而且進行了大量的重復(fù)計算,viterbi算法就是用動態(tài)規(guī)劃的方法就減少這些重復(fù)計算。

viterbi算法是每次記錄到當(dāng)前時刻,每個觀察標(biāo)簽的最優(yōu)序列,假設(shè)在t時刻已經(jīng)保存了從0到t時刻的最優(yōu)路徑,那么t+1時刻只需要計算從t到t+1的最優(yōu)就可以了。


二. 停用詞與詞的標(biāo)準(zhǔn)化

1. 詞的過濾

在文本處理過程中,對于有些詞需要做過濾。這些被過濾掉的單詞可認(rèn)為是對語義理解幫助不大,或者反而影響語義理解的單詞。同時,過濾單詞有助于減小詞庫的大小,進而提高訓(xùn)練的效率和減少內(nèi)存空間的使用。

去掉停用詞和出現(xiàn)頻率低的詞,一般要根據(jù)應(yīng)用場景來判斷。

2. 詞的標(biāo)準(zhǔn)化

stemming? 和? lemmazation

porter stemmer是stemming的非常經(jīng)典的算法,是基于規(guī)則的,背后有大量的語言學(xué)家。

三. 拼寫糾錯

1. 拼寫糾錯與編輯距離

分為單詞拼寫錯誤和語法錯誤。語法錯誤涉及語言模型,下面主要先說單詞拼寫錯誤怎么改。

總結(jié)起來,關(guān)于拼寫糾錯單詞的一種方法是:

第一步:尋找拼寫錯誤的單詞

第二步:尋找跟上面單詞“長得”最像的,可通過循環(huán)詞庫,并計算編輯距離來獲得。

第三步:從上述候選集里,根據(jù)上下文進一步做篩選和排序,最終尋找最合適的單詞。


2. 循環(huán)詞庫的問題以及改進方法


通過上述方法,我們便可以靈活生成編輯距離為某一個值的單詞,這種做法要比直接循環(huán)詞庫里的每個單詞簡單很多,高效很多。但也可以從結(jié)果中看到,包含了大量的非法單詞。所以我們需要在這些單詞中做進一步過濾。當(dāng)然過濾的條件可以很簡單,就是來檢查是否出現(xiàn)在了詞庫中,如果沒有出現(xiàn)則剔除掉。


最大化P(s|c)*P(c):P(s|c)指的是在給定一個正確字符串c的情況下,拼成錯誤字符串s的概率。P(c)指的是正確字符串c在詞庫中出現(xiàn)的概率。

對于拼寫糾錯,我們來做簡單的總結(jié):

第一步:找到拼寫錯誤的單詞

第二步:生成跟上述單詞類似的其他單詞,當(dāng)作是候選集

第三步:根據(jù)單詞在上下文中的統(tǒng)計信息來排序并選出最好的。

至于拼寫糾錯的完整實現(xiàn),由于跟語言模型相關(guān),我們將放到下一章來講解完整的代碼。

七. 文本表示

一. 文本表示基礎(chǔ)

1. 單詞的表示

對于自然語言處理各類應(yīng)用,最基礎(chǔ)的任務(wù)為文本表示。因為我們都知道一個文本是不能直接作為模型的輸入的,所以我們必須要先把文本轉(zhuǎn)換成向量的形式之后,再導(dǎo)入到模型中訓(xùn)練。所謂文本的表示,其實就是研究如何把文本表示成向量或者矩陣的形式。

文本的最小單元為單詞,其次為短語、句子、或者段落。我們需要懂得如何把這些表示成向量的形式。其中,單詞的表示法是最基礎(chǔ)的。另外,對于句子或者更長的文本來說,它們的表示依賴于單詞的表示法。 在這里想說的一點是,單詞的表示法不止一種,比如有獨熱編碼的表示法,詞向量的表示法等等。

2. 句子的表示

知道了如何表示一個單詞之后,我們很自然地就可以得到如何表示一個句子了。一個句子由多個單詞來組成,那實際上記錄一下哪些單詞出現(xiàn),哪些單詞沒有出現(xiàn)就可以了。當(dāng)然,很多時候我們也需要記錄一個單詞所出現(xiàn)的次數(shù)。

3. tf-idf向量

所以,如果只記錄單詞的個數(shù)也是不夠的,我們還需要考慮單詞的權(quán)重,也可以認(rèn)為是質(zhì)量。這有點類似于,一個人有很多朋友不代表這個人有多厲害,還需要社交的質(zhì)量,其實是同一個道理。 那如何把這種所謂的“質(zhì)量”引入到表示中呢?答案是tf-idf。


tf-idf的應(yīng)用非常廣泛,即便放在當(dāng)前,也是表示文本的最核心的技術(shù)之一。 之前我們講過什么是基準(zhǔn),那tf-idf是文本表示領(lǐng)域的最有效的基準(zhǔn)。很多時候,基于深度學(xué)習(xí)的文本表示也未必要優(yōu)于tf-idf的表示。

二. 文本相似度

1. 計算歐式距離

如何計算兩個文本之間的相似度?這個問題實際上可以認(rèn)為是計算兩個向量之間的相似度。因為通過上一節(jié)的內(nèi)容已經(jīng)知道了如何把文本轉(zhuǎn)換成向量。 所以本節(jié)所涉及到的相似度計算公式適合任何向量化的場景,不僅僅局限于文本之間的相似度。有兩種常見的相似度計算方法,分別為基于歐式距離的計算,另外一種方式為基于余弦相似度的計算。

距離越大,相似度越??;距離越小,相似度越大。

向量之間的相似度實際上要考慮到向量的方向,因為向量最重要的特性為它的方向性。如果兩個向量相似,那也需要它倆的方向也比較相似。然而,計算歐式距離的過程并沒有把方向考慮進去,這是歐式距離的最大的問題。

2. 計算余弦相似度

為了彌補歐式距離所存在的問題,我們不得不要提出另外一種相似度計算方法,這就是最著名的方法-余弦相似度。通過余弦相似度事實上我們計算的是兩個向量之間的夾角大小。兩個向量的方向上越一致就說明它倆的相似度就越高。


余弦相似度計算的直接是相似度,結(jié)果越小,相似度越??;結(jié)果越大,相似度越大。


三. 詞向量基礎(chǔ)

1. 計算單詞之間的相似度

我們一直在討論如何計算兩個文本之間的相似度,但至今還沒有討論過如何計算兩個單詞之間的相似度。單詞作為文本的最基本的要素,如何表示單詞的含義以及兩個單詞之間的相似度也極其重要。我們一起來了解一下在獨熱編碼的基礎(chǔ)下,如何計算兩個單詞之間的相似度。

顯然是,通過歐式距離或者余弦相似度是沒有辦法算出單詞之間的相似度,因為不管我們怎么計算,倆倆之間的結(jié)果都是一樣的。那問題到底處在哪兒呢?答案是,一開始的獨熱編碼的表示!既然獨熱編碼表示不支持計算兩個單詞之間的相似度,我們需要想另外一種單詞的表示法了,這就自然引出詞向量的概念。 除了不能計算相似度,獨熱編碼也存在稀疏性的問題。


2. 詞向量基礎(chǔ)

詞向量是分布式表示。詞向量的最終目的是用向量來表示單詞的含義。

如果單詞用獨熱編碼,后續(xù)的句子要用tf-idf或count vector來表示;如果單詞用了詞向量來表示,后續(xù)的句子也要沿用這個路線,比詞向量訓(xùn)練了300維,句子也要是300維或者200維(?)。這是兩套不同的編碼方式。想結(jié)合也可以。

我們可以看到在分布式表示方法下,兩個單詞之間的相似度是可以算出來的。當(dāng)然,效果取決于詞向量的質(zhì)量。所以,接下來的話題是如何得出這些詞向量?在這一章節(jié),我們只做簡單的介紹,具體詳細(xì)的方法論貫穿之后的很多的章節(jié)中。

語料庫-模型-詞向量。模型是黑盒子(Bert, ELMO, Glove, SkipGram etc.)。

如何評價一個詞向量?簡單的方法是做詞向量的可視化。

語義上比較相似的單詞聚集在了一起,這其實變相地說明,詞向量在某種意義上表達出了一個單詞的含義。為了可視化詞向量而使用的降維技術(shù)通常包括?https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html?),也是一種常用的降維算法。

3. 句子向量

假如我們手里已經(jīng)有了訓(xùn)練好的詞向量,那如何通過這些詞向量來表示一個完整的文本呢,或者一個句子呢?有一種最簡單且常用的方法,就是做平均!

有了文本表示之后,我們就可以開始對文本做建模了,比如計算兩個文本之間的相似度,或者對某個文本做分類。在這里我們來做個簡單的小結(jié):

單詞的獨熱編碼和分布式表示是兩種完全不一樣的編碼方式

這兩種不同的編碼方式是目前文本表示的兩個方向,有些時候傳統(tǒng)的獨熱編碼的方式可能更適合,有些時候分布式表示法更適合,具體還是要通過測試來獲得結(jié)論

獨熱編碼的最大的問題是不能表示一個單詞的含義

詞向量的質(zhì)量取決于詞向量訓(xùn)練模型,不同的模型所給出的結(jié)果是不一樣的

九. 詞向量技術(shù)

目標(biāo):掌握SkipGram

一. 詞向量基礎(chǔ)

1. 單詞的表示


2. 從獨熱編碼到分布式表示

通常情況下,詞庫里的單詞越多,詞向量的長度可以長一些。這有點類似于,當(dāng)我們有很多特征的時候,可以讓模型包含更多參數(shù)一樣。另外,詞向量的長度跟效果并沒有正向關(guān)系,很長的詞向量反而會導(dǎo)致過擬合現(xiàn)象。


理解一下這里的“可以表示含義”:這個是任何詞向量訓(xùn)練的目標(biāo),即這個詞向量是真正表示這個單詞的意義的,可視化之后可以明顯看出意思相近的單詞是聚在一堆的。

3. 詞向量的訓(xùn)練

詞向量是訓(xùn)練出來的。所以,我們可以認(rèn)為,中間有一個模型可以幫助我們訓(xùn)練出每個單詞的向量。這個模型到底是什么呢?這個黑盒子就是我們即將要解開的秘密。詞向量技術(shù)也是帶動NLP發(fā)展的最有利的催化器,自從2013年提出word2vec開始,之后整個NLP領(lǐng)域有了飛躍式的發(fā)展。如果說,ImageNet是CV領(lǐng)域的催化劑,那么word2vec有著同樣的重要性。

那到底這個黑盒子里是什么呢?在具體剖析詞向量模型之前,我們先看一下如何用一些模型來訓(xùn)練出詞向量。也就是給定一個語料庫,它的輸出長得是怎樣的。輸入是一個很長的文章txt文件也叫語料庫,輸出就是每個單詞的詞向量,中間是用于訓(xùn)練詞向量的模型,這個模型很多包括skipgram,cbow等。

到目前為止我們簡單地了解了詞向量以及它的訓(xùn)練是怎樣的。在這里做個簡單的總結(jié):

詞向量可以認(rèn)為在某種程度上代表單詞的含義

詞向量是需要訓(xùn)練出來的,也就是提前要設(shè)計好詞向量訓(xùn)練模型

詞向量技術(shù)極大推動了NLP領(lǐng)域的發(fā)展

二. SkipGram模型詳解:重點難點

1. 訓(xùn)練詞向量的核心思想

詞向量模型其實很多,包括大家所熟悉的BERT等。每一種詞向量,它的目標(biāo)和作用是不一樣的,我們在后續(xù)的章節(jié)中會一一做介紹。但不管怎么樣,這些模型都享有著共同的核心思想。等我們深入理解了這個思想,便可以更容易理解模型為什么會這么設(shè)計,而且甚至將來也可以提出自己的模型。

首先說明一點,詞向量的學(xué)習(xí)通常是無監(jiān)督學(xué)習(xí),也就是不需要標(biāo)注好的文本。那對于這樣的無監(jiān)督學(xué)習(xí),我們應(yīng)該如何合理地設(shè)計目標(biāo)函數(shù)并學(xué)出詞向量呢?



2. SkipGram的目標(biāo)函數(shù)

具體來學(xué)習(xí)一下SkipGram模型。它是一個非常著名的詞向量訓(xùn)練模型。它的核心思想是通過中心詞來預(yù)測它周圍的單詞。也就是說,如果我們的詞向量訓(xùn)練比較到位,則這方面的預(yù)測能力會更強。實際上,這就是我們需要構(gòu)建的目標(biāo)函數(shù)。

仔細(xì)看!這遍沒看懂???

3.?SkipGram的負(fù)采樣

得到了SkipGram目標(biāo)函數(shù)之后,發(fā)現(xiàn)了這個目標(biāo)函數(shù)其實不好優(yōu)化。所以需要換一種方式去優(yōu)化,其中比較流行的方法是使用負(fù)采樣。從名字中也可以猜到,這個方法用到了采樣的做法。接下來我們從另外一個角度來推導(dǎo)SkipGram的目標(biāo)函數(shù)。


當(dāng)我們有了目標(biāo)函數(shù)之后,剩下的過程無非就是優(yōu)化并尋找最優(yōu)參數(shù)了。實際上,通過優(yōu)化最終得出來的最優(yōu)參數(shù)就是訓(xùn)練出來的詞向量。優(yōu)化方法可采用梯度下降法或者隨機梯度下降法。

推導(dǎo)沒看懂??

三. 其他詞向量技術(shù)

SkipGram是訓(xùn)練詞向量的其中一種方式,但并不是唯一的方法。實際上,從第一次提出word2vec開始,學(xué)者們已經(jīng)提出了各種各樣的訓(xùn)練方式。每個方法論的側(cè)重點、目標(biāo)是有所不同的。

1.?矩陣分解法

在推薦領(lǐng)域用的比較好。


矩陣分解作為全局方法也有它的優(yōu)點和缺點。一個最大的缺點是每次分解依賴于整個矩陣,這就導(dǎo)致假如有些個別文本改變了,按理來講是需要重新訓(xùn)練的,但優(yōu)點是學(xué)習(xí)過程包含了全局的信息。相反,對于SkipGram模型,由于訓(xùn)練發(fā)生在局部,所以訓(xùn)練起來效率高,且能夠很好把握局部的文本特征,但問題是它并不能從全局的視角掌握語料庫的特點。

所以,接下來的問題是能否把各自的都優(yōu)點發(fā)揮出來?答案是設(shè)計一個融合矩陣分解和SkipGram模型的方法,這個答案其實是Glove模型。

2.?Glove向量


3.?高斯詞嵌入

帶有方差和標(biāo)準(zhǔn)差,可以看出來學(xué)出的詞向量的置信度高還是低,即是否靠譜。


4.?詞向量總結(jié)

到此為止講完了SkipGram。在最后,我來給大家總結(jié)一下:

詞向量技術(shù)的目的是通過向量來表示一個單詞的語義。

SkipGram是流行的一種詞向量學(xué)習(xí)技術(shù)。

SkipGram通過中心詞來預(yù)測它周圍的單詞。

SkipGram原始的目標(biāo)函數(shù)很難優(yōu)化,所以采用負(fù)采樣的方式來解決。

除了SkipGram還有很多不同的學(xué)習(xí)詞向量的方式。

另外,我們還需要留意一點:對于任意一個單詞,SkipGram,矩陣分解,Glove等模型均學(xué)出對應(yīng)的一個詞向量。那這又有什么問題呢?

由于一個單詞在不同的上下文中所表達的含義可能不一樣,所以只學(xué)出對應(yīng)的一個向量是不夠的。


四. 論文解讀

SkipGram不僅僅可以學(xué)習(xí)詞向量,也可以應(yīng)用推薦系統(tǒng)中。

十. 語言模型

一. 語言模型基礎(chǔ)

1. 什么是語言模型?

語言模型最主要的作用是保證文本的語法結(jié)構(gòu),得到通順的語句。語言模型是一種概率統(tǒng)計的方法,已經(jīng)訓(xùn)練好的語言模型可以對任何一個文本給出概率,概率越高說明語法上越通順。通過比較兩句話在同一個語言模型上的概率,我們就可以得出哪一句話更通順一些。

2.??計算語言模型的概率


上述的條件概率是從語料庫中統(tǒng)計出來的,而且語言模型本身是無監(jiān)督學(xué)習(xí),不需要數(shù)據(jù)標(biāo)簽。

3. 馬爾可夫假設(shè)

當(dāng)條件為較長的一段話時,一模一樣的語句出現(xiàn)在語料庫中的概率會非常小,很多時候為0,造成了稀疏性,就失去了統(tǒng)計的意義。那如何解決此問題呢?答案是做一些近似!

二. 語言模型訓(xùn)練

1.?不同的語言模型

根據(jù)不同的馬爾科夫假設(shè)(1階、2階、3階。。。),我們可以得到不同種類的語言模型。如,一階馬爾科夫假設(shè)下的語言模型為bi-gram, 二階馬爾科夫假設(shè)下的模型為tri-gram,以此類推。另外,假如前后單詞之間不存在任何的依賴關(guān)系,得到的語言模型為unigram。


缺點:不考慮單詞的順序



2. 語言模型的訓(xùn)練

做一個簡單的總結(jié):

語言模型的概率值可基于語料庫來統(tǒng)計。

根據(jù)使用的馬爾科夫假設(shè)的不同,可以把語言模型分為unigram, bigram, trigram, ngram。。。

當(dāng)考慮多個單詞的時候,條件概率往往變得稀疏,導(dǎo)致大部分都變成0。

3. 語言模型的評估

假如訓(xùn)練好了語言模型,我們應(yīng)該如何判斷語言模型的好壞呢?比如手里有兩個不同的語言模型,如何判斷哪個更好?為了回答此問題,首先需要一個評價標(biāo)準(zhǔn),也就是如何評估一個語言模型的好壞,并且結(jié)果是能夠量化的!


缺點:耗時長和成本

困惑度(Perplexity)越小越好。


四. 語言模型的平滑

1.?不同的平滑方法

平滑對于語言模型至關(guān)重要,假如沒有平滑操作,很多概率都會變成0。


2.?Add-one Smoothing

Add-one平滑其實也稱之為Laplace平滑,在樸素貝葉斯等模型中也會經(jīng)常用到。這種方法簡單且有效,不需要任何的訓(xùn)練過程。


3.?Add-K Smoothing

Add-one平滑可看作是add-k平滑的特例,也就是當(dāng)K=1時就變成了Add-one平滑。這里的K可以理解為是超參數(shù),可以試著去調(diào)節(jié)從而獲得比較好的K值。


4.??Interpolation



以上是比較常見的幾個平滑的方法。當(dāng)然,除了這些,還有很多平滑的操作可供使用,感興趣的朋友們可以在網(wǎng)上搜一下如Good-turning smoothing平滑等。對于本章做一個總結(jié):

語言模型可用來判斷語法的準(zhǔn)確性以及語句的通順與否。

當(dāng)任務(wù)中涉及到文本生成時,語言模型扮演著關(guān)鍵的角色。

語言模型中的概率是基于語料庫統(tǒng)計出來的,這個過程也可以理解為是訓(xùn)練過程。

根據(jù)馬爾科夫假設(shè)的不同,語言模型可分為unigram, bigram, trigram。。。。

在估算語言模型概率時,需要用到平滑操作。

Add-one平滑是最簡單且有效的平滑操作,廣泛用在各類機器學(xué)習(xí)模型中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容