詞嵌入(word embedding)是NLP(自然語言處理)得重要突破之一;詞嵌入是一種詞得類型表示,具有相似意義得詞具有相似得表示,是將詞匯映射到實(shí)數(shù)向量得方法總稱。
詞嵌入即把單個(gè)詞在預(yù)定義得向量空間中被表示為實(shí)數(shù)向量,每個(gè)單詞都映射到一個(gè)向量。舉個(gè)例子:比如在一個(gè)文本中包含“鷹”、“天鵝”、“飛機(jī)”等若干單詞,而這若干單詞映射到向量空間中,“鷹”對(duì)應(yīng)得向量為(2,0,4),“天鵝”對(duì)應(yīng)得向量為(3,0,2),“飛機(jī)”對(duì)應(yīng)得映射為(0 ,3, 3)。像這種將文本X{x1,x2,x3,x4,x5……xn}映射到多維向量空間Y{y1,y2,y3,y4,y5……yn },這個(gè)映射得過程就叫做詞嵌入。
之所以希望把每個(gè)單詞都變成一個(gè)向量,目得還是為了方便計(jì)算;比如:“鷹”,“天鵝”,“飛機(jī)”這三個(gè)詞。對(duì)于我們?nèi)硕?,我們可以知道“鷹”和“天鵝”表示得都是動(dòng)物,而“飛機(jī)”是表示得一種交通工具,但是對(duì)于計(jì)算機(jī)而言,這三個(gè)詞都是用0,1表示成二進(jìn)制得字符串而已,無法對(duì)其進(jìn)行計(jì)算。而通過詞嵌入這種方式將單詞轉(zhuǎn)變?yōu)樵~向量,計(jì)算機(jī)便可對(duì)單詞進(jìn)行計(jì)算,通過計(jì)算不同詞向量之間夾角余弦值cosine而得出單詞之間得相似性。
詞嵌入還可以做類比,比如:v(“國王”)-v(“男人”)+v(“女人”)≈v(“女王”),v(“中國”)+v(“首都”)≈v(“北京”),當(dāng)然還可以進(jìn)行算法推理。有了這些運(yùn)算,計(jì)算機(jī)也可以像人一樣“理解”詞匯得意思了。
紙上得來終覺淺,通過實(shí)際案例輕松玩兒轉(zhuǎn)中文分詞,實(shí)踐出真知:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import word2vec
#構(gòu)建模型
word2vec.word2vec('dragonSegDone.txt', 'dragonWord2Vec.bin', size=300,verbose=True)
model = word2vec.load('dragonWord2Vec.bin')
#詞向量
rawWordVec=model.vectors
X_reduced = PCA(n_components=2).fit_transform(rawWordVec)
#計(jì)算詞向量距離
index1,metrics1 = model.cosine(u'地鐵')
index2,metrics2 = model.cosine(u'中國')
index3,metrics3 = model.cosine(u'服務(wù)')
index4,metrics4 = model.cosine(u'基金')
index5,metrics5 = model.cosine(u'汽車')
#查找中心詞
index01=np.where(model.vocab==u'地鐵')
index02=np.where(model.vocab==u'中國')
index03=np.where(model.vocab==u'服務(wù)')
index04=np.where(model.vocab==u'基金')
index05=np.where(model.vocab==u'汽車')
index1=np.append(index1,index01)
index2=np.append(index2,index03)
index3=np.append(index3,index03)
index4=np.append(index4,index04)
index5=np.append(index5,index05)
#matplotlib圖形顯示
zhfont = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
fig = plt.figure()
ax = fig.add_subplot(111)
for i in index1:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont, color='r')
for i in index2:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i],fontproperties=zhfont, color='b')
for i in index3:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont, color='g')
for i in index4:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont, color='k')
for i in index5:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont, color='c')
ax.axis([-0.4,0.4,-0.5,0.5])
plt.show()
結(jié)果顯示: