丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習(xí)社
發(fā)送

1

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

本文作者: AI研習(xí)社 2017-07-06 15:22
導(dǎo)語(yǔ):文章太多不知道讀哪篇?可以試試非監(jiān)督機(jī)器學(xué)習(xí)中的 LDA(Latent Dirichlet allocation)方法。

雷鋒網(wǎng)按:本文作者王樹義,原載于微信公眾號(hào)玉樹芝蘭(nkwangshuyi),雷鋒網(wǎng)經(jīng)授權(quán)發(fā)布。

你在工作、學(xué)習(xí)中是否曾因信息過(guò)載叫苦不迭?有一種方法能夠替你讀海量文章,并將不同的主題和對(duì)應(yīng)的關(guān)鍵詞抽取出來(lái),讓你談笑間觀其大略。本文使用Python對(duì)超過(guò)1000條文本做主題抽取,一步步帶你體會(huì)非監(jiān)督機(jī)器學(xué)習(xí)LDA方法的魅力。想不想試試呢?

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

淹沒

每個(gè)現(xiàn)代人,幾乎都體會(huì)過(guò)信息過(guò)載的痛苦。文章讀不過(guò)來(lái),音樂聽不過(guò)來(lái),視頻看不過(guò)來(lái)??墒乾F(xiàn)實(shí)的壓力,使你又不能輕易放棄掉。

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

因?yàn)閷?duì)數(shù)據(jù)科學(xué)很感興趣,你訂閱了大量的數(shù)據(jù)科學(xué)類微信公眾號(hào)。雖然你很勤奮,但你知道自己依然遺漏了很多文章。

學(xué)習(xí)了 Python爬蟲課 以后,你決定嘗試一下自己的屠龍之術(shù)。依仗著爬蟲的威力,你打算采集到所有數(shù)據(jù)科學(xué)公眾號(hào)文章。

你仔細(xì)分析了微信公眾號(hào)文章的檢索方式,制定了關(guān)鍵詞列表。巧妙利用搜狗搜索引擎的特性,你編寫了自己的爬蟲,并且成功地于午夜放到了云端運(yùn)行。

開心啊,激動(dòng)啊……

第二天一早,天光剛亮,睡眠不足的你就興沖沖地爬起來(lái)去看爬取結(jié)果。居然已經(jīng)有了1000多條!你欣喜若狂,導(dǎo)出成為csv格式,存儲(chǔ)到了本地機(jī)器,并且打開瀏覽。

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

興奮了10幾分鐘之后,你冷卻了下來(lái),給自己提出了2個(gè)重要的問題。

  • 這些文章都值得讀嗎?

  • 這些文章我讀得過(guò)來(lái)嗎?

一篇數(shù)據(jù)科學(xué)類公眾號(hào),你平均需要5分鐘閱讀。這1000多篇……你拿出計(jì)算器認(rèn)真算了一下。

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

讀完這一宿采集到的文章,你不眠不休的話,也需要85個(gè)小時(shí)。

在你閱讀的這85個(gè)小時(shí)里面,許許多多的數(shù)據(jù)科學(xué)類公眾號(hào)新文章還會(huì)源源不斷涌現(xiàn)出來(lái)。

你感覺自己快被文本內(nèi)容淹沒了,根本透不過(guò)氣……

學(xué)了這么長(zhǎng)時(shí)間Python,你應(yīng)該想到——我能否用自動(dòng)化工具來(lái)分析它?

好消息,答案是可以的。

但是用什么樣的工具呢?

翻了翻你自己的武器庫(kù),你發(fā)現(xiàn)了 詞云、情感分析 決策樹

然而,在幫你應(yīng)對(duì)信息過(guò)載這件事兒上,上述武器好像都不大合適。

詞云你打算做幾個(gè)?全部文章只做一個(gè)的話,就會(huì)把所有文章的內(nèi)容混雜起來(lái),沒有意義——因?yàn)槟阒肋@些文章談的就是數(shù)據(jù)科學(xué)??!如果每一篇文章都分別做詞云,1000多張圖瀏覽起來(lái),好像也沒有什么益處。

你閱讀數(shù)據(jù)科學(xué)類公眾號(hào)文章是為了獲得知識(shí)和技能,分析文字中蘊(yùn)含的情感似乎于事無(wú)補(bǔ)。

決策樹是可以用來(lái)做分類的,沒錯(cuò)??墒撬蟮妮斎胄畔⑹?strong>結(jié)構(gòu)化的有標(biāo)記數(shù)據(jù),你手里握著的這一大堆文本,卻剛好是非結(jié)構(gòu)化無(wú)標(biāo)記數(shù)據(jù)。

全部武器都啞火了。

沒關(guān)系。本文幫助你在數(shù)據(jù)科學(xué)武器庫(kù)中放上一件新式兵器。它能夠處理的,就是大批量的非結(jié)構(gòu)無(wú)標(biāo)記數(shù)據(jù)。在機(jī)器學(xué)習(xí)的分類里,它屬于非監(jiān)督學(xué)習(xí)(unsupervised machine learning)范疇。具體而言,我們需要用到的方法叫主題建模(topic model)或者主題抽取(topic extraction)。

主題

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

根據(jù)維基百科的定義,主題模型是指:

在機(jī)器學(xué)習(xí)和自然語(yǔ)言處理等領(lǐng)域是用來(lái)在一系列文檔中發(fā)現(xiàn)抽象主題的一種統(tǒng)計(jì)模型。

這個(gè)定義本身好像就有點(diǎn)兒抽象,咱們舉個(gè)例子吧。

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

阿博(Bo;2008年10月9日-) 是美國(guó)第44任總統(tǒng)巴拉克·奧巴馬的寵物狗,也是奧巴馬家族的成員之一。阿博是一只已閹割的雄性黑色長(zhǎng)毛葡萄牙水犬。奧巴馬一家本來(lái)沒有養(yǎng)狗,因?yàn)樗拇笈畠含旣悂唽?duì)狗過(guò)敏。但為了延續(xù)白宮主人歷年均有養(yǎng)狗的傳統(tǒng),第一家庭在入主白宮后,花了多個(gè)月去觀察各種犬種,并特地選擇了葡萄牙水犬這一種掉毛少的低敏狗。

我們來(lái)看看這條可愛的小狗照片:

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

問題來(lái)了,這篇文章的主題(topic)是什么?

你可能脫口而出,“狗啊!”

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

選項(xiàng)1:

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

選項(xiàng)2:

1989年夏天,奧巴馬在西德利·奧斯汀律師事務(wù)所擔(dān)任暑期工讀生期間,結(jié)識(shí)當(dāng)時(shí)已是律師的米歇爾·魯濱遜。兩人于1992年結(jié)婚,現(xiàn)有兩個(gè)女兒——大女兒瑪麗亞在1999年于芝加哥芝加哥大學(xué)醫(yī)療中心出生,而小女兒薩沙在2001年于芝加哥大學(xué)醫(yī)療中心出生。

給你30秒,思考一下。

你的答案是什么?

我的答案是——不確定。

人類天生喜歡把復(fù)雜問題簡(jiǎn)單化。我們恨不得把所有東西劃分成具體的、互不干擾的分類,就如同藥鋪的一個(gè)個(gè)抽屜一樣。然后需要的時(shí)候,從對(duì)應(yīng)的抽屜里面取東西就可以了。

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

這就像是職業(yè)。從前我們說(shuō)“三百六十行”。隨便拿出某個(gè)人來(lái),我們就把他歸入其中某一行。

現(xiàn)在不行了,反例就是所謂的“斜杠青年”。

主題這個(gè)事情,也同樣不那么涇渭分明。介紹小狗Bo的文章雖然不長(zhǎng),但是任何單一主題都無(wú)法完全涵蓋它。

如果用戶是因?yàn)閷?duì)小狗的喜愛,閱讀了這篇文章,那么顯然你給他推薦選項(xiàng)1會(huì)更理想;但是如果用戶關(guān)注的是奧巴馬的家庭,那么比起選項(xiàng)2來(lái),選項(xiàng)1就顯得不是那么合適了。

我們必須放棄用一個(gè)詞來(lái)描述主題的嘗試,轉(zhuǎn)而用一系列關(guān)鍵詞來(lái)刻畫某個(gè)主題(例如“奧巴馬”+“寵物“+”狗“+”第一家庭“)。

在這種模式下,以下的選項(xiàng)3可能會(huì)脫穎而出:

據(jù)英國(guó)《每日郵報(bào)》報(bào)道,美國(guó)一名男子近日試圖綁架總統(tǒng)奧巴馬夫婦的寵物狗博(Bo),不惜由二千多公里遠(yuǎn)的北達(dá)科他州驅(qū)車往華盛頓,但因?yàn)樽呗╋L(fēng)聲,被特勤局人員逮捕。奧巴馬夫婦目前養(yǎng)有博和陽(yáng)光(Sunny)兩只葡萄牙水犬。

講到這里,你大概弄明白了主題抽取的目標(biāo)了??墒敲鎸?duì)浩如煙海的文章,我們?cè)趺茨軌虬严嗨频奈恼戮酆掀饋?lái),并且提取描述聚合后主題的重要關(guān)鍵詞呢?

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

LDA相關(guān)原理部分,置于本文最后。下面我們先用Python來(lái)嘗試實(shí)踐一次主題抽取。如果你對(duì)原理感興趣,不妨再做延伸閱讀。

準(zhǔn)備

準(zhǔn)備工作的第一步,還是先安裝Anaconda套裝。詳細(xì)的流程步驟請(qǐng)參考《 如何用Python做詞云 》一文。文章鏈接:

http://t.cn/RSMX30W

從微信公眾平臺(tái)爬來(lái)的 datascience.csv 文件,請(qǐng)從如下鏈接下載:

http://t.cn/RK73cWs

你可以用Excel打開,看看下載是否完整和正確。

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

如果一切正常,請(qǐng)將該csv文件移動(dòng)到咱們的工作目錄demo下。

到你的系統(tǒng)“終端”(macOS, Linux)或者“命令提示符”(Windows)下,進(jìn)入我們的工作目錄demo,執(zhí)行以下命令。

pip install jieba

pip install pyldavis

運(yùn)行環(huán)境配置完畢。

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

jupyter notebook

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

Jupyter Notebook已經(jīng)正確運(yùn)行。下面我們就可以正式編寫代碼了。

代碼

我們?cè)贘upyter Notebook中新建一個(gè)Python 2筆記本,起名為topic-model。

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

為了處理表格數(shù)據(jù),我們依然使用數(shù)據(jù)框工具Pandas。先調(diào)用它。

import pandas as pd

然后讀入我們的數(shù)據(jù)文件datascience.csv,注意它的編碼是中文GB18030,不是Pandas默認(rèn)設(shè)置的編碼,所以此處需要顯式指定編碼類型,以免出現(xiàn)亂碼錯(cuò)誤。

df = pd.read_csv("datascience.csv", encoding='gb18030')

我們來(lái)看看數(shù)據(jù)框的頭幾行,以確認(rèn)讀取是否正確。

df.head()

顯示結(jié)果如下:

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

沒問題,頭幾行內(nèi)容所有列都正確讀入,文字顯式正常。我們看看數(shù)據(jù)框的長(zhǎng)度,以確認(rèn)數(shù)據(jù)是否讀取完整。

df.shape

執(zhí)行的結(jié)果為:

(1024, 3)

行列數(shù)都與我們爬取到的數(shù)量一致,通過(guò)。

下面我們需要做一件重要工作——分詞。這是因?yàn)槲覀冃枰崛∶科恼碌年P(guān)鍵詞。而中文本身并不使用空格在單詞間劃分。此處我們采用“結(jié)巴分詞”工具。這一工具的具體介紹和其他用途請(qǐng)參見《如何用Python做中文分詞?》一文,具體鏈接為:

http://t.cn/RK716mw

我們首先調(diào)用jieba分詞包。

import jieba

我們此次需要處理的,不是單一文本數(shù)據(jù),而是1000多條文本數(shù)據(jù),因此我們需要把這項(xiàng)工作并行化。這就需要首先編寫一個(gè)函數(shù),處理單一文本的分詞。

def chinese_word_cut(mytext):

    return " ".join(jieba.cut(mytext))

有了這個(gè)函數(shù)之后,我們就可以不斷調(diào)用它來(lái)批量處理數(shù)據(jù)框里面的全部文本(正文)信息了。你當(dāng)然可以自己寫個(gè)循環(huán)來(lái)做這項(xiàng)工作。但這里我們使用更為高效的apply函數(shù)。如果你對(duì)這個(gè)函數(shù)有興趣,可以點(diǎn)擊這段教學(xué)視頻查看具體的介紹,視頻鏈接:

http://t.cn/RK7102E

下面這一段代碼執(zhí)行起來(lái),可能需要一小段時(shí)間。請(qǐng)耐心等候。

df["content_cutted"] = df.content.apply(chinese_word_cut)

執(zhí)行過(guò)程中可能會(huì)出現(xiàn)如下提示。沒關(guān)系,忽略就好。

Building prefix dict from the default dictionary ...

Loading model from cache /var/folders/8s/k8yr4zy52q1dh107gjx280mw0000gn/T/jieba.cache

Loading model cost 0.406 seconds.

Prefix dict has been built succesfully.

執(zhí)行完畢之后,我們需要查看一下,文本是否已經(jīng)被正確分詞。

df.content_cutted.head()

結(jié)果如下:

0    大 數(shù)據(jù) 產(chǎn)業(yè) 發(fā)展 受到 國(guó)家 重視 , 而 大 數(shù)據(jù) 已經(jīng) 上升 為 國(guó)家 戰(zhàn)略 , 未...

1    點(diǎn)擊 上方 “ 硅谷 周邊 ” 關(guān)注 我 , 收到 最新 的 文章 哦 ! 昨天 , Goo...

2    國(guó)務(wù)院 總理 李克強(qiáng) 當(dāng)?shù)?時(shí)間 20 日 上午 在 紐約 下榻 飯店 同 美國(guó) 經(jīng)濟(jì) 、 ...

3    2016 年 , 全峰 集團(tuán) 持續(xù) 挖掘 大 數(shù)據(jù) 、 云 計(jì)算 、 “ 互聯(lián)網(wǎng) + ” 等...

4    貴州 理工學(xué)院 召開 大 數(shù)據(jù)分析 與 應(yīng)用 專題 分享 會(huì)   借 “ 創(chuàng)響 中國(guó) ” 貴...

Name: content_cutted, dtype: object

單詞之間都已經(jīng)被空格區(qū)分開了。下面我們需要做一項(xiàng)重要工作,叫做文本的向量化。

不要被這個(gè)名稱嚇跑。它的意思其實(shí)很簡(jiǎn)單。因?yàn)橛?jì)算機(jī)不但不認(rèn)識(shí)中文,甚至連英文也不認(rèn)識(shí),它只認(rèn)得數(shù)字。我們需要做的,是把文章中的關(guān)鍵詞轉(zhuǎn)換為一個(gè)個(gè)特征(列),然后對(duì)每一篇文章數(shù)關(guān)鍵詞出現(xiàn)個(gè)數(shù)。

假如這里有兩句話:

I love the game.

I hate the game.

那么我們就可以抽取出以下特征:

  • I

  • love

  • hate

  • the

  • game

然后上面兩句話就轉(zhuǎn)換為以下表格:

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

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

原理弄清楚了,讓我們引入相關(guān)軟件包吧。

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer

處理的文本都是微信公眾號(hào)文章,里面可能會(huì)有大量的詞匯。我們不希望處理所有詞匯。因?yàn)橐粊?lái)處理時(shí)間太長(zhǎng),二來(lái)那些很不常用的詞匯對(duì)我們的主題抽取意義不大。所以這里做了個(gè)限定,只從文本中提取1000個(gè)最重要的特征關(guān)鍵詞,然后停止。

n_features = 1000

下面我們開始關(guān)鍵詞提取和向量轉(zhuǎn)換過(guò)程:

tf_vectorizer = CountVectorizer(strip_accents = 'unicode',

                                max_features=n_features,

                                stop_words='english',

                                max_df = 0.5,

                                min_df = 10)

tf = tf_vectorizer.fit_transform(df.content_cutted)

到這里,似乎什么都沒有發(fā)生。因?yàn)槲覀儧]有要求程序做任何輸出。下面我們就要放出LDA這個(gè)大招了。

先引入軟件包:

from sklearn.decomposition import LatentDirichletAllocation

然后我們需要人為設(shè)定主題的數(shù)量。這個(gè)要求讓很多人大跌眼鏡——我怎么知道這一堆文章里面多少主題?!

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

對(duì)劃分的結(jié)果,如果你覺得不夠滿意,可以通過(guò)繼續(xù)迭代,調(diào)整主題數(shù)量來(lái)優(yōu)化。

這里我們先設(shè)定為5個(gè)分類試試。

n_topics = 5

lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=50,

                                learning_method='online',

                                learning_offset=50.,

                                random_state=0)

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

這一部分工作量較大,程序會(huì)執(zhí)行一段時(shí)間,Jupyter Notebook在執(zhí)行中可能暫時(shí)沒有響應(yīng)。等待一會(huì)兒就好,不要著急。

lda.fit(tf)

程序終于跑完了的時(shí)候,你會(huì)看到如下的提示信息:

LatentDirichletAllocation(batch_size=128, doc_topic_prior=None,

             evaluate_every=-1, learning_decay=0.7,

             learning_method='online', learning_offset=50.0,

             max_doc_update_iter=100, max_iter=50, mean_change_tol=0.001,

             n_jobs=1, n_topics=5, perp_tol=0.1, random_state=0,

             topic_word_prior=None, total_samples=1000000.0, verbose=0)

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

主題沒有一個(gè)確定的名稱,而是用一系列關(guān)鍵詞刻畫的。我們定義以下的函數(shù),把每個(gè)主題里面的前若干個(gè)關(guān)鍵詞顯示出來(lái):

def print_top_words(model, feature_names, n_top_words):

    for topic_idx, topic in enumerate(model.components_):

        print("Topic #%d:" % topic_idx)

        print(" ".join([feature_names[i]

                        for i in topic.argsort()[:-n_top_words - 1:-1]]))

    print()

定義好函數(shù)之后,我們暫定每個(gè)主題輸出前20個(gè)關(guān)鍵詞。

n_top_words = 20

以下命令會(huì)幫助我們依次輸出每個(gè)主題的關(guān)鍵詞表:

tf_feature_names = tf_vectorizer.get_feature_names()

print_top_words(lda, tf_feature_names, n_top_words)

執(zhí)行效果如下:

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

在這5個(gè)主題里,可以看出主題0主要關(guān)注的是數(shù)據(jù)科學(xué)中的算法和技術(shù),而主題4顯然更注重?cái)?shù)據(jù)科學(xué)的應(yīng)用場(chǎng)景。

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

到這里,LDA已經(jīng)成功幫我們完成了主題抽取。但是我知道你不是很滿意,因?yàn)榻Y(jié)果不夠直觀。那咱們就讓它直觀一些好了。

執(zhí)行以下命令,會(huì)有有趣的事情發(fā)生。

import pyLDAvis

import pyLDAvis.sklearn

pyLDAvis.enable_notebook()

pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)

對(duì),你會(huì)看到如下的一張圖,而且還是可交互的動(dòng)態(tài)圖哦。

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

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

圖的右側(cè),列出了最重要(頻率最高)的30個(gè)關(guān)鍵詞列表。注意當(dāng)你沒有把鼠標(biāo)懸停在任何主題之上的時(shí)候,這30個(gè)關(guān)鍵詞代表全部文本中提取到的30個(gè)最重要關(guān)鍵詞。

如果你把鼠標(biāo)懸停在1號(hào)上面:

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

右側(cè)的關(guān)鍵詞列表會(huì)立即發(fā)生變化,紅色展示了每個(gè)關(guān)鍵詞在當(dāng)前主題下的頻率。

以上是認(rèn)為設(shè)定主題數(shù)為5的情況??扇绻覀儼阎黝}數(shù)量設(shè)定為10呢?

你不需要重新運(yùn)行所有代碼,只需要執(zhí)行下面這幾行就可以了。

這段程序還是需要運(yùn)行一段時(shí)間,請(qǐng)耐心等待。

n_topics = 10

lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=50,

                                learning_method='online',

                                learning_offset=50.,

                                random_state=0)

lda.fit(tf)

print_top_words(lda, tf_feature_names, n_top_words)

pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)

程序輸出給我們10個(gè)主題下最重要的20個(gè)關(guān)鍵詞。

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

附帶的是可視化的輸出結(jié)果:

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

你馬上會(huì)發(fā)現(xiàn)當(dāng)主題設(shè)定為10的時(shí)候,一些有趣的現(xiàn)象發(fā)生了——大部分的文章抱團(tuán)出現(xiàn)在右上方,而2個(gè)小部落(8和10)似乎離群索居。我們查看一下這里的8號(hào)主題,看看它的關(guān)鍵詞構(gòu)成。

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

通過(guò)高頻關(guān)鍵詞的描述,我們可以猜測(cè)到這一主題主要探討的是政策和法律法規(guī)問題,難怪它和那些技術(shù)、算法與應(yīng)用的主題顯得如此格格不入。

說(shuō)明

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

首先,信息檢索的業(yè)內(nèi)專家一看到剛才的關(guān)鍵詞列表,就會(huì)哈哈大笑——太粗糙了吧!居然沒有做中文停用詞(stop words)去除!沒錯(cuò),為了演示的流暢,我們這里忽略了許多細(xì)節(jié)。很多內(nèi)容使用的是預(yù)置默認(rèn)參數(shù),而且完全忽略了中文停用詞設(shè)置環(huán)節(jié),因此“這個(gè)”、“如果”、“可能”、“就是”這樣的停用詞才會(huì)大搖大擺地出現(xiàn)在結(jié)果中。不過(guò)沒有關(guān)系,完成比完美重要得多。知道了問題所在,后面改進(jìn)起來(lái)很容易。有機(jī)會(huì)我會(huì)寫文章介紹如何加入中文停用詞的去除環(huán)節(jié)。

另外,不論是5個(gè)還是10個(gè)主題,可能都不是最優(yōu)的數(shù)量選擇。你可以根據(jù)程序反饋的結(jié)果不斷嘗試。實(shí)際上,可以調(diào)節(jié)的參數(shù)遠(yuǎn)不止這一個(gè)。如果你想把全部參數(shù)都搞懂,可以繼續(xù)閱讀下面的“原理”部分,按圖索驥尋找相關(guān)的說(shuō)明和指引。

原理

前文我們沒有介紹原理,而是把LDA當(dāng)成了一個(gè)黑箱。不是我不想介紹原理,而是過(guò)于復(fù)雜。

只給你展示其中的一個(gè)公式,你就能管窺其復(fù)雜程度了。

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

透露給你一個(gè)秘密:在計(jì)算機(jī)科學(xué)和數(shù)據(jù)科學(xué)的學(xué)術(shù)講座中,講者在介紹到LDA時(shí),都往往會(huì)把原理這部分直接跳過(guò)去。

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

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

但是如果你就是希望了解LDA的原理,那么我給你推薦2個(gè)學(xué)起來(lái)不那么痛苦的資源吧。

首先是教程幻燈。slideshare是個(gè)尋找教程的好去處。 這份教程 瀏覽量超過(guò)20000,內(nèi)容深入淺出,講得非常清晰,鏈接如下:

http://t.cn/RK7rG6v

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

但如果你跟我一樣,是個(gè)視覺學(xué)習(xí)者的話,我更推薦你看這段Youtube視頻,鏈接:

http://t.cn/RK7riZ6

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

講者是Christine Doig,來(lái)自Continuum Analytics。咱們一直用的Python套裝Anaconda就是該公司的產(chǎn)品。

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

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

她深入閱讀了各種文獻(xiàn)后,總結(jié)了自己的模型圖出來(lái):

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

用這個(gè)模型來(lái)解釋LDA,你會(huì)立即有豁然開朗的感覺。

祝探索旅程愉快!

討論

除了本文提到的LDA算法,你還知道哪幾種用于主題抽取的機(jī)器學(xué)習(xí)算法?你覺得主題建模(topic model)在信息檢索等領(lǐng)域還有哪些可以應(yīng)用的場(chǎng)景?歡迎留言分享給大家,我們一起交流討論。

雷鋒網(wǎng)相關(guān)閱讀:

無(wú)監(jiān)督聚類問題中,如何決定簇的最優(yōu)數(shù)量?

UC伯克利聯(lián)合谷歌推出無(wú)監(jiān)督深度學(xué)習(xí)框架,模仿人眼實(shí)現(xiàn)視頻中的自我運(yùn)動(dòng)認(rèn)知

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

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

分享:
相關(guān)文章

編輯

聚焦數(shù)據(jù)科學(xué),連接 AI 開發(fā)者。更多精彩內(nèi)容,請(qǐng)?jiān)L問:yanxishe.com
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)