轉眼間已經工做了一段時間了,回想起2014年初學機器學習時的付出、艱苦和努力,感受都是值得的。從如今往前看,我是沿着「計算機->統計學->數據分析->數據挖掘->機器學習->文本挖掘」的路徑走過來的,我以爲這個思路仍是屬於比較傳統的進階方法,學習的內容有很多的冗餘,但相對來講更穩健一些。今天寫這篇文章的目的是想總結一下我最近關於文本挖掘的工做體會以及我對機器學習的一些新的見解,只爲探討,還望與你們共勉。算法
我先來講一些文本挖掘的東西。彷佛你們作Text Mining的不太多,可能並不太感冒,我就大致說一下我對Text Mining的理解吧(我以爲無論作哪種數據挖掘,方法和思路應該都是相通的,您試着看一下,說不定會有些啓發)。數據結構
文本挖掘,顧名思義,就是挖掘本文信息中潛在的有價值的信息。文本數據與數值數據的區別有三:第一,非結構化且數據量大;第二,它與人的語言是對接的;第三,文字的含義不惟一。下面我稍微展開來講。機器學習
首先,文本數據的數據量是很是之巨大的,一百萬條結構化數據可能才幾十到幾百兆,而一百萬條文本數據就已是GB了。固然文本數據的數據量沒法與天天的log數據相比,但在基礎數據中算是佔比很大的數據類型了。大數據容量的數據和大數據條目的數據處理方式徹底不同,普通的機器甚至都沒法按條處理;其次呢,文本數據是非結構化數據。非結構化意味着沒有任何的列可供你定義和參考。舉個例子來講:若是咱們想要提取用戶登陸的行爲數據,只要提取用戶的id、登陸時間、行爲時間、行爲內容之類的數據就能夠很完整的表達用戶的行爲;但對於文本數據卻無法這麼作,好比:「今天的天真好啊!」,提什麼呢?固然能夠提出這句話的主語等句法結構來,但那已是挖掘以後的結果了,而不是挖掘之前的原始提取。工具
第二點是最重要的,就是文本數據與人的思想直接對接。若是我獲取一對情侶的短信數據,男生對女生髮「我愛你」的次數和時間能直接反應男生對女生的態度。好比,男生總在對女生噓寒問暖以後說一句「我愛你」,而且一個月內常常說,可能表明男生真的很喜歡這個女孩;而若是男生每次說我愛你以後對女生各類不耐煩或敷衍,那麼這個男生可能與女生有些間隙了。固然,我只是舉了個例子,不過卻能證實文本挖掘也許這能挖掘出人的真實的態度。性能
第三點是文字的含義是不惟一的。這也是文本挖掘最大的難題所在。「你吃飯嗎?」——「我也不知道」,請問這個究竟是想吃飯仍是不想吃飯?固然,這個須要從上下文去解讀,可是在沒有上下文的時候也會出現這兩句話的(好比咱們在宿舍)。若是按咱們人的理解,大多數狀況下,是這我的不太想吃飯,但可能出於某種緣由(好比跟朋友一塊兒去吃或者完了就沒飯了)而又想去吃。反正根據我本身的經驗,通常說不知道的最後都去吃飯了……那麼,如何讓計算機去理解這樣的句子呢?目前來講,仍是比較難的。學習
這是文本數據與數值數據最大的區別,就是難以量化。大數據
那麼對於難以量化的數據該怎麼處理呢?網站
方法就是數據挖掘中的「數據轉換」。線程
咱們最終的目的是要量化一段文本(好比文本主題是哪一類、文本是什麼態度等等),能夠經過把文本轉換成其餘數據結構的數據,而後再根據該結構的類型判斷數據的類別。好比咱們把文本中能表達含義的基本單位「詞」組織成詞典,而後判斷詞典的類別,咱們就知道文本的類別了。舉個例子:「我喜歡劉亦菲」,分詞以後經過代詞詞典知道「我」是一個代詞,用當前用戶的id替換掉代詞,好比個人id是「小袁」,那麼這句話就變成了「小袁喜歡劉亦菲」,再經過正向謂詞詞典知道「喜歡」是一個正向謂詞,而劉亦菲是一個專有名詞,那麼當咱們想要知道在全部用戶中喜歡劉亦菲的有誰時,能夠輸出「小袁」。這在輿情分析和熱點分析中的做用是很是大的。索引
固然,上面的方法只是一個例子,且不具備實用性。由於創建詞典的代價是很是大的,更況且上面的例子還須要不少個詞典,而且詞典也很難包含全部的詞。因此,好多人就想出了一些新的方法,我在這裏就不一一列舉了。
當咱們可以量化文本了以後,咱們就能夠抽取文本信息了。好比,我想知道近一個月的熱門電影有哪些,咱們就能夠抽取出最近一個月的影評數據,而後抽取評論信息中的主語和賓語,經過天然語言處理方法進行消岐和消除指代後就能夠找到文本的命名實體,經過對找到的實體進行聚類就能找到熱門電影有哪些了。
那麼機器學習在文本挖掘中有哪些應用呢?
(1)話題識別
話題識別屬於文本分類,實驗中常見的例子就是把新聞文本分類成「財經、教育、體育、娛樂」等等。我目前經常使用的方法主要是「word2vector」和「word to bags」。 word2vector即「詞向量」,經過計算文本中詞出現的位置、詞性和頻率等特徵,判斷新文本是否來自於此類。好比識別文字是評論性文本仍是新聞類文本的一種方案就是評論性語句中出現的情態動詞和感嘆詞比較多且位置不固定。「word to bags」是詞袋,在topic model中應用的比較多。「word to bags」計算每一個詞出如今每一個類別的機率,而後經過TF-IDF或者信息增益或者機率找到類別信息含量高的詞語,經過判斷這些詞語的共線程度進行文本分類。
(2)情感分類
情感分析就是用戶的態度分析。如今大多數情感分析系統都是對文本進行「正負二項分類的」,即只判斷文本是正向仍是負向的,有的系統也能作到三分類(中立)。好比,我要分析用戶對2013年「馬航370事件」的態度,只要找到該事件的話題文本,經過臺大情感詞典等工具判斷情感詞的極性,而後根據必定規則組合情感詞的頻度和程度便可判斷文本的情感。但這種方法沒法判斷文本的評價刻面。好比,我如今有一百萬條「小米手機評價」信息,我能夠經過上面的方法瞭解大約有百分之多少的用戶對小米手機是不滿意的,但卻沒法知道這些不滿意的用戶是對小米手機的哪個方面不滿意以及佔的比率(好比是外形仍是性能)。經常使用的方法是構建小米手機相關詞的種子詞典,經過詞典找到用戶評論的刻面,再構建句法樹找到評論該刻面的謂語和修飾副詞,經過情感詞典量化出情感極性,最後將量化後的評論刻面、修飾詞、程度副詞帶入SVM進行文本分類。不過在這裏並不適合使用naive bayes,由於在多刻面多分類中,naive bayes很容易出現過擬合。
(3)命名實體識別
所謂的命名實體識別是指讓計算機自動識別出本身不認識的詞。好比:「胡歌唱歌很是好聽!」,計算機如何才能知道「胡歌」是一個詞而不該該是「歌唱」是一個詞呢?「胡歌」這個詞對於絕大多數詞庫而言都不太可能存在,那麼怎麼能讓機器識別出這個詞而且以最大的可能認爲這個詞是正確的呢?我認爲在全部的方法中,CRF的效果最好,甚至比HMM要好得多。CRF又稱條件隨機場,它可以記錄訓練數據中每一個特徵的狀態及其周圍特徵的狀態,當多個特徵同時出現的時候,找出每一個特徵在多個特徵組合中最有可能出現的狀態。也就是說,CRF以「物以類聚」爲基本論點,即大多數詞出現的環境是有規律的,並非雜亂無章的。選取特徵的時候,以「字」爲單位明顯要比以「詞」爲單位好不少,由於命名實體的詞是以字爲單位才能理解的,好比「陳小春」,咱們是以「陳/小/春」的意思來理解的,而不是「陳/小春」或者「陳小/春」。
(4)推薦系統
文本挖掘在推薦系統中的價值在於特徵詞權重的計算。好比咱們給用戶推薦一本新書。咱們能夠按照下面的方式進行建模:首先找到用戶評論中關於書籍的全部特徵詞彙,創建特徵詞典;而後經過文本分析和時間序列分析結合用戶評論的內容和時間緊湊度計算特徵詞的權重,表示某個用戶關心的某個特徵的程度。對創建好的用戶評論特徵程度表進行倒排索引,找到每一個特徵詞的全部評價用戶及其評價的權重,最後根據要推薦的書籍的特徵找到能夠推薦的用戶列表,找到評論權重高的用戶並把書籍推薦給他。
好了先說這麼多,不過在最後,我想總結一下關於機器學習的一些認識的問題。
有一些學習機器學習的朋友曾經問我,爲何他學機器學習有一段時間了可是感受沒學同樣,也不知道究竟該怎麼用。我以爲有三種可能:第一,看待問題不夠宏觀;第二,沒有從實際出發去思考機器學習這門技術;第三,前面的基礎沒打好,致使看後面的內容不知因此然。舉個例子來講,咱們經常要對網站的評論進行挖掘,努力找出評論信息中能表明用戶特徵、行爲、習慣、愛好、態度等信息的內容。要完成這樣的一份工做須要這麼幾個步驟:獲取原始數據、數據清洗、數據轉換、歸約和降維、選擇特徵項、選擇分類器、創建特徵抽取模型、訓練數據、分類數據、結果評測、模型調整……若是咱們不能宏觀的以解決問題爲目的而以使用某種技術方法的角度去看待這個任務,咱們根本無從下手,由於某種技術僅僅是解決問題的一種手段,而不是必要的一個步驟。這是第一個錯誤的來源。
再來講第二個錯誤。所謂的「從實際出發」是指咱們並每每不是「由於要解決某個問題而使用某種技術」,而常常是「由於我會某種技術而去解決某個問題」。舉個例子,當我第一次看明白SVM的時候我很興奮,我找了一大堆數據來跑SVM,好比對影評或微博評論進行態度情感分類之類的工做。但是當我作到特徵抽取的時候就發現我很難量化出一段文字描述的內容及其程度來。後來想了好多辦法來解決,最終把向量空間變異成了語言空間模型,才實現了最終的結果,並且精讀也不是很高。這個時候基本也已經不是原來的SVM了。在整個過程當中,我強行的使用某種方法去解決一個問題,最終致使工做趨於失敗的方向(雖然勉強實現了,但結果差強人意。後來發現使用bayes效果更好)。我認爲第二個錯誤是絕大多數新手都會犯的錯誤,我在這方面犯了無數次跟頭,但願你們引覺得戒。
最後一個錯誤也很廣泛,也是不少同窗常常出現的老大難的問題,典型例子就是理論推導。好比,SVM中引入拉格朗日乘子α來處理掉w和b,將兩個參數的推待求方程變爲了一個參數的待求方程。那麼引入拉格朗日參數的緣由是什麼?甚至會問「拉格朗日是什麼來着?」這些都須要咱們回頭去查資料的。若是數學和計算機的理論不夠,咱們很難往下推進學習的進展,也難以理解算法採用某種方法的原理是什麼。
不過,在咱們最求因此然的時候,也要在某些細枝末節上學會「不求甚解」。好多同窗(包括我在內)都曾經由於一個積分算不出來而失去了學下去的整個動力。其實我很建議你們有的時候不要太過於糾結爲何積分結果是這樣,爲何結果形式變了,而應該多想想爲何要求這個結果?這個結果有什麼用?這對你們更深刻的理解算法有用得多。那麼爲何不建議你們去想計算的細節呢?由於在實際應用中計算過程被計算機給代替了。
好了,碼了這麼多字,有點累了。仍是那句話,只是一個階段性總結,寫的不周到的地方,還望你們指出,小弟不勝感激!
——小袁NLP