word2vec环境
这里我使用python中的包gensim,该包封装了word2vec及其优化。
实验环境为 Win10+python3.9+pycharm
这里的下载过程直接使用pip,打开cmd,进入pip所在的Scripts位置,输入
pip3 install gensim
由于默认下载网址是国外网址,这里建议将源地址改成清华镜像,具体方法见我之前的博客 Windows打开.ipynb文件
所用数据集
用来训练的数据集是从维基百科中爬取的中文词条,使用jieba进行分词,这里感谢最小森林大佬提供的数据集
该数据集是已经进行去分词和去停用词过后的数据集,可以直接用于训练word2vec
同时,我们也提供了基于MSR训练集的版本,该训练集是由SIGHAN Bakeoff 2005发布的四个中文数据集之一,包含3000+句子,下载地址为
http://sighan.cs.uchicago.edu/bakeoff2005/
对于该数据集我们需要先进行分词处理,再用于训练
针对维基百科爬取数据训练
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
# 训练模型
sentences = LineSentence('wiki.zh.word.txt')
# size:词向量的维度
# window:上下文环境的窗口大小
# min_count:忽略出现次数低于min_count的词
model = Word2Vec(sentences, size=128, window=5, min_count=5, workers=4)
# 保存模型
model.save('word_embedding_128')
该数据集的训练时间较长,我这里大概跑了1个多小时(普通办公本,笑)
针对MSR数据集训练
首先我们要对其进行分词,将分词结果进行保存
import jieba
text=[]
f=open("msr_test.txt",'r', encoding='GBK')
t=f.readline()
while t:
text.append(t)
t=f.readline()
f.close();
f=open('result2.txt',"w");
for word in text: #输出结果
word=jieba.cut(word)
f.write(" ".join(word))
f.close()
分词后结果如下
扬帆 远东 做 与 中国 合作 的 先行
希腊 的 经济 结构 较 特殊 。
海运业 雄踞 全球 之 首 , 按 吨位 计占 世界 总数 的 1 7 % 。
另外 旅游 、 侨汇 也 是 经济 收入 的 重要 组成部分 , 制造业 规模 相对 较 小 。
多年 来 , 中希 贸易 始终 处于 较 低 的 水平 , 希腊 几乎 没有 在 中国 投资 。
十几年来 , 改革开放 的 中国 经济 高速 发展 , 远东 在 崛起 。
瓦西里 斯 的 船只 中有 4 0 % 驶向 远东 , 每个 月 几乎 都 有 两三条 船 停靠 中国 港口 。
他 感受 到 了 中国 经济 发展 的 大潮 。
他 要 与 中国 人 合作 。
他 来到 中国 , 成为 第一个 访华 的 大 船主 。
访问 归来 , 他 对 中国 发展 充满信心 , 他 向 希腊 海运 部长 介绍 了 情况 , 提出 了 两国 在 海运 、 造船业 方面 合作 的 建议 。
1 9 9 5 年 1 0 月 , 希腊 海运 部长 访华 时 , 他 根据 “ 船长 ” 的 建议 与 中方 探讨 了 在 海运 、 造船 方面 合作 的 可能 与 途径 。
“ 船长 ” 本人 还 与 几个 船主 联合 起来 准备 与 我 远洋 公司 建立 合资企业 。
“ 船长 ” 常说 , 要么 不干 , 干 就要 争 第一 。
他 拥有 世界 最大 的 私人 集装箱船 队 , 也 要 做 与 中国 合作 的 先行 。
训练过程如下
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
# 训练模型
sentences = LineSentence('result2.txt')
# size:词向量的维度
# window:上下文环境的窗口大小
# min_count:忽略出现次数低于min_count的词
model = Word2Vec(sentences, size=100, window=5, min_count=3, workers=4)
# 保存模型
model.save('word_embedding_msr')
该数据集由于数据量较小,大概10s左右就能训练完成,所以我们在这里仅用作展示word2vec训练完成后的输出为何。
这里找‘中国‘对应的词向量,如下
[-0.343487 -0.64089763 0.04869369 0.30353695 0.69588625 -0.14519633
-0.72343487 0.36691028 -0.4456488 0.19088745 0.08641527 0.13320787
0.3254474 -0.410061 -0.16562903 -0.0349944 0.2895313 0.6492203
-0.6339436 -0.330329 -0.3913359 -0.2970704 0.20166887 0.16386898
-0.3957427 -0.05471497 -0.4112644 -0.23662147 0.03442516 -0.43710214
-0.771916 -0.1959945 -0.2717788 0.08272666 0.4859701 0.49311143
0.8147059 0.11530653 0.02399883 0.35907894 -0.5990176 0.03943931
0.4130272 0.1654321 0.642082 -0.55487806 0.41838712 -0.0030092
-0.15443897 0.34707847 -0.60119224 0.11023442 0.4595765 -0.15609838
-0.50447994 -0.4849194 -0.31738335 -0.06616133 -0.16081819 0.21695867
-0.9720431 -0.39655724 0.131794 -0.51368624 0.98723054 0.5436631
-0.59230137 -0.79371446 0.61901087 0.8051073 0.19478592 -0.44383404
0.868485 -0.35039797 0.52206135 -0.53102964 -0.34816676 0.5235386
0.31923193 0.77775395 1.2184122 -0.35520673 0.12621686 -0.10448229
1.1372876 -0.05676529 -0.23803782 -0.00363045 -0.46833056 -0.7078941
-0.31415704 0.10456796 -0.15455903 0.46362948 -0.15287219 -0.69624406
-0.04977696 -0.28300795 0.37679717 -0.5752296 ]
使用
# 如果已经保存过模型,则直接加载即可
# 前面训练并保存的代码都可以省略
model = Word2Vec.load("word_embedding_128")
# 使用模型
# 根据词义搜索词语
items = model.wv.most_similar(positive=['电脑'],topn=10)
for item in items:
print(item[0], item[1])
# 返回两个词语之间的相似度
x=model.wv.similarity('咖啡','咖啡豆')
y=model.wv.similarity('咖啡','茶')
z=model.wv.similarity('咖啡','汽车')
print('咖啡和咖啡豆的相似度为',x)
print('咖啡与茶的相似度为',y)
print('咖啡和汽车的相似度为',z)