第二課 詞向量
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)行有問題抠刺。