中文词向量训练二
1. Gensim工具训练中文词向量
1.1 中文词向量过程
-
源程序:
train_word2vec_model.py
-
执行方法:在命令行终端执行下列代码.
python train_word2vec_model.py wiki.zh.text.seg wiki.zh.text.model wiki.zh.text.vector
-
wiki.zh.text.seg
为输入文件,wiki.zh.text.model
和wiki.zh.text.vector
为输出文件,model存储了训练的词向量模型,vector存储了训练的权重。
Word2vec训练词向量的参数
- LineSentence(inp):按行读取; 单词已经过预处理并被空格分隔。
- size:是每个词的向量维度;
- window:是词向量训练时的上下文扫描窗口大小,窗口为5就是考虑前5个词和后5个词;
- min-count:设置最低频数,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃
- workers:是训练的线程数,默认是当前运行机器的处理器核数。
2. 中文词向量测试
2.1 加载训练的词向量
-
加载过程:
model = gensim.models.Word2Vec.load("wiki.zh.text.model")
-
查看单词的向量:
for word in model.wv.index2word: print(word, model[word])
-
输出结果:
2.2 寻找相近的词语
- 语言学:
result= model.most_similar(u”语言学”)
- 财富:
result= model.most_similar(u”财富”)
- 输出结果:
2.3 完整代码
""" 1. 训练词向量代码"""
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# train_word2vec_model.py用于训练模型
import logging
import os.path
import sys
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__ == '__main__':
# sys.argv[0]获取的是脚本文件的文件名称
program = os.path.basename(sys.argv[0])
# sys.argv[0]获取的是脚本文件的文件名称
logger = logging.getLogger(program)
# format: 指定输出的格式和内容,format可以输出很多有用信息,
# %(asctime)s: 打印日志的时间
# %(levelname)s: 打印日志级别名称
# %(message)s: 打印日志信息
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
# check and process input arguments
if len(sys.argv) < 4:
print(globals()['__doc__'] % locals())
sys.exit(1)
# inp:分好词的文本
# outp1:训练好的模型
# outp2:得到的词向量
inp, outp1, outp2 = sys.argv[1:4]
"""
LineSentence(inp):格式简单:一句话=一行; 单词已经过预处理并被空格分隔。
size:是每个词的向量维度;
window:是词向量训练时的上下文扫描窗口大小,窗口为5就是考虑前5个词和后5个词;
min-count:设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃;
workers:是训练的进程数(需要更精准的解释,请指正),默认是当前运行机器的处理器核数。这些参数先记住就可以了。
sg ({0, 1}, optional) – 模型的训练算法: 1: skip-gram; 0: CBOW
alpha (float, optional) – 初始学习率
iter (int, optional) – 迭代次数,默认为5
"""
model = Word2Vec(LineSentence(inp), size=100, window=5, min_count=5,
workers=multiprocessing.cpu_count())
model.save(outp1)
model.wv.save_word2vec_format(outp2, binary=False)
"""2. 使用词向量代码"""
# coding:utf-8
import gensim
model = gensim.models.Word2Vec.load("wiki.zh.text.model")
count = 0
for word in model.wv.index2word:
print(word,model[word])
count += 1
if count==5:
break
result = model.most_similar(u"语言学")
for e in result:
print(e)
3 Word2vec的优缺点
3.1 Word2vec的优点
- 由于 Word2vec 会考虑上下文,比之前的方法维度更少,所以速度更快。
- 通用性很强,可以用在各种 NLP 任务中。
Word2vec的缺点
- 由于词和向量是一对一的关系,所以多义词的问题无法解决。
- Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化。