win10环境下使用gensim实现word2vec模型训练及测试
2017-05-15 21:41
1031 查看
最近开始从事NLP的实际项目,需要使用word2vec(w2v)实现语义近似度计算。本文目的是在windows环境下进行gensim的环境配置和demo训练、测试功能的实现。
word2vec是几年前google推出的一个自然语言处理(NLP)框架,它将自然语言映射为计算机擅长处理的数据形式。本文中使用的gensim工具可以理解为w2v的python版本,能在python环境下实现w2v的功能。
要运行w2v的样例,主要要做以下几个工作:1.配置环境。2.语料素材相关操作。3.模型训练。4.模型运行测试。接下来我们就来一一实现。我的操作环境是win10+python3.5.2。
这里为了确保语料完整,以维基百科的中文语料为范例(下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2)进行操作。针对从网上获取的原始语料,主要需要进行两类操作,一是语料数据的预处理,一是分词。
预处理:从网上获取的数据并不是我们需要的文本格式,因此我们需要对其进行预处理(本例中需要的操作是将其整理成文本格式、再将繁体中文字简化),具体代码示例如下,代码的注释在文中可读。该代码由网友代码基础修改,感谢提供代码的网友。
tips:
1.这里比较容易遇到编码错误的问题,在创建生成文件时必须要使用encoding = “utf-8”。目前暂时没弄清楚原因,稍后再添加解释说明。
分词:我使用中科大的nlpir来实现分词功能,官方文档见http://pynlpir.readthedocs.io/en/latest/installation.html。安装不困难,这里不多说了。示例代码如下,思路是将语料中原先的空格去掉,对分好的词后均追加一个空格。
4.模型运行测试
使用原先的语料进行训练,完成后会产生以下几个文件。
测试的截图如下。
word2vec是几年前google推出的一个自然语言处理(NLP)框架,它将自然语言映射为计算机擅长处理的数据形式。本文中使用的gensim工具可以理解为w2v的python版本,能在python环境下实现w2v的功能。
要运行w2v的样例,主要要做以下几个工作:1.配置环境。2.语料素材相关操作。3.模型训练。4.模型运行测试。接下来我们就来一一实现。我的操作环境是win10+python3.5.2。
1.配置环境
首先当然要安装python,再用python的pip包管理工具完成gensim包的安装就可以了。这部分比较简单,这里就不再赘述了。2.语料素材相关操作
在NLP中语料的质量和数量同算法的准确性和快速性一样,都是影响系统性能和体验的重要因素。这里为了确保语料完整,以维基百科的中文语料为范例(下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2)进行操作。针对从网上获取的原始语料,主要需要进行两类操作,一是语料数据的预处理,一是分词。
预处理:从网上获取的数据并不是我们需要的文本格式,因此我们需要对其进行预处理(本例中需要的操作是将其整理成文本格式、再将繁体中文字简化),具体代码示例如下,代码的注释在文中可读。该代码由网友代码基础修改,感谢提供代码的网友。
tips:
1.这里比较容易遇到编码错误的问题,在创建生成文件时必须要使用encoding = “utf-8”。目前暂时没弄清楚原因,稍后再添加解释说明。
# 将维基上的数据进行格式预处理(包括转换数据格式和将中文字符简化) from __future__ import print_function from hanziconv import HanziConv import logging import os.path import six import sys from gensim.corpora import WikiCorpus # 常量部分,此处根据文件名称和路径修改 dir_read = "resource\\" orignal_name = "zhwiki-latest-pages-articles.xml.bz2" result_name = "wiki.chs.text" # 顶层作用域部分 if __name__ == '__main__': # 调用Logger模块,输出日志 program = os.path.basename(sys.argv[0]) logger = logging.getLogger(program) logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s') logging.root.setLevel(level=logging.INFO) logger.info("running %s" % ' '.join(sys.argv)) # 输入需要预处理的文件和生成文件的路径 sys.argv.extend([dir_read+orignal_name,dir_read+result_name]) if len(sys.argv) != 3: print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.chs.txt") sys.exit(1) inp, outp = sys.argv[1:3] space = " " i = 0 # 使用wikicorpus将语料转换为对应格式 output = open(outp, 'w',encoding="utf-8") # 默认是GBK wiki = WikiCorpus(inp, lemmatize=False, dictionary={},) for text in wiki.get_texts(): if six.PY3: temp_string = b' '.join(text).decode("utf-8") # 使用hanziconv模块对文本的繁体字内容进行简化 temp_string = HanziConv.toSimplified(temp_string) output.write(temp_string + '\n') else: temp_string = space.join(text) temp_string = HanziConv.toSimplified(temp_string) output.write(temp_string + "\n") i += 1 if(i % 1000 == 0): logger.info("Saved " + str(i) + " articles") output.close() logger.info("Finished Saved " + str(i) + " articles")
分词:我使用中科大的nlpir来实现分词功能,官方文档见http://pynlpir.readthedocs.io/en/latest/installation.html。安装不困难,这里不多说了。示例代码如下,思路是将语料中原先的空格去掉,对分好的词后均追加一个空格。
# -*- coding:utf-8 -*- import pynlpir # 常量部分,此处根据文件名称和路径修改 dir_read = "..\\resource\\" orignal_file = "material.text" result_file = "splitword.text" # 顶层作用域部分 if __name__ == "__main__": f_ori = open(dir_read+orignal_file,"r",encoding="utf-8") f_result = open(dir_read+result_file,"w+",encoding="utf-8") pynlpir.open()# 加载分词器 seq = 0 while True: if seq %1000 == 0: print("分好了第",seq,"行数据") seq += 1 temp_string = f_ori.readline() if temp_string == "": break try: temp_split = pynlpir.segment(temp_string,pos_tagging=False) # 使用分词器进行分词 for temp_split_element in temp_split: if temp_split_element == " ": continue else: f_result.write(temp_split_element+" ") except UnicodeDecodeError: print("语料存在问题") print("整理结束")
3.模型训练
这里的模型训练很简单,核心代码就两行,代码如下。# -*- coding: utf-8 -*- # 训练词向量模型 import logging import os import sys import multiprocessing from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence # 常量部分 dir_read = "..\\resource\\" inp_file = "splitword.text" outp_model b161 = "medical.model.text" outp_vector = "medical.vector.text" # 顶层作用域部分 if __name__ == '__main__': sys.argv.extend([dir_read+inp_file,dir_read+outp_model,dir_read+outp_vector]) program = os.path.basename(sys.argv[0]) logger = logging.getLogger(program) 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 = sys.argv[1:4] model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count()) # trim unneeded model memory = use(much) less RAM # model.init_sims(replace=True) model.save(outp1) model.wv.save_word2vec_format(outp2, binary=False)
4.模型运行测试
使用原先的语料进行训练,完成后会产生以下几个文件。
# -*- coding: utf-8 -*- # 运行模型测试 import gensim # 常量部分 dir_read = "resource\\" model_name = "wiki.chs.model.text" # 顶层作用域部分 if __name__ == "__main__": model = gensim.models.Word2Vec.load(dir_read + model_name) result = model.most_similar("河南") for e in result: print(e[0],e[1])
测试的截图如下。
相关文章推荐
- python实现gensim.word2vec模型训练实例
- word2vec词向量训练及gensim的使用
- 使用caffe训练并且测试一个自己的模型
- 深度学习 —— 使用 gensim 实现 word2vec
- matconvnet环境下训练自己的数据集及模型测试-mnist网络结构-cifar10部分数据集
- tensorflow训练自己的数据集实现CNN图像分类2(保存模型&测试单张图片)
- 使用caffe训练并且测试一个自己的模型
- caffe 09 win10 使用训练好模型为给定图片分类
- PyTorch(三)——使用训练好的模型测试自己图片
- 使用caffe训练好的模型测试单张手写数字
- Tensorflow实现cnn模型的训练与使用
- 使用caffe训练并且测试一个自己的模型
- 使用caffe训练并且测试一个自己的模型
- 使用Django REST Framework来快速实现API调用服务——上篇(运行环境和模型层)
- 利用Gensim训练关于英文维基百科的Word2Vec模型(Training Word2Vec Model on English Wikipedia by Gensim)
- 使用caffe训练并且测试一个自己的模型
- 使用caffe训练并且测试一个自己的模型
- 使用caffe训练并且测试一个自己的模型
- 使用三种继承回归模型对美国波士顿房价训练数据进行学习,并对测试数据进行预测
- 使用caffemodel模型(由mnist训练)测试单张手写数字样本