1
本文作者: AI研習(xí)社 | 2017-07-06 15:22 |
雷鋒網(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方法的魅力。想不想試試呢?
每個(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ī)器,并且打開瀏覽。
興奮了10幾分鐘之后,你冷卻了下來(lái),給自己提出了2個(gè)重要的問題。
這些文章都值得讀嗎?
這些文章我讀得過(guò)來(lái)嗎?
一篇數(shù)據(jù)科學(xué)類公眾號(hào),你平均需要5分鐘閱讀。這1000多篇……你拿出計(jì)算器認(rèn)真算了一下。
讀完這一宿采集到的文章,你不眠不休的話,也需要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)看看這條可愛的小狗照片:
問題來(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)的抽屜里面取東西就可以了。
這就像是職業(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)備工作的第一步,還是先安裝Anaconda套裝。詳細(xì)的流程步驟請(qǐng)參考《 如何用Python做詞云 》一文。文章鏈接:
從微信公眾平臺(tái)爬來(lái)的 datascience.csv 文件,請(qǐng)從如下鏈接下載:
你可以用Excel打開,看看下載是否完整和正確。
如果一切正常,請(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
Jupyter Notebook已經(jīng)正確運(yùn)行。下面我們就可以正式編寫代碼了。
我們?cè)贘upyter Notebook中新建一個(gè)Python 2筆記本,起名為topic-model。
為了處理表格數(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é)果如下:
沒問題,頭幾行內(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做中文分詞?》一文,具體鏈接為:
我們首先調(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é)視頻查看具體的介紹,視頻鏈接:
下面這一段代碼執(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)換為以下表格:
第一句表示為[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í)行效果如下:
在這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)圖哦。
圖的左側(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)上面:
右側(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)鍵詞。
附帶的是可視化的輸出結(jié)果:
你馬上會(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)成。
通過(guò)高頻關(guān)鍵詞的描述,我們可以猜測(cè)到這一主題主要探討的是政策和法律法規(guī)問題,難怪它和那些技術(shù)、算法與應(yīng)用的主題顯得如此格格不入。
前文幫助你一步步利用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ù)雜程度了。
透露給你一個(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)容深入淺出,講得非常清晰,鏈接如下:
但如果你跟我一樣,是個(gè)視覺學(xué)習(xí)者的話,我更推薦你看這段Youtube視頻,鏈接:
講者是Christine Doig,來(lái)自Continuum Analytics。咱們一直用的Python套裝Anaconda就是該公司的產(chǎn)品。
Christine使用的LDA原理解釋模型,不是這個(gè)LDA經(jīng)典論文中的模型圖(大部分人覺得這張圖不易懂):
她深入閱讀了各種文獻(xiàn)后,總結(jié)了自己的模型圖出來(lái):
用這個(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)載須知。