我们这次要做的东西是做中文的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")