文本分析概述

11/2/2017 8:34:23 PM面試

下面對文本分析的五個問題介紹進行粗淺的介紹。算法

1、統計語言模型

咱們首先考慮一個問題,咱們該如何衡量一個句子是否合理學習

咱們有兩種方法,即基於規則的方法和基於統計的方法。大數據

基於規則的方法的手段是判斷這個句子是否合乎文法、含義是否正確。可是文法規則是十分複雜的並且數量龐大,覆蓋哪怕是20%的真實語句的文法也至少是幾萬條。並且,就算找到了全部的文法規則,用計算機解析也是很是困難的。spa

基於統計的方法則是推測這個句子出現可能性的大小。假設S是一個句子,咱們令它出現的機率爲\(P(S)\)。爲了估計\(P(S)\),咱們須要統計人類有史以來出現的句子中
S出現的比例。顯然,這行不通。blog

咱們須要將這個任務化簡,創建一個模型進行對句子出現的機率進行大體的估計。因爲句子是由詞組成的。假設S由一串特定順序排列的詞\(w_1,w_2,\cdots,w_n\)組成。那麼有文檔

\[P(S)=P(w_1,w_2,\cdots,w_n)\]get

利用條件機率的公式,咱們能夠展開獲得數學

\[P(w_1,w_2,\cdots,w_n)=P(w_1)\cdot P(w_2|w_1)\cdot P(w_3|w_1,w_2)\cdots P(w_n|w_1,w_2,\cdots,w_{n-1})\]it

其中\(P(w_1)\)表示第一個詞\(w_1\)出現的機率;\(P(w_2|w_1)\)表示在第一個詞\(w_1\)出現的前提下,第二個詞出現的機率;以此類推。

這種展開方式雖然看起來將一個大問題分解成多個小問題,可是並未解決計算上的問題。從計算上來看,第一個詞的條件機率\(P(w_1)\)很容易計算,第二個詞的條件機率\(P(w_2|w_1)\)還不太麻煩,而第三個詞的條件機率\(P(w_3|w_1,w_2)\)已經很是難算了,而\(P(w_n|w_1,w_2,\cdots,w_{n-1})\)根本沒法估算。

馬爾科夫給了一個偷懶可是頗爲有效的方法:假設任意一個詞\(w_i\)出現的機率只與它前面的詞\(w_{i-1}\)有關,那麼問題就變得簡單了

\[P(w_1,w_2,\cdots,w_n)=P(w_1)\cdot P(w_2|w_1)\cdot P(w_3|w_2)\cdots P(w_i|w_{i-1})\cdots P(w_n|w_{n-1})\]

而條件機率\(P(w_i|w_{i-1})\),可使用下面的式子計算

\[P(w_i|w_{i-1})=\frac{P(w_{i-1},w_{i})}{P(w_{i-1})}\]

2、中文分詞

使用統計語言模型能夠處理天然語言中的不少問題,但統計語言模型是創建在詞的基礎上的,由於詞是表達語義的最小單位。對於西方拼音語言而言,詞之間有明確的分界符,統計和使用語言模型很是直接。而對於中、日、韓、泰等語言,詞之間沒有明確的分界符。所以,首先須要對句子進行分詞,才能作到進一步的天然語言處理。

假設分詞的輸入是一個句子:中國航天官員應邀到美國與太空總署官員開會。那麼分詞的輸出應該爲:中國/航天/官員/應邀/到/美國/與/太空/總署/官員/開會。

最容易想到的分詞方法,也是最簡單的辦法,就是查字典。「查字典」的辦法,其實就是把一個句子從左向右掃描一遍,遇到字典裏有的詞就標識出來,遇到複合詞(好比「上海大學」)就找最長的詞匹配,遇到不認識的字串就分割成單字詞,因而簡單的分詞就完成了。

這種簡單的分詞方法徹底可以處理上面例子中的句子。在這基礎上發展了最小詞數的分詞理論,即一句話應該分紅數量最少的詞串。

這種方法一個明顯的不足是當遇到有二義性的分割時就無能爲力了。好比,對短語「發展中國家」,正確的分割應該是「發展/中/國家」,而從左向右查字典的辦法會將它分割成「發展/中國/家」,這顯然錯了。另外,並不是全部的最長匹配都必定時正確的。好比「北京大學生」的正確分詞時「北京/大學生」,而不是「北京大學/生」。

1990年先後,郭進博士用統計語言模型成功地解決了分詞二義性的問題,將漢語分詞的錯誤率下降了一個數量級。

具體來講,對於句子S,假設它有三種分詞方法,那麼最好的一種分詞方法應該保證分完詞後,這個句子出現的機率最大。至於如何求機率,就要用到上面講到的統計語言模型。

在實際條件下,一個句子的分詞方法每每遠不止3種。若是窮舉全部可能的分詞方法,並計算每種可能下句子的機率,那麼計算量是至關大的。使用維特比算法,咱們就能夠快速找到最佳分詞方案了。

3、TF-IDF權重

當對一篇文章進行分詞以後,若是想要提取這篇文章的關鍵詞,咱們就須要衡量一個詞對一篇文章的重要程度

最簡單也最直接的方法是,統計這篇文章中詞語出現的頻率,使用詞頻(Term Frequcency, TF)最大的詞做爲文章的關鍵詞。顯然,這種方法存在較大的問題。由於,有些常見的詞,在全部文章中的出現頻率都比較高。

那麼如何描述詞的常見程度?

這即是逆向文檔頻率(Inverse Document Frequcency, IDF)。對於一個詞來講,包含它的文檔數越多,它越常見,那麼它的IDF就越低。

而TF-IDF則是結合了兩者,對詞在文章中的重要程度進行衡量。一個詞\(i\)對文檔\(j\)的TF-IDF值爲

\[{\rm tf\_idf}_{i,j}={\rm tf}_{i,j}\times {\rm idf}_i\]

一個詞的TF很容易計算。假設詞\(i\)在文檔\(j\)中出現\(n\)次,而文檔\(j\)中一共有\(N\)個詞,那麼詞頻\({\rm tf}_{i,j}\)

\[{\rm tf}_{i,j}=\frac{n}{N}\]

一個詞的IDF相對複雜些。假設語料庫中共有\(M\)個文檔,其中\(m\)個文檔中出現了詞\(i\),那麼逆向文檔頻率\({\rm idf}_i\)

\[{\rm idf}_i=\log \frac{M}{m+1}\]

這裏分母使用\(m+1\)時爲了防止被除數爲0。

4、主題模型

咱們仍然經過一個問題開始講。此次咱們的目標是判斷兩篇文檔的類似程度

直觀的想法是,文章是由詞構成的,那麼咱們只需統計這兩篇文章中同時出現的詞的比例。但這是很難行的通的。由於詞存在「同義和多義」的現象。

同義指的是不一樣詞彙在必定背景下有相同的意思;多義指的是一個詞彙在不一樣背景下有着不一樣的意思。好比下面的例子

同義:
我今天面試就是去打醬油。
今天的面試,就是隨便參與一下。

多義:
我今天面試就是去打醬油。
中午要吃餃子,下班先去打醬油。

所以,咱們不能簡單地使用兩邊文章中詞的類似程度,來衡量文章的類似程度。

LSA

潛在語義分析(Latent Semantic Analysis,LSA)創新地引入了語義維度。語義維度是文檔集上相同和相關信息的濃縮表示。

假設詞典爲\({A_1,A_2,B_1,B_2,C_2,C_2}\),第一個文檔的詞序爲「\(A_1A_2A_1A_2\)」,第二個文檔的詞序爲「\(C_1C_2B_1B_2\)」。這裏假設\(A_1\)\(A_2\)表示話題一,\(B_1\)\(B_2\)表示話題二,\(C_1\)\(C_2\)表示話題三。

咱們能夠看出文檔1與話題一有緊密聯繫,文檔2與話題二和話題三有緊密聯繫。那麼如何自動學習到這一知識呢?

假設咱們有\(n\)個文檔,\(m\)個詞彙。給定一個矩陣\(A(m\times n)\),其中\(A_{i,j}\)表示詞\(i\)在文檔\(j\)中的權重。(這裏的權重,咱們能夠選擇TF-IDF權重方案或者其餘的)
這樣,矩陣\(A\)的每一行對應一個詞彙,每一列對應一個文檔。

接下來,LSA對矩陣\(A\)進行奇異值分解(SVD)。簡單來講,就是將\(A\)分解爲三個矩陣相乘。

\[A=TSD^{T}\]

其中,\(T\)是一個\(m\times r\)的詞彙矢量矩陣,\(D\)是一個\(n\times r\)的文檔矢量矩陣,而\(S\)是一個\(r\times r\)的對角陣。

實際上,LSA作了降維的近似處理。經過這一處理,只保留了\(S\)中最大的K個對角值(也就是奇異值),進而文檔矢量矩陣\(D\)和詞彙矢量矩陣\(T\)都被縮成了K列。其中詞彙矢量矩陣\(D\)的每一列就是一個主題,而文檔向量矩陣\(T\)的每一行就是一個文檔對應在這K個主題上的係數表示。

主題-詞彙 經過這樣的表示,能夠看到每個主題向量能夠近似表示成詞彙向量的一個線性加權。一主題向量中的元素表示該主題內對應詞彙的權重,一個詞彙權重越大,表示在該主題內部越具備表明性。

文檔——主題 對於多個文檔,這K個主題是共享的,而線性結合係數是文檔特定的。一個文檔對應着多個主題的線性加權。

LDA

接下來,人們提出了pLSA,將潛在語義分析從線性代數的分析模型提高到機率統計的展示模式。

簡單來講,一個詞語在文檔中的出現機率爲

\[P(詞語|文檔)=\sum_{主題}P(詞語|主題)\times P(主題|文檔)\]

pLSA是LSA在機率上的一種呈現。在LSA中,咱們假設主題向量是正交的,那麼在pLSA中,咱們的假設則是不一樣主題變量之間是獨立的。

儘管pLSA採用了機率模型做爲刻畫方法,可是它並無「將機率表示進行到底」。形式化的說,它並非一個完整的貝葉斯模型,其中的\(P(詞彙|主題)\)\(P(主題|文檔)\)都是根據數據估計出來的,都是模型參數,並且沒有進一步對這些參數引入先驗。

2004年,David Blei首次提出全貝葉斯版本的pLSA,而且將其稱爲主題模型,英文名爲Latent Dirichlet Allocation(Blei, et al. 2003)。(線性判別分析的縮寫也是LDA,注意區分)

這裏不對LDA的細節進行探討,畢竟太過枯燥。咱們簡單地舉一個例子說明LDA。

假設咱們要使用LDA生成一篇文檔。咱們要作的是

  1. 選擇一個主題分佈
  2. 從主題分佈中選擇一個主題
  3. 根據這個主題,選擇一個單詞

這樣進行屢次,咱們就是生成了一篇文檔。

LDA中的D指的是狄利克雷分佈。狄利克雷分佈是關於分佈的分佈。一個主題,是關於詞彙的分佈。那麼主題分佈,就是關於分佈的分佈。

5、Word2Vec

在不少算法中,咱們須要將詞轉化爲可計算的數值。咱們經常使用一個向量,表示一個詞。

一個簡單的方法是OneHot方法。

假設詞典中一共有4個詞,那麼向量的長度爲4。每一個向量僅在詞的對應位置爲1,其他爲0。

但在實際應用中,這種方法有諸多不足。最顯著的就是,維度災難。在實際應用,字典每每是很是大的,那麼每一個詞對應的向量的維度就很是高。

其實,現實世界中的詞並非孤立存在的,詞之間存在許多聯繫。好比,象棋與棋和大象之間存在着聯繫。

Word2Vec就是基於這種思路的無監督方法。

參考

[1] 吳軍. 人民郵電出版社. 數學之美.
[2] 劉知遠,崔安欣等. 電子工業出版社. 大數據智能.

本文連接:www.superzhang.site/blog/text-analysis

相關文章
相關標籤/搜索