機(jī)器學(xué)習(xí)——影評(píng)傾向分析(二)

第二課 詞向量

1烘绽、分布式詞向量

Word2Vec不需要標(biāo)簽來創(chuàng)建有意義的表示淋昭。這很有用,因?yàn)樵趯?shí)際中常沒有標(biāo)記安接。

分布式單詞向量功能強(qiáng)大翔忽,可用于許多應(yīng)用程序,尤其是單詞預(yù)測(cè)和翻譯盏檐。

python中Word2Vec是在gensim包歇式。

Word2Vec是計(jì)算密集型的。 需要安裝cython胡野。 Word2Vec在沒有安裝cython的情況下運(yùn)行時(shí)間需要數(shù)天而不是幾分鐘材失。

安裝cython教程:http://docs.cython.org/en/latest/src/quickstart/install.html

2、用pandas讀取數(shù)據(jù)硫豆,使用沒有標(biāo)記的數(shù)據(jù)集

train= pd.read_csv("C:\\data\\labeledTrainData.tsv",header=0,delimiter="\t",quoting=3)

test= pd.read_csv("C:\\data\\testData.tsv",header=0,delimiter="\t",quoting=3)

unlabeled_train= pd.read_csv("C:\\data\\unlabeledTrainData.tsv",header=0,delimiter="\t",quoting=3)

print("Read %d labeled train views, %d labeled test reviews, and %d unlabeled reviews\n" % (train["review"].size, test["review"].size, unlabeled_train["review"].size))

處理HTML龙巨、數(shù)字和標(biāo)點(diǎn)符號(hào)、停用詞熊响,方法跟(一)中同旨别。

def review_to_wordlist(review,remove_stopwords=False):

? ? #刪除HTML

? ? review_text= BeautifulSoup(review).get_text()

#刪除非字母

? ? letters_only= re.sub("[^a-zA-Z]"," ",review_text)

#標(biāo)記化

? ? words= letters_only.lower().split()

#刪除停用詞

? ? if remove_stopwords:

? ? ? ? stops= set(stopwords.words("english"))

????????words= [wfor win wordsif not win stops]

????return(words)

2、將段落拆成句子列表汗茄,每個(gè)句子拆成一個(gè)詞列表

Word2Vec輸入為單個(gè)句子秸弛,每個(gè)句子是一個(gè)單詞的list。所以說洪碳,輸入格式是list的list递览。

#加載點(diǎn)標(biāo)記器

tokenizer= nltk.data.load('tokenizers/punkt/english.pickle')

#將評(píng)論拆分為已解析的句子,返回一個(gè)句子列表瞳腌,每個(gè)句子是一個(gè)詞列表

def review_to_sentense(review,tokenizer,remove_stopwords=False):

? ? #用NITK的tokenizer把段落分成句子

? ? raw_sentence= tokenizer.tokenize(review.strip())

????#把非空的句子拆成詞列表

????sentences= []

????for raw_sentence_i in raw_sentence:

? ? ? ????? if len(raw_sentence_i)>0:

? ? ? ? ? ????? sentences.append(review_to_wordlist(raw_sentence_i,remove_stopwords))

????return sentences

3绞铃、準(zhǔn)備Word2Vec的輸入

sentences= []

print("Parsing sentences from training set")

for review in train["review"]:

? ? sentences+= review_to_sentences(review,tokenizer)

print("Parsing sentences from unlabeled set")

for review in unlabeled_train["review"]:

? ? sentences+= review_to_sentences(review, tokenizer)

注意:對(duì)于Python list,“+ =”和“append”不同嫂侍。 在許多應(yīng)用中儿捧,這兩者是可以互換的冷离,但在這里,append只會(huì)附加第一個(gè)列表; 您需要使用“+ =”才能一次加入所有列表纯命。

4、訓(xùn)練并保存模型

(1)導(dǎo)入內(nèi)置日志記錄模塊并對(duì)其進(jìn)行配置痹栖,以便Word2Vec創(chuàng)建良好的輸出消息

import logging

logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)

這一步?jīng)]看懂是要干嘛

(2)上面已經(jīng)解析好了句子亿汞,下面訓(xùn)練模型,關(guān)鍵在于參數(shù)的選擇揪阿。

Architecture: skip-gram (default)或者 continuous bag of words疗我。skip-gram 速度有點(diǎn)慢,但是效果很好南捂。

Training algorithm: Hierarchical softmax (default) 或者 negative sampling吴裤。對(duì)我們來說默認(rèn)的效果就不錯(cuò)。

Downsampling of frequent words: Google文檔推薦值為? .00001 到 .001.溺健。對(duì)我們來說麦牺,接近 0.001看起來可以提高最終模型的精確度。

Word vector dimensionality(詞向量的維度):特征多會(huì)導(dǎo)致運(yùn)行時(shí)間長鞭缭,經(jīng)常但不總是會(huì)產(chǎn)生更好的模型 合適的值是幾十到幾百之間剖膳,我們使用300。

Context / window size: 訓(xùn)練算法考慮多少個(gè)上下文單詞岭辣?對(duì)于hierarchical softmax來說吱晒,10效果不錯(cuò)。

Worker threads: 要運(yùn)行的并行進(jìn)程數(shù)沦童,對(duì)大多數(shù)系統(tǒng)仑濒,適用4到6。

Minimum word count: 這有助于把詞表的大小限制在有意義的單詞偷遗,出現(xiàn)次數(shù)少于這個(gè)值的單詞會(huì)給忽略掉墩瞳。合適的值是10到100之間。這個(gè)案例中鹦肿,因?yàn)槊總€(gè)電影出現(xiàn)了約30次矗烛,所以將minimum word count設(shè)為40,避免過分重視個(gè)別電影的標(biāo)題箩溃。這產(chǎn)生了全部詞表大約15000詞瞭吃。更高的值可以限制運(yùn)行時(shí)間。

#設(shè)置各種參數(shù)

num_features= 300? #詞向量的維度

min_word_count= 40 #詞最小出現(xiàn)的次數(shù)(低于涣旨,被忽略)

num_workers= 4 #并行運(yùn)行的線程數(shù)

context= 10? ? #上下文窗口數(shù)

downsampling= 1e-3 #對(duì)頻繁詞的取樣

(3)初始化并訓(xùn)練 模型

from gensim.models import word2vec

print("Training model...")

model= word2vec.Word2Vec(sentences,workers=num_workers,size=num_features,min_count=min_word_count,window=context,sample=downsampling)

如果不打算進(jìn)一步訓(xùn)練模型歪架,調(diào)用init_sims將使模型更具內(nèi)存效率。

model.init_sims(replace=True)

創(chuàng)建有意義的模型名稱并保存模型以供以后使用霹陡, 可以稍后使用Word2Vec.load()加載它和蚪。

model_name= "300features_40minwords_10context"

model.save(model_name)

存儲(chǔ)后止状,項(xiàng)目列表中也會(huì)多一個(gè)文件

(4)查看訓(xùn)練效果

doesnt_match函數(shù):找出一個(gè)set中與其他詞意思最不同的詞

most_similar函數(shù):查找與一個(gè)詞含義最近的詞

print(model.doesnt_match("man woman child kitchen".split()))

print(model.doesnt_match("france england germany berlin".split()))

print(model.doesnt_match("paris berlin london austria".split()))

print(model.most_similar("man"))

print(model.most_similar("awful"))

logging功能可以打印消息性信息。如果是Mac或Linux系統(tǒng)攒霹,可以使用終端內(nèi)的“top”命令查看系統(tǒng)是否在模型訓(xùn)練時(shí)成功并行化怯疤。在模型訓(xùn)練的同時(shí)在終端輸入:

> top -o cpu

4個(gè)worker是,第一個(gè)進(jìn)程應(yīng)該是python催束,應(yīng)該300%到400%的CPU集峦。如果CPU使用太低,可能是cython運(yùn)行有問題抠刺。

教程中的圖(不是寶寶的)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塔淤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子速妖,更是在濱河造成了極大的恐慌高蜂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡找御,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門烘跺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脂崔,你說我怎么就攤上這事滤淳。” “怎么了砌左?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵脖咐,是天一觀的道長。 經(jīng)常有香客問我汇歹,道長屁擅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任产弹,我火速辦了婚禮派歌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痰哨。我一直安慰自己胶果,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布斤斧。 她就那樣靜靜地躺著早抠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撬讽。 梳的紋絲不亂的頭發(fā)上蕊连,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天悬垃,我揣著相機(jī)與錄音,去河邊找鬼甘苍。 笑死尝蠕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的载庭。 我是一名探鬼主播趟佃,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼昧捷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罐寨,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤靡挥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸯绿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跋破,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年瓶蝴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毒返。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舷手,死狀恐怖拧簸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情男窟,我是刑警寧澤盆赤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站歉眷,受9級(jí)特大地震影響牺六,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汗捡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一淑际、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扇住,春花似錦春缕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至簿训,卻和暖如春咱娶,著一層夾襖步出監(jiān)牢的瞬間米间,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工膘侮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈糊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓琼了,卻偏偏與公主長得像逻锐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雕薪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容