1. 程式人生 > >推薦系統技術之文字相似性計算(二)

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

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

今天我們稍微說說這個吧,後臺留言很多朋友對這方面感興趣,因為自然語言處理實在不是一篇文章就能說清的,而且我水平也非常有限,我本身是個工程人員,比較在行的是系統設計和架構,我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)的矩陣就是

主題你好世界中國搜尋
T10.01.00.00.0
T20.330.00.330.33
  • 然後隨機的指定每個主題對應的文件概率,P(T|D)的矩陣就是

文件主題1概率主題2概率
文件10.50.5
文件20.50.5
文件30.50.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),這表示什麼?表示每個詞和他有兩個相關的詞,如果我們有大量的句子,那麼可以得到非常多的上述關係表示式。

  • 然後呢?然後我們設定一個向量的維度,也就是每個詞我們可以用幾個維度來表示。

  • 再然後呢?再然後就上神經網路了,這東西啊,如果你知道邏輯迴歸這種機器學習的方法的話,再假設邏輯迴歸是物理電路中的一條迴路的話,那神經網路就是把邏輯迴歸這種迴路串聯並聯起來的東西。也就是邏輯迴歸的邏輯迴歸的邏輯迴歸【這句話不是我總結的,我忘了在哪看到過了,覺得挺形象】

  • 最後呢?最後每個詞就成了一個向量了。

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

總結

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

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


相關推薦

推薦系統技術文字相似性計算

上一篇中我們的小明已經中學畢業了,今天這一篇繼續文字相似性的計算。首先前一篇不能解決的問題是因為我們只是機械的計算了詞的向量,並沒有任何上下文的關係,所以思想還停留在機器層面,還沒有到更高的層次上來,正因為這樣才有了自然語言處理這門課程了。今天我們稍微說說這個吧,後臺留言很多

推薦系統技術文字相似性計算

前面說了兩篇了,分別介紹了TFIDF和向量空間的相關東西,然後介紹了主題模型,這一篇我們就來試試這兩個東西。詞向量就不在這篇試了,詞向量和這兩個關係不大,不好對比,不過我最後也給出了程式碼。0. 工具準備工欲善其事,必先利其器,那麼我們先來利其器,這裡我們使用的是python

Android編譯系統分析幾個關鍵點

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android

神經網路文字情感分析

Projet 2 在Project 1 中,我們學習瞭如何處理和統計reviews 基於上一個Project”一個蘿蔔一個坑”的思想,我們將文字進行了數字化,使得文字可以作為輸入進行訓練 在Project 2中我們將構建一個兩層的神經網路,並進行訓練

數據系統結構關系操作翻譯

pair set info cin several always dup similar data Published by McGraw-Hill, a business unit of The McGraw-Hill Companies, Inc., 1221 Aven

Windows 活動目錄AD服務器系統升級到2012域控升級

AD acticedirectory 升級 活動目錄 域控 4.域控升級4.1服務器加域1. 修改AD2008的IP地址為10.10.1.11,AD2012服務器的IP地址為:10.10.1.122. 打開計算機屬性窗口,點擊“更改設置”修改計算機名稱分別為AD20

聊聊高併發系統限流特技(轉)

上一篇《聊聊高併發系統限流特技-1》講了限流演算法、應用級限流、分散式限流;本篇將介紹接入層限流實現。 接入層限流 接入層通常指請求流量的入口,該層的主要目的有:負載均衡、非法請求過濾、請求聚合、快取、降級、限流、 A/B 測試、服務質量監控

docker容器技術虛擬化網路概述

前一篇文章連結:Docker容器技術之映象管理基礎(三)   目錄 一、docker網路簡介 1、 虛擬網路通訊的三種方式 1.1、橋接網路: 什麼是MAC: 1.2、NAT網路: 1.3、Overlay Network 2、

Docker容器技術映象管理基礎

上一篇文章連結:Docker容器技術基礎用法(二) 目錄   一、回顧 1.1docker容器的狀態 1.2docker容器管理時常用的命令 1.3docker的架構形式 二、About Docker Images 2.1 關於docker映象的作用

docker容器技術Dockerfile詳解

上一篇文章的連線:docker容器技術之儲存卷(五) 目錄 一、前言 二、Dockerfile 2.1製作映象有兩種: 2.2 什麼是Dockerfile? 2.3 Dockerfile的語法格式 dockerfile做映象時的工作邏輯: .dockering

Android編譯系統分析幾個關鍵點

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android

Android編譯系統分析幾個關鍵點

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android

機房收費系統vb.net打包與部署

             緊接著上篇部落格的打包和部署,以下說一下我在XP系統和.net framework2.0平臺公佈系統的解決的方法,對於.net framework2.0的情況,由於大家知道假設用visua

影象質量評價結構相似性SSIM

這篇文章主要介紹對影象質量進行打分評價的一個很經典的指數——結構相似性(structual similarity, SSIM)。 具體一點兒來說,影象在各種情況下都有可能失真,比如經過傳輸、壓縮和縮放等等。圖片變換之後,我們自然很想知道失真影象(distorte

影象質量評價結構相似性SSIM

在上一篇文章中,我們介紹了對影象質量進行評價的必要性、主觀評價和客觀評價的兩種標準,以及設計符合人類直覺的評價標準的困難性和重要性。 本來這篇文章想把我們的主角SSIM講完,但是發現前面需要寫的鋪墊有點長hhh,所以本文是作為一個過渡,系統的講解一下設計影象評價

SpringBoot實現Java高併發秒殺系統Service層開發

繼上一篇文章:SpringBoot實現Java高併發秒殺系統之DAO層開發 我們建立了SpringBoot專案並熟悉了秒殺系統的表設計,下面我們將講解一下秒殺系統的核心部分:Service業務層的開發。 Service層又稱為業務層,在Spring階段主要是由@

系統學習機器學習半引數方法--基於密度

轉自:https://www.cnblogs.com/pinard/p/6208966.html 基於密度聚類 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法)是一種很典型的密

影象特徵 Haar-like特徵計算方法-積分圖

1.積分圖(Integral Image)類似動態規劃的方法,主要的思想是將影象從起點開始到各個點所形成的矩形區域畫素之存在陣列中,當要計算某個區域的畫素和時可以直接從陣列中索引,不需要重新計算這個區域的畫素和,從而加快了計算。 ABCD是四個區域,包含若

系統學習機器學習距離的度量--DTW

 Dynamic Time Warping(DTW)誕生有一定的歷史了(日本學者Itakura提出),它出現的目的也比較單純,是一種衡量兩個長度不同的時間序列的相似度的方法。應用也比較廣,主要是在模板匹配中,比如說用在孤立詞語音識別(識別兩段語音是否表示同一個單詞),手勢

AndroidO audio系統audioflinger啟動分析

1. audioflinger建立過程 在Android8.0的音訊系統中,AudioFlinger是一個C++的Binder服務,執行在HAL程序中,它是在audioserver.c //frameworks/av/media/audioserver/