推薦系統技術 --- 文本類似性計算(二)

第一篇地址:http://www.javashuo.com/article/p-fhoglbad-ec.html
上一篇中咱們的小明已經中學畢業了,今天這一篇繼續文本類似性的計算。
首先前一篇不能解決的問題是由於咱們只是機械的計算了詞的向量,並無任何上下文的關係,因此思想還停留在機器層面,尚未到更高的層次上來,正由於這樣纔有了天然語言處理這門課程了。算法

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

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

1. 主題模型(Topic Model)

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

如何來對文章進行分類呢?若是按照以前的算法,咱們能夠把每篇文章的關鍵詞都提取出來,而後按照關鍵詞進行分類,把文章分到每一個類別中,可是,那樣顯得不過高端,咱們來想一想這麼一個狀況,就是你是如何寫這篇文章的?架構

好比我目前寫的這篇文章文本類似性的計算,通常的思路是這樣的。機器學習

  • 首先,你想好題目之後會想一些提綱,好比我想我會寫一下主題模型,而後寫詞向量,這兩個就是個人主題了。函數

  • 而後,我開始寫了,寫主題模型的時候,個人一些詞語都是和主題模型相關的,好比LDA分類主題機率啊等等,而後寫詞向量的時候也會有這麼一些詞,這些就是主題下的詞語。學習

  • 最後,我就是按照上面的兩條規則把文章寫完了。測試

如何讓以計算機的思惟來按這個規則寫做呢?spa

  • 首先,定兩個主題,而後把每一個詞都分到某一個主題下

  • 開始寫做的時候就是先找個主題,而後在主題下找個詞,而後寫出來

  • 循環到上一步,就是這樣麼一直寫,而後一篇文章就寫好了

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

這樣固然寫不出東西來,可是咱們如今須要的分類,若是反過來想一想,我已經有一篇文章了,若是我知道這篇文章的每一個詞都屬於哪一個分類,那麼我其實就知道了這篇文章都屬於哪些個主題了,那麼有類似主題的文章,極可能是比較類似的。

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

主題主題下的詞怎麼找呢?最簡單的就是靠人拍啊,人爲的設定一些主題和這個主題下的詞以及詞出現的機率,那不就好了,人怎麼拍呢?靠經驗啊,我今年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或者搜索西加加語言就行
圖片描述

相關文章
相關標籤/搜索