Word2Vec的使用心得

我們這次要做的東西是做中文的Word2Vec詞向量
網上有很多講Word2Vec的,我發現似乎都不能直接用。經過一天的努力,勉強算是搞懂了這個詞向量到底是怎麼回事。所以記錄一下。

首先我們要做的東西就是先將我們的中文進行分詞。
這裏我使用到的數據集是Paws-x中的中文的trnslated_train.tsv
來進行Word2Vec詞向量的訓練。

數據集的話在https://github.com/google-research-datasets/paws/tree/master/pawsx上面去下載

分詞工具使用的是jieba
如果沒有安裝jieba的可以直接控制檯輸出

pip install jieba

如果嫌棄太慢的話,可以直接去PyPI上去下載離線包。

下面開始貼代碼:
首先是分詞的:

import jieba
import jieba.analyse
import jieba.posseg as pseg
import codecs,sys
import csv

f=codecs.open("translated_train.tsv",'r',encoding='utf-8')#文件放在根目錄下
target=codecs.open("test1.txt","w",encoding="utf-8")
print("open files")
reader=csv.reader(f,delimiter='\t')#讀取tsv文件
line_num=1
for i ,line in enumerate(reader):
    print("---processing", line_num, 'article------')
    sentence=line[1]+line[2]
    line_seg = " ".join(jieba.cut(sentence))#分詞操作
    target.writelines(line_seg)#寫入目標文檔
    line_num += 1

f.close()
target.close()
exit()

下面就是重點了:
在保存詞向量的時候,有三種方法。
第一種方法

from gensim.models import Word2Vec#注意這個
from gensim.models.word2vec import LineSentence
import multiprocessing
model=Word2Vec(LineSentence("test1.txt"),size=400,window=5,min_count=1,workers=multiprocessing.cpu_count())
model.save("three.model")

其得到的文件是:
在這裏插入圖片描述
這樣的三個文件,總大小大概在140M

第二種方法

from gensim.models.word2vec import LineSentence
from gensim.models import word2vec#重點
import multiprocessing
model=word2vec.Word2Vec(LineSentence("test1.txt"),size=400,window=5,min_count=1,workers=multiprocessing.cpu_count())#重點
model.save("three.model")

相信你也發現了這兩種方法的區別就是你導入了哪個包的區別,當然訓練模型時使用的代碼的問題。
區別就是一個使用gensim.model中的Word2Vec訓練。
一個使用 gensim.models.word2vec中的Word2Vec訓練。

上面的兩種方法還有一個共通之處,那就是他們都是通過Word2Vec.load()來加載的

model1=Word2Vec.load("three.model")#加載模型
testwords=["公共"]
res=model1.most_similar(testwords[0])#計算與這個詞相近的詞語們
print(res)

輸出如下:

[('住房', 0.8683056235313416), ('工業', 0.8203228116035461), ('Vorster', 0.8181160688400269), ('機構', 0.8158144950866699), ('辦事處', 0.8137047290802002), ('中心', 0.8122843503952026), ('Shornur', 0.8105089
664459229), ('Palakkad', 0.810126781463623), ('大廳', 0.8085148334503174), ('二級', 0.8020211458206177)]

使用上面兩種方法保存的模型,有的時候你只有一個模型文件,那時候可能是因爲你的模型數據不夠大。比如你將上面創建模型的代碼改爲64時,你就得到一個只有40M的model文件,一樣能用。

並且記錄一個自己遇到的坑

那就是記住一定不能直接將分好詞的數據直接放入模型中進行加載,那樣的話,你是加載不出數據的。你需要將這個分好詞的數據保存成文本文件,然後使用LineSentence()來讀取獲得。

如果你出現了自己的模型文件只有2M或者3M,並且使用model中的什麼相似性計算等方法的時候,提示沒有該word時,可能就是這個原因。

然後是
第三種方法
不管導入哪個包
只要用下面這個句代碼就可以了。

model.wv.save_word2vec_format("four.model", binary=False)

得到的文件只有一個
在這裏插入圖片描述
這個文件大小大概在237M左右。
裏面的東西,就是單純的詞向量。非常單純。
你可以打開看看。

不過這個模型的加載需要
使用下面兩句代碼

from gensim.models import KeyedVectors
model1=KeyedVectors.load_word2vec_format("two.model")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章