詞袋法是以每個(gè)詞匯為特征,向量化表示一個(gè)文本;并且提供了幾種特征量化的技術(shù),如CountVectorizer和TfidfVectorizer。詞袋法可以視作對文本向量化的表示技術(shù),通過這項(xiàng)技術(shù)可以對文本之間在內(nèi)容的相似性進(jìn)行一定程序的度量。但是對于如下兩段文本,詞袋法技術(shù)似乎對計(jì)算他們的相似度表現(xiàn)的無能為力。
The cat is walking in the bedroom.
A dog was running across the kitchen.
盡管從語義上講,這兩段文本所描述的場景極為相似;但是,從詞袋法表示來看,這兩段文本唯一相同的詞匯是the,找不到任何語義層面的聯(lián)系。
而我們進(jìn)一步學(xué)習(xí)到通過自然語言處理包,可以借助更加復(fù)雜的自然語言處理技術(shù)對文本進(jìn)行分析。這使得我們不僅能夠?qū)υ~匯的具體詞性進(jìn)行標(biāo)注,甚至可以對句子進(jìn)行解構(gòu)。然而,即便我們能夠使用NLTK中的詞性標(biāo)注技術(shù)對上述文本進(jìn)行分析,找出對應(yīng)詞匯在詞性方面的相似性,也無法針對具體詞匯之間的含義是否相似進(jìn)行度量。
因此,為了尋找詞匯之間的相似度關(guān)系,我們視圖也將詞匯的表示向量化。
這樣就可以通過計(jì)算表示詞匯的向量之間的相似度,來度量詞匯之間的含義是否相似。而為了學(xué)習(xí)到這樣的詞向量表示,Yoshua教授等人Google研究員Mikolow等人分別從神經(jīng)網(wǎng)絡(luò)模型的角度提出了自己的框架。

以輸入一句英文為例:The cat is walking in the bedroom。如果我們需要這句話中所有上下文為數(shù)量為4的連續(xù)詞匯片段,那么就有 The cat is walking、cat is walking in、is walking in the 以及 walking in the bedroom 這樣4個(gè)片段。從語言模型角度上來講,每個(gè)連續(xù)詞匯片段的最后一個(gè)單詞是什么,都是受前面三個(gè)詞匯制約。因此,這就形成了一個(gè)根據(jù)前面三個(gè)單詞,預(yù)測最后一個(gè)單詞的監(jiān)督學(xué)習(xí)系統(tǒng)。
如果用神經(jīng)網(wǎng)絡(luò)框架來描述,上圖就代表一個(gè)監(jiān)督模型的神經(jīng)網(wǎng)絡(luò),當(dāng)上下文數(shù)量為n的時(shí)候,這里的模型就是用前n-1個(gè)詞語,也就是w(t-1) … w(t-n+1),來預(yù)測第t個(gè)詞語w(t)。在神經(jīng)網(wǎng)絡(luò)中,用于計(jì)算的都是這些詞的向量表示,如C(w(t-1)) 就是詞語 w(t-1) 的向量表示。
這里C(w(t-1))其實(shí)就是詞向量,但不是最終的詞向量,最終結(jié)果還需要多輪迭代計(jì)算。其實(shí)這些詞向量就是神經(jīng)網(wǎng)絡(luò)里的參數(shù),生成詞向量的過程就是一個(gè)參數(shù)更新的過程。
注意:對于初學(xué)者來說這里有個(gè)坑,考慮一個(gè)問題:詞向量不是我們最終得到的嗎?那我們?nèi)绾蔚玫阶畛踺斎氲拿總€(gè)詞對應(yīng)的詞向量C(w(t-1))、C(w(t-2))、、、C(w(t-n+1))?以下是我查閱資料后自己的理解:
在上圖中存在一個(gè)系數(shù)矩陣C(是一個(gè)NM的矩陣),其中N是詞典的長度,M是詞向量的維度。最底層的輸入其實(shí)是詞語的one-hot形式,one-hot也可以看成 1N的矩陣 ,與這個(gè)系數(shù)矩陣C(NM, M是word2vec詞向量維數(shù))相乘之后就可以得到1M的向量,這個(gè)向量就是這個(gè)詞對應(yīng)的詞向量了。
從本質(zhì)上來看,詞語w轉(zhuǎn)化為詞向量C(w),就是根據(jù)詞 w 的one-hot 形式,通過矩陣相乘,從系數(shù)矩陣C中取出一行。
還需注意的是,這個(gè)系數(shù)矩陣C,就是神經(jīng)網(wǎng)絡(luò)的參數(shù),最初是隨機(jī)的,隨著訓(xùn)練的進(jìn)行不斷被更新。
用20類新聞文本進(jìn)行詞向量訓(xùn)練
from sklearn.datasets import fetch_20newsgroups
news=fetch_20newsgroups(subset='all')
X,y=news.data,news.target
from bs4 import BeautifulSoup
import nltk,re
#定義一個(gè)函數(shù)名為news_to_sentences講每條新聞中的句子逐一剝離出來,并返回一個(gè)句子的列表
def news_to_sentences(news):
news_text=BeautifulSoup(news).get_text()
tokenizer=nltk.data.load('tokenizers/punkt/english.pickle')
raw_sentences=tokenizer.tokenize(news_text)
sentences=[]
for sent in raw_sentences:
sentences.append(re.sub('[^a-zA-Z]',' ',sent.lower().strip()).split())
return sentences
sentences=[]

#將長篇新聞文本中的句子剝離出來,用于訓(xùn)練
for x in X:
sentences+=news_to_sentences(x)
from gensim.models import word2vec
#配置詞向量的維度
num_features=300
#保證被考慮的詞匯的頻度
min_word_count=20
#設(shè)定并行化訓(xùn)練使用CPU計(jì)算核心的數(shù)量,多核可用
num_workers=2
#定義訓(xùn)練詞向量的上下文窗口大小
context=5
downsampling=1e-3#1e-3第一個(gè)是數(shù)字1,不是字母l
from gensim.models import word2vec
#訓(xùn)練詞向量模型
model=word2vec.Word2Vec(sentences,workers=num_workers,\
size=num_features,min_count=min_word_count,\
window=context,sample=downsampling)
#這個(gè)設(shè)定代表當(dāng)前訓(xùn)練好的詞向量為最終版,也可以加快模型的訓(xùn)練速度
model.init_sims(replace=True)
#利用訓(xùn)練好的模型,尋找訓(xùn)練文本中與morning最相關(guān)的10個(gè)詞匯
model.most_similar('morning')
[('afternoon', 0.7969172596931458),
('weekend', 0.764119565486908),
('evening', 0.7500736117362976),
('saturday', 0.7279693484306335),
('night', 0.7039743661880493),
('friday', 0.6897615790367126),
('newspaper', 0.6688321828842163),
('summer', 0.6671631932258606),
('sunday', 0.6512582898139954),
('week', 0.6438664793968201)]
#利用訓(xùn)練好的模型,尋找訓(xùn)練文本中與email最相關(guān)的10個(gè)詞匯
model.most_similar('email')
[('mail', 0.7358647584915161),
('contact', 0.6991280913352966),
('mailed', 0.6708669066429138),
('replies', 0.6512271165847778),
('address', 0.630152702331543),
('send', 0.6236768364906311),
('archie', 0.6234195828437805),
('listserv', 0.6213445067405701),
('request', 0.6204395890235901),
('sas', 0.6121519804000854)]
結(jié)果表明,在不使用語言學(xué)詞典的前提下,詞向量技術(shù)仍然可以借助上下文信息找到詞匯之間的相似性。這一技術(shù)不僅大量專業(yè)人士的作業(yè)時(shí)間,而且也可以作為一個(gè)基礎(chǔ)模型應(yīng)用到更加復(fù)雜的自然語言處理任務(wù)中。
最后需要指出的是,詞向量的訓(xùn)練結(jié)果很大程度上受所提供的文本影響。換言之,這些詞向量絕不是固定的;您可以靈活運(yùn)用這個(gè)模型,訓(xùn)練不同文本內(nèi)部獨(dú)有的詞向量。