當前位置:
首頁 > 知識 > 如何用Python從海量文本抽取主題?

如何用Python從海量文本抽取主題?

你在工作、學習中是否曾因信息過載叫苦不迭?有一種方法能夠替你讀海量文章,並將不同的主題和對應的關鍵詞抽取出來,讓你談笑間觀其大略。

本文使用Python對超過1000條文本做主題抽取,一步步帶你體會非監督機器學習LDA方法的魅力。想不想試試呢?

淹沒

每個現代人,幾乎都體會過信息過載的痛苦。文章讀不過來,音樂聽不過來,視頻看不過來。可是現實的壓力,使你又不能輕易放棄掉。

假如你是個研究生,教科書和論文就是你不得不讀的內容。現在有了各種其他的閱讀渠道,微信、微博、得到App、多看閱讀、豆瓣閱讀、Kindle,還有你在RSS上訂閱的一大堆博客……情況就變得更嚴重了。

因為對數據科學很感興趣,你訂閱了大量的數據科學類微信公眾號。雖然你很勤奮,但你知道自己依然遺漏了很多文章。

學習了Python爬蟲課以後,你決定嘗試一下自己的屠龍之術。依仗著爬蟲的威力,你打算採集到所有數據科學公眾號文章。

你仔細分析了微信公眾號文章的檢索方式,制定了關鍵詞列表。巧妙利用搜狗搜索引擎的特性,你編寫了自己的爬蟲,並且成功地於午夜放到了雲端運行。

開心啊,激動啊……

想要系統學習python和免費學習資料的 可以加裙 四七四五三四九五一

第二天一早,天光剛亮,睡眠不足的你就興沖沖地爬起來去看爬取結果。居然已經有了1000多條!你欣喜若狂,導出成為csv格式,存儲到了本地機器,並且打開瀏覽。

興奮了10幾分鐘之後,你冷卻了下來,給自己提出了2個重要的問題。

這些文章都值得讀嗎?

這些文章我讀得過來嗎?

一篇數據科學類公眾號,你平均需要5分鐘閱讀。這1000多篇……你拿出計算器認真算了一下。

讀完這一宿採集到的文章,你不眠不休的話,也需要85個小時。

在你閱讀的這85個小時裡面,許許多多的數據科學類公眾號新文章還會源源不斷湧現出來。

你感覺自己快被文本內容淹沒了,根本透不過氣……

學了這麼長時間Python,你應該想到――我能否用自動化工具來分析它?

好消息,答案是可以的。

但是用什麼樣的工具呢?

翻了翻你自己的武器庫,你發現了詞雲、情感分析和決策樹。

然而,在幫你應對信息過載這件事兒上,上述武器好像都不大合適。

詞雲你打算做幾個?全部文章只做一個的話,就會把所有文章的內容混雜起來,沒有意義――因為你知道這些文章談的就是數據科學啊!如果每一篇文章都分別做詞雲,1000多張圖瀏覽起來,好像也沒有什麼益處。

你閱讀數據科學類公眾號文章是為了獲得知識和技能,分析文字中蘊含的情感似乎於事無補。

決策樹是可以用來做分類的,沒錯。可是它要求的輸入信息是 結構化 的 有 標記數據,你手裡握著的這一大堆文本,卻剛好是 非結構化 的 無 標記數據。

全部武器都啞火了。

沒關係。本文幫助你在數據科學武器庫中放上一件新式兵器。它能夠處理的,就是大批量的非結構無標記數據。在機器學習的分類里,它屬於非監督學習(unsupervised machine learning)範疇。具體而言,我們需要用到的方法叫主題建模(topic model)或者主題抽取(topic extraction)。

主題

既然要建模,我們就需要弄明白建立什麼樣的模型。

根據維基百科的定義,主題模型是指:在機器學習和自然語言處理等領域是用來在一系列文檔中發現抽象主題的一種統計模型。

這個定義本身好像就有點兒抽象,咱們舉個例子吧。

還是維基百科上,對一條可愛的小狗有這樣一段敘述。

阿博(Bo;2008年10月9日-) 是美國第44任總統巴拉克?奧巴馬的寵物狗,也是奧巴馬家族的成員之一。阿博是一隻已閹割的雄性黑色長毛葡萄牙水犬。奧巴馬一家本來沒有養狗,因為他的大女兒瑪麗亞對狗過敏。但為了延續白宮主人歷年均有養狗的傳統,第一家庭在入主白宮後,花了多個月去觀察各種犬種,並特地選擇了葡萄牙水犬這一種掉毛少的低敏狗。

我們來看看這條可愛的小狗照片:

問題來了,這篇文章的主題(topic)是什麼?

你可能脫口而出,「狗啊!」

且慢,換個問法。假設一個用戶讀了這篇文章,很感興趣。你想推薦更多他可能感興趣的文章給他,以下2段文字,哪個選項更合適呢?

選項1:

阿富汗獵狗(Afghan Hound)是一種獵犬,也是最古老的狗品種。阿富汗獵狗外表厚實,細膩,柔滑,它的尾巴在最後一環捲曲。阿富汗獵狗生存於伊朗,阿富汗東部的寒冷山上,阿富汗獵狗最初是用來狩獵野兔和瞪羚。阿富汗獵狗其他名稱包含巴爾赫塔子庫奇獵犬,獵犬,俾路支獵犬,喀布爾獵犬,或非洲獵犬。

選項2:

1989年夏天,奧巴馬在西德利?奧斯汀律師事務所擔任暑期工讀生期間,結識當時已是律師的米歇爾?魯濱遜。兩人於1992年結婚,現有兩個女兒――大女兒瑪麗亞在1999年於芝加哥芝加哥大學醫療中心出生,而小女兒薩沙在2001年於芝加哥大學醫療中心出生。

給你30秒,思考一下。你的答案是什麼?

我的答案是――不確定。

人類天生喜歡把複雜問題簡單化。我們恨不得把所有東西劃分成具體的、互不干擾的分類,就如同藥鋪的一個個抽屜一樣。然後需要的時候,從對應的抽屜裡面取東西就可以了。

這就像是職業。從前我們說「三百六十行」。隨便拿出某個人來,我們就把他歸入其中某一行。

現在不行了,反例就是所謂的「斜杠青年」。

主題這個事情,也同樣不那麼涇渭分明。介紹小狗Bo的文章雖然不長,但是任何單一主題都無法完全涵蓋它。

如果用戶是因為對小狗的喜愛,閱讀了這篇文章,那麼顯然你給他推薦選項1會更理想;但是如果用戶關注的是奧巴馬的家庭,那麼比起選項2來,選項1就顯得不是那麼合適了。

我們必須放棄用一個詞來描述主題的嘗試,轉而用一系列關鍵詞來刻畫某個主題(例如「奧巴馬」+「寵物「+」狗「+」第一家庭「)。

在這種模式下,以下的選項3可能會脫穎而出:

據英國《每日郵報》報道,美國一名男子近日試圖綁架總統奧巴馬夫婦的寵物狗博(Bo),不惜由二千多公里遠的北達科他州驅車往華盛頓,但因為走漏風聲,被特勤局人員逮捕。奧巴馬夫婦目前養有博和陽光(Sunny)兩隻葡萄牙水犬。

講到這裡,你大概弄明白了主題抽取的目標了。可是面對浩如煙海的文章,我們怎麼能夠把相似的文章聚合起來,並且提取描述聚合後主題的重要關鍵詞呢?

主題抽取有若干方法。目前最為流行的叫做隱含狄利克雷分布(Latent Dirichlet allocation),簡稱LDA。

LDA相關原理部分,置於本文最後。下面我們先用Python來嘗試實踐一次主題抽取。如果你對原理感興趣,不妨再做延伸閱讀。

準備

準備工作的第一步,還是先安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python做詞雲 》一文。

文章鏈接:

http://www.jianshu.com/p/e4b24a734ccc

下載地址:

如果一切正常,請將該csv文件移動到咱們的工作目錄demo下。

到你的系統「終端」(macOS, Linux)或者「命令提示符」(Windows)下,進入我們的工作目錄demo,執行以下命令。

運行環境配置完畢。

在終端或者命令提示符下鍵入:

Jupyter Notebook已經正確運行。下面我們就可以正式編寫代碼了。

代碼

我們在Jupyter Notebook中新建一個Python 2筆記本,起名為topic-model。

為了處理表格數據,我們依然使用數據框工具Pandas。先調用它。

然後讀入我們的數據文件datascience.csv,注意它的編碼是中文GB18030,不是Pandas默認設置的編碼,所以此處需要顯式指定編碼類型,以免出現亂碼錯誤。

我們來看看數據框的頭幾行,以確認讀取是否正確。

顯示結果如下:

沒問題,頭幾行內容所有列都正確讀入,文字顯式正常。我們看看數據框的長度,以確認數據是否讀取完整。

執行的結果為:

行列數都與我們爬取到的數量一致,通過。

下面我們需要做一件重要工作――分詞。這是因為我們需要提取每篇文章的關鍵詞。而中文本身並不使用空格在單詞間劃分。此處我們採用「結巴分詞」工具。這一工具的具體介紹和其他用途請參見《如何用Python做中文分詞?》一文。

文章鏈接:

我們首先調用jieba分詞包。

我們此次需要處理的,不是單一文本數據,而是1000多條文本數據,因此我們需要把這項工作並行化。這就需要首先編寫一個函數,處理單一文本的分詞。

有了這個函數之後,我們就可以不斷調用它來批量處理數據框裡面的全部文本(正文)信息了。你當然可以自己寫個循環來做這項工作。但這裡我們使用更為高效的apply函數。

下面這一段代碼執行起來,可能需要一小段時間。請耐心等候。

執行過程中可能會出現如下提示。沒關係,忽略就好。

執行完畢之後,我們需要查看一下,文本是否已經被正確分詞。

結果如下:

單詞之間都已經被空格區分開了。下面我們需要做一項重要工作,叫做文本的向量化。

不要被這個名稱嚇跑。它的意思其實很簡單。因為計算機不但不認識中文,甚至連英文也不認識,它只認得數字。我們需要做的,是把文章中的關鍵詞轉換為一個個特徵(列),然後對每一篇文章數關鍵詞出現個數。

假如這裡有兩句話:

I love the game.

I hate the game.

那麼我們就可以抽取出以下特徵:

I

love

hate

the

game

然後上面兩句話就轉換為以下表格:

第一句表示為[1, 1, 0, 1, 1],第二句是[1, 0, 1, 1, 1]。這就叫向量化了。機器就能看懂它們了。

原理弄清楚了,讓我們引入相關軟體包吧。

處理的文本都是微信公眾號文章,裡面可能會有大量的辭彙。我們不希望處理所有辭彙。因為一來處理時間太長,二來那些很不常用的辭彙對我們的主題抽取意義不大。所以這裡做了個限定,只從文本中提取1000個最重要的特徵關鍵詞,然後停止。

下面我們開始關鍵詞提取和向量轉換過程:

到這裡,似乎什麼都沒有發生。因為我們沒有要求程序做任何輸出。下面我們就要放出LDA這個大招了。先引入軟體包:

然後我們需要人為設定主題的數量。這個要求讓很多人大跌眼鏡――我怎麼知道這一堆文章裡面多少主題?!

別著急。應用LDA方法,指定(或者叫瞎猜)主題個數是必須的。如果你只需要把文章粗略劃分成幾個大類,就可以把數字設定小一些;相反,如果你希望能夠識別出非常細分的主題,就增大主題個數。

對劃分的結果,如果你覺得不夠滿意,可以通過繼續迭代,調整主題數量來優化。這裡我們先設定為5個分類試試。

把我們的1000多篇向量化後的文章扔給LDA,讓它歡快地找主題吧。

這一部分工作量較大,程序會執行一段時間,Jupyter Notebook在執行中可能暫時沒有響應。等待一會兒就好,不要著急。

程序終於跑完了的時候,你會看到如下的提示信息:

可是,這還是什麼輸出都沒有啊。它究竟找了什麼樣的主題?

主題沒有一個確定的名稱,而是用一系列關鍵詞刻畫的。我們定義以下的函數,把每個主題裡面的前若干個關鍵詞顯示出來:

定義好函數之後,我們暫定每個主題輸出前20個關鍵詞。

以下命令會幫助我們依次輸出每個主題的關鍵詞表:

執行效果如下:

在這5個主題里,可以看出主題0主要關注的是數據科學中的演算法和技術,而主題4顯然更注重數據科學的應用場景。

剩下的幾個主題可以如何歸納?作為思考題,留給你花時間想一想吧。

到這裡,LDA已經成功幫我們完成了主題抽取。但是我知道你不是很滿意,因為結果不夠直觀。

那咱們就讓它直觀一些好了。執行以下命令,會有有趣的事情發生。

對,你會看到如下的一張圖,而且還是可交互的動態圖哦。

圖的左側,用圓圈代表不同的主題,圓圈的大小代表了每個主題分別包含文章的數量。

圖的右側,列出了最重要(頻率最高)的30個關鍵詞列表。注意當你沒有把滑鼠懸停在任何主題之上的時候,這30個關鍵詞代表全部文本中提取到的30個最重要關鍵詞。

如果你把滑鼠懸停在1號上面:

右側的關鍵詞列表會立即發生變化,紅色展示了每個關鍵詞在當前主題下的頻率。

以上是認為設定主題數為5的情況。可如果我們把主題數量設定為10呢?

你不需要重新運行所有代碼,只需要執行下面這幾行就可以了。這段程序還是需要運行一段時間,請耐心等待。

程序輸出給我們10個主題下最重要的20個關鍵詞。

附帶的是可視化的輸出結果:

你馬上會發現當主題設定為10的時候,一些有趣的現象發生了――大部分的文章抱團出現在右上方,而2個小部落(8和10)似乎離群索居。我們查看一下這裡的8號主題,看看它的關鍵詞構成。

通過高頻關鍵詞的描述,我們可以猜測到這一主題主要探討的是政策和法律法規問題,難怪它和那些技術、演算法與應用的主題顯得如此格格不入。

說明

前文幫助你一步步利用LDA做了主題抽取。成就感爆棚吧?然而這裡有兩點小問題值得說明。

首先,信息檢索的業內專家一看到剛才的關鍵詞列表,就會哈哈大笑――太粗糙了吧!

居然沒有做中文停用詞(stop words)去除!沒錯,為了演示的流暢,我們這裡忽略了許多細節。很多內容使用的是預置默認參數,而且完全忽略了中文停用詞設置環節,因此「這個」、「如果」、「可能」、「就是」這樣的停用詞才會大搖大擺地出現在結果中。不過沒有關係,完成比完美重要得多。知道了問題所在,後面改進起來很容易。有機會我會寫文章介紹如何加入中文停用詞的去除環節。

另外,不論是5個還是10個主題,可能都不是最優的數量選擇。你可以根據程序反饋的結果不斷嘗試。實際上,可以調節的參數遠不止這一個。如果你想把全部參數都搞懂,可以繼續閱讀下面的「原理」部分,按圖索驥尋找相關的說明和指引。

原理

前文我們沒有介紹原理,而是把LDA當成了一個黑箱。不是我不想介紹原理,而是過於複雜。

只給你展示其中的一個公式,你就能管窺其複雜程度了。

透露給你一個秘密:在計算機科學和數據科學的學術講座中,講者在介紹到LDA時,都往往會把原理這部分直接跳過去。

好在你不需要把原理完全搞清楚,再去用LDA抽取主題。

這就像是學開車,你只要懂得如何加速、剎車、換擋、打方向,就能讓車在路上行駛了。即便你通過所有考試並取得了駕駛證,你真的了解發動機或電機(如果你開的是純電車)的構造和工作原理嗎?

但是如果你就是希望了解LDA的原理,那麼我給你推薦2個學起來不那麼痛苦的資源吧。

首先是教程幻燈。slideshare是個尋找教程的好去處。這份教程 瀏覽量超過20000,內容深入淺出,講得非常清晰。

教程鏈接:

https://www.slideshare.net/clauwa/topic-models-lda-and-correlated-topic-models?next_slideshow=1

但如果你跟我一樣,是個視覺學習者的話,我更推薦你看這段Youtube視頻。

視頻地址:

https://www.youtube.com/watch?v=BuMu-bdoVrU

講者是Christine Doig,來自Continuum Analytics。咱們一直用的Python套裝Anaconda就是該公司的產品。

Christine使用的LDA原理解釋模型,不是這個LDA經典論文中的模型圖(大部分人覺得這張圖不易懂):

她深入閱讀了各種文獻後,總結了自己的模型圖出來:

用這個模型來解釋LDA,你會立即有豁然開朗的感覺。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

使用Python自动提取内容摘要
Python Virtualenv 介紹
手把手教你如何用 Python 做情感分析
Python 多進程教程
Python 模擬登陸百度雲盤實戰教程

TAG:Python |

您可能感興趣

海量糖果空投,歡迎來到Candy planet
Service Mesh、雲原生、海量數據訪問……螞蟻金服邀請你來PICK?
Adobe緊急推送Lightroom Classic CC更新 修復海量BUG
Gucci、Valentino、Prada 等海量大牌85折+免郵!手慢無!
海量聯名,拒絕重複!三家「ComfyCush」聯名中,Proper 要以數量取勝
《蒼翼默示錄:Cross Tag Battle》海量角色截圖
這次,數字黃金要用海量iPhoneX在美國「撒野」了
谷歌Pixel 3 Lite海量真機泄露
手慢無!Ssense年中5折起!Chloe、Prada海量大牌瘋狂放血
Angelababy海量舊照你都看過嗎?沒想到日系baby更圈粉!整牙算什麼,齊劉海的換臉技能才滿點……
《美妙世界Final Remix》公布畫面對比與海量新截圖
3分鐘學會如何調度運營海量Redis系統
錯過等一年!Ps、1Password「黑五」限免紛紛開啟,還有海量大牌 App 等你來搶
NVIDIA RTX On:Gamescom海量新遊戲大作演示光線追蹤
海量配色輔以高檔麂皮質感!VANS Vault Originals 2018秋冬系列現已發售!
Paradox董事會主席發推特 為「海量DLC」商業策略辯護
海量數據AtlasDB正式發布,打造一款好用的國產資料庫產品
侃爺的 Yeezy 「帝國」曝光!還有海量樣品你根本沒有見過呢
《QQ飛車手游》答題賽開啟 Hello語音巔峰對決贏海量鑽石
《QQ飛車手游》答題賽開啟Hello語音巔峰對決贏海量鑽石