推薦系統技術之文字相似性計算(二)

吳YH堅發表於2019-02-25

第一篇地址:[gold.xitu.io/post/577db5…) 上一篇中我們的小明已經中學畢業了,今天這一篇繼續文字相似性的計算。 首先前一篇不能解決的問題是因為我們只是機械的計算了詞的向量,並沒有任何上下文的關係,所以思想還停留在機器層面,還沒有到更高的層次上來,正因為這樣才有了自然語言處理這門課程了。

今天我們稍微說說這個吧,後臺留言很多朋友對這方面感興趣,因為自然語言處理實在不是一篇文章就能說清的,而且我水平也非常有限,我本身是個工程人員,比較在行的是系統設計和架構,我14年10月左右的時候我老大要我補一下這方面的理論才開始看這方面的東西,後來由於換工作的原因也斷了一截,不是時時刻刻都在學這個,還有很多其他工作要做,但也還算比較連續吧,而且有一些朋友同事可以請教,不是一個人瞎搞,這已經比很多人好了。但即使是這樣只能說還沒有入門,或者說剛剛看到門,還沒找到鑰匙。

下面我說說我嘗試過的模型吧,其他更高深的東西我也沒用過,要寫也能噴一下,但我覺得那就沒意義了。

1. 主題模型(Topic Model)

主題模型是目前也比較流行的文字分類的方法了,他主要解決的是文章的分類問題,就是這篇文章屬於哪個類別。

如何來對文章進行分類呢?如果按照之前的演算法,我們可以把每篇文章的關鍵詞都提取出來,然後按照關鍵詞進行分類,把文章分到每個類別中,但是,那樣顯得不太高階,我們來想想這麼一個情況,就是你是如何寫這篇文章的?

比如我目前寫的這篇文章文字相似性的計算,一般的思路是這樣的。

  • 首先,你想好題目以後會想一些提綱,比如我想我會寫一下主題模型,然後寫詞向量,這兩個就是我的主題了。
  • 然後,我開始寫了,寫主題模型的時候,我的一些詞語都是和主題模型相關的,比如LDA分類主題概率啊等等,然後寫詞向量的時候也會有這麼一些詞,這些就是主題下的詞語。
  • 最後,我就是按照上面的兩條規則把文章寫完了。

如何讓以計算機的思維來按這個規則寫作呢?

  • 首先,定兩個主題,然後把每個詞都分到某一個主題下
  • 開始寫作的時候就是先找個主題,然後在主題下找個詞,然後寫出來
  • 迴圈到上一步,就是這樣麼一直寫,然後一篇文章就寫好了

這樣每個詞都屬於兩個主題中的一個。

這樣當然寫不出東西來,但是我們現在需要的分類,如果反過來想想,我已經有一篇文章了,如果我知道這篇文章的每個詞都屬於哪個分類,那麼我其實就知道了這篇文章都屬於哪些個主題了,那麼有相似主題的文章,很可能是比較相似的。

於是,現在的關鍵問題就是找到主題主題下的詞了,把這兩個東西當成一個模型,新來一篇文章就在這個模型裡面過一遍,然後就知道這篇文章的主題了。

主題主題下的詞怎麼找呢?最簡單的就是靠人拍啊,人為的設定一些主題和這個主題下的詞以及詞出現的概率,那不就行了,人怎麼拍呢?靠經驗啊,我今年30多了,看了二十多年的書,少說有1000本吧,我知道哪些詞應該在哪些分類下啊。OK,靠經驗估計出來的,我靠,是不是有種似曾相識的趕腳啊?這不是機器學習最喜歡乾的事情麼?給一堆文章給他『看』,然後自己估算出一個主題模型出來。

好吧,其實主題模型就是這麼幹的。LDA模型的數學表達比較複雜,涉及到好幾個分佈函式,還有采樣函式等,這篇文章必然講不清楚,如果感興趣的,我後面列了幾篇文章,可以看看他的數學原理是什麼。這個東西我理解了很久很久才算明白,我現在用說人話的方式來說說整個過程,作為一個拋磚引玉吧,當然,和實際的演算法還是有比較大出入的,如果真感興趣可以看後面的推薦文章。

我們先定義下一個場景,有3篇文件,每個文件有2個詞,設定有2個主題,這三篇文件和詞分別是:

1 :你好 世界 2 :你好 中國 3 :搜尋 你好

那麼詞就是:你好,世界,中國,搜尋 四個 主題定義為:T1,T2

下方這些人話是重點了。

因為我們認為寫文章的時候是是按照兩步來做的(先確定主題,然後確定詞,最後把詞寫出來),那麼在數學上可以變成兩個概率的乘積了,所以,這個詞為什麼會出現在這篇文章呢?是因為

這個詞在這篇文章出現的概率=這個主題在這篇文章的概率*這個詞在這個主題下出現的概率,也就是 P(W(詞)|D(文章))=P(W(詞)|T(主題))*P(T(主題)|D(文章)),這個 公式非常重要。

P(W(詞)|D(文章)) 這個其實是可以直接統計出來的。

P(W(詞)|T(主題)) 這個是模型的一部分,是要求出來的。

P(T(主題)|D(文章)) 這個是最後分類的結果

有新來的文章我們要對這篇文章進行分類的話,先統計出P(W(詞)|D(文章)),然後用P(W(詞)|D(文章))去除以P(W(詞)|T(主題)) ,就得到了這篇文章所屬的每個主題的概率了。

人話說完了,我們看看機器怎麼來求出這個P(W(詞)|T(主題))

  • 首先隨機指定每個詞屬於某個主題,那麼假設設定完了以後P(W|T)的矩陣就是
主題 你好 世界 中國 搜尋
T1 0.0 1.0 0.0 0.0
T2 0.33 0.0 0.33 0.33
  • 然後隨機的指定每個主題對應的文件概率,P(T|D)的矩陣就是
文件 主題1概率 主題2概率
文件1 0.5 0.5
文件2 0.5 0.5
文件3 0.5 0.5
  • 然後拿第一篇文章的第一個詞出來,統計出來他在這篇文章出現的概率,也就是0.5,再給他隨機拍一個主題,比如T1

  • 用上述的計算出來的話0.0*0.5=0.0,而我們統計出來是0.5啊,這不對,我們再試試別的主題,比如T2,這麼算出來0.33*0.5=0.165,也不對啊,但比T1好像要靠譜一點,那我們按照這個調整一下上面兩個表格的數字吧,比如把那個0.0改成0.2之類的(具體怎麼調?呵呵呵,靠說人話我說不出來了,看後面的連結吧)。

  • 這麼一個一個詞下來,上面兩個表格就在不斷更新,然後我們一遍一遍的迴圈迭代,直到上面兩個表格能滿足所有文件所有詞要求了就結束了。放心,不會死迴圈的。 這麼一輪下來,就得到了兩個表格了。這兩個表格就是我們的LDA模型了。

  • 新來的文章我們要對這篇文章進行分類的話,先統計出P(W(詞)|D(文章)),然後用P(W(詞)|D(文章))去除以P(W(詞)|T(主題)) ,就得到了這篇文章所屬的每個主題的概率了。

  • 然後我們還可以把新文章也放進模型中繼續訓練,然後又得到一個更新了的表格,這樣不斷有文章進來,表格就不斷變化了。

好了,說完了,在沒有一個公式的情況下我只能說到這了,實際的LDA還是有非常大的差距的,如果大家感興趣,可以看看下面幾篇文章:

如果你看了還是沒有懂,或者你完全看不懂上面的文章,那麼回頭去看看高數,概率論吧,我只能幫到這了,但是不懂沒關係,你也可以玩LDA,我後面的文章會有工程化的例子,不用懂也行。

主題模型除了LDA還有很多其他的,比如LSI,雖然最後結果也比較靠譜,但是他的可解釋性就不強了,我也沒法用說人話的方式描述出來了。

主題模型這種東西是基於大規模的語料的情況下才有效果,而且主題的設定個數也是個經驗值,據傳說300個主題是個比較合適的值,但是具體合適不合適需要根據你自己的情況是測試,然後找到一個你認為合適的主題數。

2. 詞向量

最後簡單的說一下目前也用得比較多的詞向量,就是word2vector了,光有了主題模型很多人還是不滿足,他們還想知道詞與詞之間的關係,人為的表示也就是近義詞了,但是詞向量能解決的可遠遠不是近義詞同義詞了,比如給一堆微博的語料丟給word2vec來訓練,他可以找出來范冰冰李晨這兩個詞有關係,然後我們發揮一下,如果你有個推薦系統,按照文字相關性去推薦內容,發現沒有太相關的推薦結果,這時候你就可以用word2vec擴充套件你的詞了,然後用擴充套件的詞去推薦東西了,比如用范冰冰的新聞推薦出李晨的新聞來,當然這只是舉個例子啊,我暫時還沒看到有地方這麼來做推薦。

詞向量也就是用一個向量來表示一個詞,比如一個詞北京,還有三個維度分別是大學,北方,首都,我們把北京用向量表示成[0,9,0.5,1],那麼這個詞有3個維度,這三個維度的意義是什麼呢?可以解釋成北京這個詞啊是大學的概率是0.6,他在北方的概率是0.5,他是首都的概率是1,是不是和上面的分類很相似啊,如果每個詞都可以這麼表示的話,那麼兩個詞之間的相似度就是這兩個向量之間的距離了,和上一篇的向量空間一樣,那麼如何來求一個詞的向量呢?其實也可以按照上面的LDA的方式分類來求,呵呵,但我們不這麼來。

還是按照上面那個例子來看看,你看到范冰冰這個詞,為什麼你覺得他和李晨會相似呢?我們知道的是他們是夫妻所以才相似,為什麼知道他們是夫妻呢?因為新聞的文章中這兩個詞老是出現在一起,要不就是在一句話中或者在一段話中,所以冥冥之中我們覺得他們是有相似性的,好吧,就是這個冥冥之中怎麼讓機器知道,有個東西叫神經網路,最會冥冥之中,因為他冥冥之中想出來的東西你解釋不了,但又好像也能說得過去。好,那麼我們來看看機器怎麼弄的。

  • 假設有這麼一句話我愛北京天安門,我們先給每個詞編個號,我1,愛2,北京3,天安門4。
  • 然後,我們掃描這個句子的每個詞,找和他相鄰的兩個詞,分別是他前面一個和後面一個,那麼一輪下來,我們得到一個這樣的東西:1(2),2(1,3),3(2,4),4(3),這表示什麼?表示每個詞和他有兩個相關的詞,如果我們有大量的句子,那麼可以得到非常多的上述關係表示式。
  • 然後呢?然後我們設定一個向量的維度,也就是每個詞我們可以用幾個維度來表示。
  • 再然後呢?再然後就上神經網路了,這東西啊,如果你知道邏輯迴歸這種機器學習的方法的話,再假設邏輯迴歸是物理電路中的一條迴路的話,那神經網路就是把邏輯迴歸這種迴路串聯並聯起來的東西。也就是邏輯迴歸的邏輯迴歸的邏輯迴歸【這句話不是我總結的,我忘了在哪看到過了,覺得挺形象】
  • 最後呢?最後每個詞就成了一個向量了。

有了向量了,那麼就能比較了吧?

總結

好了,今天扯了這麼多,我看下來有點耽誤人的意思,因為用太通俗的話根本解釋不了很多數學模型,而我數學也不好,要說清楚這些個數學模型我也很費勁,關鍵是一堆公式出來也沒人看,自己心裡默默的清楚就行了,大家也別想著通過一兩篇文章能瞭解一個數學模型,自然語言處理這個本來就是個拼數學的領域,要深入還得自己去看書看論文,要了解這些數學模型也不是看一篇文章能瞭解的,真的感興趣的,想做演算法工程師的,自己專研吧。

下一篇我會把這兩篇的東西實戰一下,看看最終是不是有效果,估計下一篇能有意思一點。


歡迎關注我的公眾號,主要聊聊搜尋,推薦,廣告技術,還有瞎扯。。文章會在這裡首先發出來:)掃描或者搜尋微訊號XJJ267或者搜尋西加加語言就行

相關文章