天天看點

語義分析的一些方法(上篇)

語義分析,本文指運用各種機器學習方法,挖掘與學習文本、圖檔等的深層次概念。wikipedia上的解釋:In machine learning, semantic analysis of a corpus is the task of building structures that approximate concepts from a large set of documents(or images)。

工作這幾年,陸陸續續實踐過一些項目,有搜尋廣告,社交廣告,微網誌廣告,品牌廣告,内容廣告等。要使我們廣告平台效益最大化,首先需要了解使用者,Context(将展示廣告的上下文)和廣告,才能将最合适的廣告展示給使用者。而這其中,就離不開對使用者,對上下文,對廣告的語義分析,由此催生了一些子項目,例如文本語義分析,圖檔語義了解,語義索引,短串語義關聯,使用者廣告語義比對等。

接下來我将寫一寫我所認識的語義分析的一些方法,雖說我們在做的時候,效果導向居多,方法理論了解也許并不深入,不過權當個人知識點總結,有任何不當之處請指正,謝謝。

本文主要由以下四部分組成:文本基本處理,文本語義分析,圖檔語義分析,語義分析小結。先講述文本處理的基本方法,這構成了語義分析的基礎。接着分文本和圖檔兩節講述各自語義分析的一些方法,值得注意的是,雖說分為兩節,但文本和圖檔在語義分析方法上有很多共通與關聯。最後我們簡單介紹下語義分析在廣點通“使用者廣告比對”上的應用,并展望一下未來的語義分析方法。

1 文本基本處理

在講文本語義分析之前,我們先說下文本基本處理,因為它構成了語義分析的基礎。而文本處理有很多方面,考慮到本文主題,這裡隻介紹中文分詞以及Term Weighting。

1.1 中文分詞

拿到一段文本後,通常情況下,首先要做分詞。分詞的方法一般有如下幾種:

  • 基于字元串比對的分詞方法。此方法按照不同的掃描方式,逐個查找詞庫進行分詞。根據掃描方式可細分為:正向最大比對,反向最大比對,雙向最大比對,最小切分(即最短路徑);總之就是各種不同的啟發規則。
  • 全切分方法。它首先切分出與詞庫比對的所有可能的詞,再運用統計語言模型決定最優的切分結果。它的優點在于可以解決分詞中的歧義問題。下圖是一個示例,對于文本串“南京市長江大橋”,首先進行詞條檢索(一般用Trie存儲),找到比對的所有詞條(南京,市,長江,大橋,南京市,長江大橋,市長,江大橋,江大,橋),以詞網格(word lattices)形式表示,接着做路徑搜尋,基于統計語言模型(例如n-gram)[18]找到最優路徑,最後可能還需要命名實體識别。下圖中“南京市 長江 大橋”的語言模型得分,即P(南京市,長江,大橋)最高,則為最優切分。
    語義分析的一些方法(上篇)
    圖1. “南京市長江大橋”語言模型得分
  • 由字構詞的分詞方法。可以了解為字的分類問題,也就是自然語言進行中的sequence labeling問題,通常做法裡利用HMM,MAXENT,MEMM,CRF等預測文本串每個字的tag[62],譬如B,E,I,S,這四個tag分别表示:beginning, inside, ending, single,也就是一個詞的開始,中間,結束,以及單個字的詞。 例如“南京市長江大橋”的标注結果可能為:“南(B)京(I)市(E)長(B)江(E)大(B)橋(E)”。由于CRF既可以像最大熵模型一樣加各種領域feature,又避免了HMM的齊次馬爾科夫假設,是以基于CRF的分詞目前是效果最好的,具體請參考文獻[61,62,63]。除了HMM,CRF等模型,分詞也可以基于深度學習方法來做,如文獻[9][10]所介紹,也取得了state-of-the-art的結果。
    語義分析的一些方法(上篇)

    圖2. 基于深度學習的中文分詞

    上圖是一個基于深度學習的分詞示例圖。我們從上往下看,首先對每一個字進行Lookup Table,映射到一個固定長度的特征向量(這裡可以利用詞向量,boundary entropy,accessor variety等);接着經過一個标準的神經網絡,分别是linear,sigmoid,linear層,對于每個字,預測該字屬于B,E,I,S的機率;最後輸出是一個矩陣,矩陣的行是B,E,I,S 4個tag,利用viterbi算法就可以完成标注推斷,進而得到分詞結果。

一個文本串除了分詞,還需要做詞性标注,命名實體識别,新詞發現等。通常有兩種方案,一種是pipeline approaches,就是先分詞,再做詞性标注;另一種是joint approaches,就是把這些任務用一個模型來完成。有興趣可以參考文獻[9][62]等。

一般而言,方法一和方法二在工業界用得比較多,方法三因為采用複雜的模型,雖準确率相對高,但耗時較大。

1.2 語言模型

前面在講“全切分分詞”方法時,提到了語言模型,并且通過語言模型,還可以引出詞向量,是以這裡把語言模型簡單闡述一下。

語言模型是用來計算一個句子産生機率的機率模型,即P(w_1,w_2,w_3…w_m),m表示詞的總個數。根據貝葉斯公式:P(w_1,w_2,w_3 … w_m) = P(w_1)P(w_2|w_1)P(w_3|w_1,w_2) … P(w_m|w_1,w_2 … w_{m-1})。

最簡單的語言模型是N-Gram,它利用馬爾科夫假設,認為句子中每個單詞隻與其前n–1個單詞有關,即假設産生w_m這個詞的條件機率隻依賴于前n–1個詞,則有P(w_m|w_1,w_2…w_{m-1}) = P(w_m|w_{m-n+1},w_{m-n+2} … w_{m-1})。其中n越大,模型可差別性越強,n越小,模型可靠性越高。

N-Gram語言模型簡單有效,但是它隻考慮了詞的位置關系,沒有考慮詞之間的相似度,詞文法和詞語義,并且還存在資料稀疏的問題,是以後來,又逐漸提出更多的語言模型,例如Class-based ngram model,topic-based ngram model,cache-based ngram model,skipping ngram model,指數語言模型(最大熵模型,條件随機域模型)等。若想了解更多請參考文章[18]。

最近,随着深度學習的興起,神經網絡語言模型也變得火熱[4]。用神經網絡訓練語言模型的經典之作,要數Bengio等人發表的《A Neural Probabilistic Language Model》[3],它也是基于N-Gram的,首先将每個單詞w_{m-n+1},w_{m-n+2} … w_{m-1}映射到詞向量空間,再把各個單詞的詞向量組合成一個更大的向量作為神經網絡輸入,輸出是P(w_m)。本文将此模型簡稱為ffnnlm(Feed-forward Neural Net Language Model)。ffnnlm解決了傳統n-gram的兩個缺陷:(1)詞語之間的相似性可以通過詞向量來展現;(2)自帶平滑功能。文獻[3]不僅提出神經網絡語言模型,還順帶引出了詞向量,關于詞向量,後文将再細述。

語義分析的一些方法(上篇)

圖3. 基于神經網絡的語言模型

從最新文獻看,目前state-of-the-art語言模型應該是基于循環神經網絡(recurrent neural network)的語言模型,簡稱rnnlm[5][6]。循環神經網絡相比于傳統前饋神經網絡,其特點是:可以存在有向環,将上一次的輸出作為本次的輸入。而rnnlm和ffnnlm的最大差別是:ffnnmm要求輸入的上下文是固定長度的,也就是說n-gram中的 n 要求是個固定值,而rnnlm不限制上下文的長度,可以真正充分地利用所有上文資訊來預測下一個詞,本次預測的中間隐層資訊(例如下圖中的context資訊)可以在下一次預測裡循環使用。

語義分析的一些方法(上篇)

圖4. 基于simple RNN(time-delay neural network)的語言模型

如上圖所示,這是一個最簡單的rnnlm,神經網絡分為三層,第一層是輸入層,第二層是隐藏層(也叫context層),第三層輸出層。 假設目前是t時刻,則分三步來預測P(w_m):

  • 單詞w_{m-1}映射到詞向量,記作input(t)
  • 連接配接上一次訓練的隐藏層context(t–1),經過sigmoid function,生成目前t時刻的context(t)
  • 利用softmax function,預測P(w_m)

參考文獻[7]中列出了一個rnnlm的library,其代碼緊湊。利用它訓練中文語言模型将很簡單,上面“南京市 長江 大橋”就是rnnlm的預測結果。

基于RNN的language model利用BPTT(BackPropagation through time)算法比較難于訓練,原因就是深度神經網絡裡比較普遍的vanishing gradient問題[55](在RNN裡,梯度計算随時間成指數倍增長或衰減,稱之為Exponential Error Decay)。是以後來又提出基于LSTM(Long short term memory)的language model,LSTM也是一種RNN網絡,關于LSTM的詳細介紹請參考文獻[54,49,52]。LSTM通過網絡結構的修改,進而避免vanishing gradient問題。

語義分析的一些方法(上篇)

圖5. LSTM memory cell

如上圖所示,是一個LSTM unit。如果是傳統的神經網絡unit,output activation bi = activation_function(ai),但LSTM unit的計算相對就複雜些了,它儲存了該神經元上一次計算的結果,通過input gate,output gate,forget gate來計算輸出,具體過程請參考文獻[53,54]。

1.3 Term Weighting

Term重要性

對文本分詞後,接下來需要對分詞後的每個term計算一個權重,重要的term應該給與更高的權重。舉例來說,“什麼産品對減肥幫助最大?”的term weighting結果可能是: “什麼 0.1,産品 0.5,對 0.1,減肥 0.8,幫助 0.3,最大 0.2”。Term weighting在文字檢索,文本相關性,核心詞提取等任務中都有重要作用。

  • Term weighting的打分公式一般由三部分組成:local,global和normalization [1,2]。即

    TermWeight=L_{i,j} G_i N_j。L_{i,j}是term i在document j中的local weight,G_i是term i的global weight,N_j是document j的歸一化因子。

    常見的local,global,normalization weight公式[2]有:

    語義分析的一些方法(上篇)
    圖6. Local weight formulas
    語義分析的一些方法(上篇)
    圖7. Global weight formulas
    語義分析的一些方法(上篇)

    圖8. Normalization factors

    Tf-Idf是一種最常見的term weighting方法。在上面的公式體系裡,Tf-Idf的local weight是FREQ,glocal weight是IDFB,normalization是None。tf是詞頻,表示這個詞出現的次數。df是文檔頻率,表示這個詞在多少個文檔中出現。idf則是逆文檔頻率,idf=log(TD/df),TD表示總文檔數。Tf-Idf在很多場合都很有效,但缺點也比較明顯,以“詞頻”度量重要性,不夠全面,譬如在搜尋廣告的關鍵詞比對時就不夠用。

    除了TF-IDF外,還有很多其他term weighting方法,例如Okapi,MI,LTU,ATC,TF-ICF[59]等。通過local,global,normalization各種公式的組合,可以生成不同的term weighting計算方法。不過上面這些方法都是無監督計算方法,有一定程度的通用性,但在一些特定場景裡顯得不夠靈活,不夠準确,是以可以基于有監督機器學習方法來拟合term weighting結果。

    語義分析的一些方法(上篇)
    圖9. Okapi計算公式
  • 利用有監督機器學習方法來預測weight。這裡類似于機器學習的分類任務,對于文本串的每個term,預測一個[0,1]的得分,得分越大則term重要性越高。既然是有監督學習,那麼就需要訓練資料。如果采用人工标注的話,極大耗費人力,是以可以采用訓練資料自提取的方法,利用程式從搜尋日志裡自動挖掘。從海量日志資料裡提取隐含的使用者對于term重要性的标注,得到的訓練資料将綜合億級使用者的“标注結果”,覆寫面更廣,且來自于真實搜尋資料,訓練結果與标注的目标集分布接近,訓練資料更精确。下面列舉三種方法(除此外,還有更多可以利用的方法):
    • 從搜尋session資料裡提取訓練資料,使用者在一個檢索會話中的檢索核心意圖是不變的,提取出核心意圖所對應的term,其重要性就高。
    • 從曆史短串關系資源庫裡提取訓練資料,短串擴充關系中,一個term出現的次數越多,則越重要。
    • 從搜尋廣告點選日志裡提取訓練資料,query與bidword共有term的點選率越高,它在query中的重要程度就越高。

    通過上面的方法,可以提取到大量品質不錯的訓練資料(數十億級别的資料,這其中可能有部分樣本不準确,但在如此大規模資料情況下,絕大部分樣本都是準确的)。

    有了訓練資料,接下來提取特征,基于邏輯回歸模型來預測文本串中每個term的重要性。所提取的特征包括:

    • term的自解釋特征,例如term專名類型,term詞性,term idf,位置特征,term的長度等;
    • term與文本串的交叉特征,例如term與文本串中其他term的字面交叉特征,term轉移到文本串中其他term的轉移機率特征,term的文本分類、topic與文本串的文本分類、topic的交叉特征等。
核心詞、關鍵詞提取
  • 短文本串的核心詞提取。對短文本串分詞後,利用上面介紹的term weighting方法,擷取term weight後,取一定的門檻值,就可以提取出短文本串的核心詞。
  • 長文本串(譬如web page)的關鍵詞提取。這裡簡單介紹幾種方法。想了解更多,請參考文獻[69]。
    • 采用基于規則的方法。考慮到位置特征,網頁特征等。
    • 基于廣告主購買的bidword和高頻query建立多模式比對樹,在長文本串中進行全字比對找出候選關鍵詞,再結合關鍵詞weight,以及某些規則找出優質的關鍵詞。
    • 類似于有監督的term weighting方法,也可以訓練關鍵詞weighting的模型。
    • 基于文檔主題結構的關鍵詞抽取,具體可以參考文獻[71]。

繼續閱讀