關(guān)于Word2Vec可視化展示
Word2Vec簡(jiǎn)介
自然語(yǔ)言處理的核心概念之一是如何量化單詞和表達(dá)式,以便能夠在模型環(huán)境中使用它們。語(yǔ)言元素到數(shù)值表示的這種映射稱為詞嵌入。
Word2Vec是一個(gè)詞嵌入過(guò)程。這個(gè)概念相對(duì)簡(jiǎn)單:通過(guò)一個(gè)句子一個(gè)句子地在語(yǔ)料庫(kù)中循環(huán)去擬合一個(gè)模型,根據(jù)預(yù)先定義的窗口中的相鄰單詞預(yù)測(cè)當(dāng)前單詞。
為此,它使用了一個(gè)神經(jīng)網(wǎng)絡(luò),但實(shí)際上最后我們并不使用預(yù)測(cè)的結(jié)果。一旦模型被保存,我們只保存隱藏層的權(quán)重。在我們將要使用的原始模型中,有300個(gè)權(quán)重,因此每個(gè)單詞都由一個(gè)300維向量表示。
請(qǐng)注意,兩個(gè)單詞不必彼此接近的地方才被認(rèn)為是相似的。如果兩個(gè)詞從來(lái)沒(méi)有出現(xiàn)在同一個(gè)句子中,但它們通常被相同的包圍,那么可以肯定它們有相似的意思。
Word2Vec中有兩種建模方法:skip-gram和continuous bag of words,這兩種方法都有各自的優(yōu)點(diǎn)和對(duì)某些超參數(shù)的敏感性。
當(dāng)然,你得到的詞向量取決于你訓(xùn)練模型的語(yǔ)料庫(kù)。一般來(lái)說(shuō),你確實(shí)需要一個(gè)龐大的語(yǔ)料庫(kù),有維基百科上訓(xùn)練過(guò)的版本,或者來(lái)自不同來(lái)源的新聞文章。我們將要使用的結(jié)果是在Google新聞上訓(xùn)練出來(lái)的。
簡(jiǎn)單可視化
自定義一個(gè)很小的語(yǔ)料庫(kù),嘗試給出Word2Vec的簡(jiǎn)單可視化:
import gensim
%matplotlib inline
from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
# 訓(xùn)練的語(yǔ)料
sentences = [['this', 'is', 'the', 'an', 'apple', 'for', 'you'],
['this', 'is', 'the', 'an', 'orange', 'for', 'you'],
['this', 'is', 'the', 'an', 'banana', 'for', 'you'],
['apple','is','delicious'],
['apple','is','sad'],
['orange','is','delicious'],
['orange','is','sad'],
['apple','tests','delicious'],
['orange','tests','delicious']]
# 利用語(yǔ)料訓(xùn)練模型
model = Word2Vec(sentences,window=5, min_count=1)
# 基于2d PCA擬合數(shù)據(jù)
# X = model[model.wv.vocab]
X = model.wv[model.wv.key_to_index]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# 可視化展示
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.key_to_index)
for i, word in enumerate(words):
pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()
因?yàn)檎Z(yǔ)料庫(kù)是隨機(jī)給出的,并且數(shù)量很少,所以訓(xùn)練出來(lái)的詞向量展示出來(lái)的詞和詞之間的相關(guān)性不那么強(qiáng)。這里主要是想表明假如我們輸入一系列單詞,通過(guò)Word2Vec模型可以得到什么樣的輸出。
實(shí)戰(zhàn)演練
通過(guò)已經(jīng)在Google新聞的語(yǔ)料上訓(xùn)練好的模型來(lái)看看Word2Vec得到的詞向量都可以怎么使用。
首先需要下載預(yù)訓(xùn)練Word2Vec向量,這可以從各種各樣的背景領(lǐng)域中進(jìn)行選擇?;贕oogle新聞?wù)Z料庫(kù)的訓(xùn)練模型可通過(guò)搜索“Google News vectors negative 300”來(lái)下載。這個(gè)文件大小是1.53GB,包含了30億單詞的300維表示。
和上述在Python中的簡(jiǎn)單可視化一樣,需要使用gensim庫(kù)。假設(shè)剛才下載好的文件保存在電腦的E盤的“wordpretrain”文件夾中。
from gensim.models.keyedvectors import KeyedVectors
word_vectors = KeyedVectors.load_word2vec_format(\
'E:\wordpretrain/GoogleNews-vectors-negative300.bin.gz', \
binary = True, limit = 1000000)如此,便擁有了一個(gè)現(xiàn)成的詞向量模型,亦即每個(gè)單詞都由一個(gè)300維的向量唯一表示。下面我們來(lái)看看關(guān)于它的一些簡(jiǎn)單用法。
1、可以實(shí)際查看任意單詞的向量表示:
word_vectors['dog']

但很難解釋這個(gè)向量的每一維代表什么意思。
2、可以使用most_similar函數(shù)找到意思相近的單詞,topn參數(shù)定義要列出的單詞數(shù):
word_vectors.most_similar(positive = ['nice'], topn = 5)

括號(hào)中的數(shù)字表示相似度的大小。
3、如果我們想合并father和woman這兩個(gè)單詞的向量,并減去man這個(gè)單詞的向量,可以得到:
word_vectors.most_similar( positive = ['father', 'woman'], negative = ['man'], topn = 1)
其實(shí)這件事情很容易想到:假設(shè)在兩個(gè)維度(親子關(guān)系和性別)下,“woman”這個(gè)單詞的向量為(0,1),“man”的向量為(0,-1),“father”的向量為(1,-1),“mother”的向量為(1,1),那么“father”+“woman”-“man”= (1,-1) + (0,1) - (0,-1) = (1,1) =“mother”。當(dāng)然,區(qū)別在于這里我們有300個(gè)維度,但原理上是相同的。
4、可視化:
%matplotlib inline import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.decomposition import PCA import adjustText
from jupyterthemes import jtplot jtplot.style(theme='onedork') #選擇一個(gè)繪圖主題
def plot_2d_representation_of_words(
word_list,
word_vectors,
flip_x_axis = False,
flip_y_axis = False,
label_x_axis = "x",
label_y_axis = "y",
label_label = "fruit"):
pca = PCA(n_components = 2)
word_plus_coordinates=[]
for word in word_list:
current_row = []
current_row.append(word)
current_row.extend(word_vectors[word])
word_plus_coordinates.append(current_row)
word_plus_coordinates = pd.DataFrame(word_plus_coordinates)
coordinates_2d = pca.fit_transform(
word_plus_coordinates.iloc[:,1:300])
coordinates_2d = pd.DataFrame(
coordinates_2d, columns=[label_x_axis, label_y_axis])
coordinates_2d[label_label] = word_plus_coordinates.iloc[:,0]
if flip_x_axis:
coordinates_2d[label_x_axis] = \
coordinates_2d[label_x_axis] * (-1)
if flip_y_axis:
coordinates_2d[label_y_axis] = \
coordinates_2d[label_y_axis] * (-1)
plt.figure(figsize = (15,10))
p1=sns.scatterplot(
data=coordinates_2d, x=label_x_axis, y=label_y_axis)
x = coordinates_2d[label_x_axis]
y = coordinates_2d[label_y_axis]
label = coordinates_2d[label_label]
texts = [plt.text(x[i], y[i], label[i]) for i in range(len(x))]
adjustText.adjust_text(texts)fruits = ['apple','orange','banana','lemon','car','tram','boat','bicycle',
'cherry','mango','grape','durian','watermelon','train','motorbike','ship',
'peach','pear','pomegranate','strawberry','bike','bus','truck','subway','airplane']plot_2d_representation_of_words(
word_list = fruits,
word_vectors = word_vectors,
flip_y_axis = True)
這里我在水果類的單詞列表中混入了少許交通工具類的單詞。顯然,結(jié)果還算不錯(cuò),不僅能明顯看到單詞之間的相關(guān)性,還能自動(dòng)聚類。
當(dāng)然,上述只是Word2Vec模型的簡(jiǎn)單操作和應(yīng)用,其既可以執(zhí)行詞語(yǔ)層面的任務(wù),也可以作為很多模型的輸入,包括但不限于:
· 計(jì)算相似度
- 尋找相似詞
- 信息檢索
· 作為SVM/LSTM等模型的輸入
- 中文分詞
- 命名體識(shí)別
· 句子表示
- 情感分析
· 文檔表示
- 文檔主題判別
總結(jié)
從上述Word2Vec實(shí)操和簡(jiǎn)單應(yīng)用來(lái)看,我們可以得出其詞向量訓(xùn)練的核心思想:若兩個(gè)單詞出現(xiàn)的語(yǔ)境相似,則它們的向量也相似。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch 中pad函數(shù)toch.nn.functional.pad()的用法
今天小編就為大家分享一篇pytorch 中pad函數(shù)toch.nn.functional.pad()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
在jupyter notebook中使用pytorch的方法
這篇文章主要介紹了在jupyter notebook中使用pytorch的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Python OpenCV處理圖像之濾鏡和圖像運(yùn)算
這篇文章主要為大家詳細(xì)介紹了Python OpenCV處理圖像之濾鏡和圖像運(yùn)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
在pycharm中執(zhí)行 os.makedirs 提示用戶名或密碼不正確的問(wèn)題及解決方法
這篇文章主要介紹了在pycharm中執(zhí)行 os.makedirs 提示用戶名或密碼不正確的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
python中利用await關(guān)鍵字如何等待Future對(duì)象完成詳解
為了簡(jiǎn)化并更好地標(biāo)識(shí)異步IO,從Python 3.5開始引入了新的語(yǔ)法async和await,可以讓coroutine的代碼更簡(jiǎn)潔易讀。下面這篇文章主要給大家介紹了關(guān)于python中利用await關(guān)鍵字如何等待Future對(duì)象完成的相關(guān)資料,需要的朋友可以參考下。2017-09-09
Python實(shí)現(xiàn)讀取及寫入csv文件的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)讀取及寫入csv文件的方法,涉及Python針對(duì)csv格式文件的讀取、遍歷、寫入等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Anaconda安裝之后Spyder打不開解決辦法(親測(cè)有效!)
這篇文章主要給大家介紹了關(guān)于Anaconda安裝之后Spyder打不開解決辦法,文中將解決的過(guò)程介紹的非常詳細(xì),親測(cè)有效,對(duì)同樣遇到這個(gè)問(wèn)題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04
python調(diào)用百度語(yǔ)音REST API
這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度語(yǔ)音REST API,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08

