用python 使用搜狐新闻语料 训练一个50维度的word2vec模型

一、准备环境和语料

  • 语料:选择搜狐新闻语料,我选择的是迷你版语料。下载语料地址
  • 分词:选择结巴分词。参考
  • 模型:word2vec。参考

二、分词

1:安装结巴分词(代码对 Python 2/3 均兼容)

  • 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
  • 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用

2: 我们要将下载的语料转换成文本形式,下载的语料是.dat格式的,需要转换。

cat news_sohusite_xml.smarty.dat | iconv -f gbk -t utf-8 -c | grep "<content>"  > sougou.txt

这样就将news_sohusite_xml.smarty.dat语聊转换为sougou.txt文本形式。

3:分词:

#-*-coding:utf-8-*-

# 送给word2vec的文件是需要分词的
import jieba
filePath = 'sougou.txt' #语料路径
fileSeqWordDonePath = 'sougou.seg.txt'# 分词后生成路径

fileTrainRead = []
with open(filePath, 'r', encoding='utf-8') as fileTrainRaw: #python3
#with open(filePath) as fileTrainRaw:
	for line in fileTrainRaw:
		fileTrainRead.append(line)
print(len(fileTrainRead))


#MemoryError:避免三重循环,避免大量使用字典的多次嵌套
#在python里,大数据处理一定要减少字典使用,字典主要是用来统计用,不用来计算。 建议你考虑numpy.array做
def PrintListChinese(list):
	for i in range(len(list)):
		print (list[i])

#jieba分词
fileTrainSeg=[]
for i in range(len(fileTrainRead)):
	#使用结巴分词的时候并不是从0到结尾的全部都进行分词,而是对[9:-11]分词,因为sougouCS原始数据集中有起始的<content> 和结尾的</content>,将其去掉
	fileTrainSeg.append([' '.join(list(jieba.cut(fileTrainRead[i][9:-11], cut_all=False)))])
	if i % 100 == 0 :
		print (i)

with open(fileSeqWordDonePath, 'w') as fw: #'w'参数必须得写,不写的话,默认的是只读方式(即‘r’)
	for i in range(len(fileTrainSeg)):
		#fw.write(fileTrainSeg[i][0].encoding('utf-8'))#fw.write()只能输出str字符串,'str' object has no attribute 'encoding'
		#fw.write(fileTrainSeg[i][0].dedcode('utf-8'))#  'str' object has no attribute 'decode',python3里str默认为unicode,只能编码encode ,不能解码 decode

		fw.write(fileTrainSeg[i][0])
		fw.write('\n')#TypeError: a bytes-like object is required, not 'str',返回被转换文本的str表示,在python2.x中是bytes,在python3.x中是unicode
    
'''注意'''
#1.写入和读取要保持一致。如果写入时采用文本方式,则读取时也应采用文本方式;如果写入时采用二进制方式,则读取时也应采用二进制方式。
#2.如果以文本方式打开向文件中写入数据时,每碰到一个“换行”,就会将其转化为“回车+换行”。在读取时,一旦遇到“回车+换行”就将其转化为“换行”
#3.而二进制方式则会将数据按照在内存中的存储形式原样输出到文件中。

分词结果:

三、训练word2vec模型

1:安装gemsim包

pip install gemsim 或 pip3 install gensim

2:使用gensim word2vec训练脚本获取词向量

#!/usr/bin/env python
# -*- coding: utf-8  -*-
#使用gensim word2vec训练脚本获取词向量

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告

import logging
import os.path
import sys
import multiprocessing

from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence


if __name__ == '__main__':

    #print open('/home/zdzn/sougou-word2vec/cmd.txt').readlines()
    #sys.exit()
    
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # inp为输入语料, outp1 为输出模型, outp2为原始c版本word2vec的vector格式的模型
    fdir = '/home/zdzn/sougou-word2vec/'
    inp = fdir + 'sougou.seg.txt'
    outp1 = fdir + 'sougou.text.model'
    outp2 = fdir + 'sougou.text.vector'

    # 训练skip-gram模型
    model = Word2Vec(LineSentence(inp), size=50, window=5, min_count=5,
                     workers=multiprocessing.cpu_count())

    # 保存模型
    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

3:测试

#!/usr/bin/env python
# -*- coding: utf-8  -*-
#测试训练好的模型

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告
import sys  
reload(sys)  
sys.setdefaultencoding('utf8')
import gensim


if __name__ == '__main__':
    fdir = '/home/zdzn/sougou-word2vec/'
    model = gensim.models.Word2Vec.load(fdir + 'sougou.text.model')

    word = model.most_similar(u"学生")
    for t in word:
        print t[0],t[1]

  
   

这个测试代表,查看给定词的相关词。我们测试的是 ”学生“ 。

结果如下:

到这里,实验已完成哈!

四、一些相关概念及注意

训练word2vec模型时,不同的参数,代表不同的含义。这里列举了一些参数说明。

  • sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或ineSentence构建。
  • sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
  • size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
  • window:表示当前词与预测词在一个句子中的最大距离是多少
  • alpha: 是学习速率
  • seed:用于随机数发生器。与初始化词向量有关。
  • min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
  • max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
  • sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
  • workers参数控制训练的并行数。
  • hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
  • negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
  • cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
  • hashfxn: hash函数来初始化权重。默认使用python的hash函数
  • iter: 迭代次数,默认为5
  • trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的
  • sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
  • batch_words:每一批的传递给线程的单词的数量,默认为10000

注意:运行分词时,使用python3,训练word2vec和测试时使用python就可以啦!

 

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值