word2vec的基础知识介绍参考上一篇博客和列举的参考资料。

首先利用安装gensim模块,相关依赖如下,注意版本要一致:

Python >= 2.7 (tested with versions 2.7, 3.5 and 3.6)
    NumPy >= 1.11.3
    SciPy >= 0.18.1
    Six >= 1.5.0
    smart_open >= 1.2.1

我们利用jieba分词对《射雕英雄传》进行分词,然后训练词向量,最后进行测试

# -*- coding: utf-8-*-
import jieba
from gensim.models import word2vec # 去掉中英文状态下的逗号、句号
def clearSen(comment):
comment = ' '.join(comment).replace(',', '').replace('。', '').replace('?', '').replace('!', '') \ .replace('“', '').replace('”', '').replace(':', '').replace('…', '').replace('(', '').replace(')', '') \ .replace('—', '').replace('《', '').replace('》', '').replace('、', '').replace('‘', '') \ .replace('’', '') # 去掉标点符号
return comment # 用jieba进行分词
comment = open(u'./corpus/金庸-射雕英雄传txt精校版.txt').read()
comment = clearSen(comment)
#jieba.load_userdict('./user_dict/userdict_food.txt')
comment = ' '.join(jieba.cut(comment))
#print comment # 分完词后保存到新的txt中
fo = open("./corpus/afterSeg.txt","w")
fo.write(comment.encode('utf-8'))
print("finished!")
fo.close() # 用 word2vec 进行训练
sentences=word2vec.Text8Corpus(u'./corpus/afterSeg.txt')
# 第一个参数是训练语料,第二个参数是小于该数的单词会被剔除,默认值为5, 第三个参数是神经网络的隐藏层单元数,默认为100
model=word2vec.Word2Vec(sentences,min_count=3, size=50, window=5, workers=4)
#------------------------------------------------------------------------
# Word2vec有很多可以影响训练速度和质量的参数:
# (1) sg=1是skip-gram算法,对低频词敏感,默认sg=0为CBOW算法,所以此处设置为1。
# (2) min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。
# (3) size是输出词向量的维数,即神经网络的隐藏层的单元数。值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,大的size需要更多的训练数据, 但是效果会更好,在本文中设置的size值为300维度。
# (4) window是句子中当前词与目标词之间的最大距离,即为窗口。本文设置窗口移动的大小为5。
# (5) negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。
# (6) hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。
# (7) 最后一个主要的参数控制训练的并行:worker参数只有在安装了Cython后才有效,由于本文没有安装Cython的, 使用的单核。
#------------------------------------------------------------------------ # 保存模型
model.save("word2vec.model")
model.wv.save_word2vec_format("word2vec.model.bin", binary=True) #测试
y2=model.similarity(u"郭靖", u"黄蓉") #计算两个词之间的余弦距离
print u"郭靖", u"黄蓉", 'similarity:',y2 for i in model.most_similar(u"黄蓉"): #计算余弦距离最接近“黄蓉”的10个词
print i[0],i[1] for i in model.most_similar(u"郭靖"): #计算余弦距离最接近“郭靖”的10个词
print i[0],i[1]
# 训练词向量时传入的两个参数也对训练效果有很大影响,需要根据语料来决定参数的选择,好的词向量对NLP的分类、聚类、相似度判别等任务有重要意义

加载保存的模型,进行测试:

>>> from gensim.models import word2vec
>>> model = word2vec.Word2Vec.load('word2vec.model')
>>> for e in model.most_similar(u"郭靖"): print e[], e[]
...
黄蓉 0.978638648987
欧阳克 0.95745909214
欧阳锋 0.954400420189
梅超风 0.925759136677
郑重 0.914724588394
裘千仞 0.907471776009
众人 0.906147062778
彭连虎 0.903428137302
柯镇恶 0.902874648571
梁子翁 0.893080115318
>>> for e in model.most_similar(u"黄蓉"): print e[], e[]
...
郭靖 0.978638589382
欧阳锋 0.941402435303
欧阳克 0.937647461891
柯镇恶 0.913198530674
郑重 0.898928642273
梅超风 0.895552039146
杨康 0.890073120594
穆念慈 0.88889926672
怔 0.887811601162
裘千仞 0.884677648544
>>>

利用这里训练好的模型,查看其训练效果:

>>> from gensim.models.deprecated.word2vec import Word2Vec
C:\Python27\lib\site-packages\gensim\utils.py:: UserWarning: detected Windows; aliasing chunkize to chunkize_serial
warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")
>>> model = Word2Vec.load('./model/Word60.model')
>>> for e in model.most_similar(u"朝阳区"): print e[], e[]
...
C:\Python27\lib\site-packages\gensim\matutils.py:: FutureWarning: Conversion of the second argument of issubdtype from `int` to `np.signedinteger` is deprecated. In future, it will be treated as `np.int32 == np.dtype(int).type`.
if np.issubdtype(vec.dtype, np.int):
海淀区 0.953941822052
丰台区 0.940896630287
石景山区 0.928724527359
东城区 0.90411567688
大兴区 0.887912631035
西城区 0.885163784027
崇文区 0.872635483742
济南市 0.868344843388
海淀 0.866064548492
通州区 0.860960006714
>>>
>>> for e in model.most_similar(u"郭靖"): print e[], e[]
...
黄蓉 0.947447776794
杨过 0.939437627792
段誉 0.930292785168
令狐冲 0.928993582726
张无忌 0.921128869057
周伯通 0.918897628784
黄药师 0.918717026711
杨康 0.913613200188
小龙女 0.911328673363
乔峰 0.908709168434
>>>
>>> for e in model.most_similar(u"黄蓉"): print e[], e[]
...
郭靖 0.947447776794
杨过 0.942064762115
张无忌 0.929110050201
令狐冲 0.925551056862
杨康 0.922640800476
小龙女 0.92034471035
段誉 0.915760040283
赵敏 0.914794445038
黄药师 0.910506725311
韦小宝 0.909034609795
>>> model.similarity(u"郭靖", u"黄蓉") #计算两个词之间的余弦距离
0.9474477

补充,word2vec是自然语言处理基础知识,实现了词向量表达。在此基础上可以完成分类、推荐等。

本片文章是通过gensim来完成word2vec,上篇博客中参考资料也有通过TensorFlow实现word2vec。

还有一些词向量的模型,看到https://www.cnblogs.com/royhoo/p/Advanced-Word-Vector-Representations.html介绍了GloVe,有时间再继续学习。

利用python中的gensim模块训练和测试word2vec的更多相关文章

  1. 善于利用python中的os模块

    作为一个程序猿,平时善于利用python中的os模块进行路径等操作,会省去很多麻烦,下面总结一下我平时经常用到的方法: import os os.getcwd() # 获取当前文件所在的目录 os.p ...

  2. 利用搜狐新闻语料库训练100维的word2vec——使用python中的gensim模块

    关于word2vec的原理知识参考文章https://www.cnblogs.com/Micang/p/10235783.html 语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会, ...

  3. 浅析Python中的struct模块

    最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...

  4. python中的select模块

    介绍: Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...

  5. 【转】浅析Python中的struct模块

    [转]浅析Python中的struct模块 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概 ...

  6. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  7. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...

  8. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  9. Python中的单元测试模块Unittest快速入门

    前言 为什么需要单元测试? 如果没有单元测试,我们会遇到这种情况:已有的健康运行的代码在经过改动之后,我们无法得知改动之后是否引入了Bug.如果有单元测试的话,只要单元测试全部通过,我们就可以保证没有 ...

随机推荐

  1. Spring Boot - Profile配置

    Profile是什么 Profile我也找不出合适的中文来定义,简单来说,Profile就是Spring Boot可以对不同环境或者指令来读取不同的配置文件. Profile使用 假如有开发.测试.生 ...

  2. python买卖股票的最佳时机--贪心/蛮力算法简介

    开始刷leetcode算法题 今天做的是“买卖股票的最佳时机” 题目要求 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更 ...

  3. http协议返回码

    有五种可能取值:1xx:指示信息--表示请求已接收,继续处理2xx:成功--表示请求已被成功接收.理解.接受3xx:重定向--要完成请求必须进行更进一步的操作4xx:客户端错误--请求有语法错误或请求 ...

  4. linux中crontab的使用方法

    crontab参数说明: -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv V ...

  5. Zabbix4.2.0使用Python连接企业微信报警

    目录 1. 配置企业微信 2. 脚本配置 2.1 安装python依赖的库 2.2 编写脚本 2. 搭建FTP 3. 配置Zabbix监控FTP 3.1 添加FTP模板 3.2 添加报警媒介 3.3 ...

  6. 复刻smartbits的国产网络测试工具minismb简介

           复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带 ...

  7. Structs+Spring+Hibernate快速入门

    Structs+Spring+Hibernate,这是很经典的一个搭配,它的开发流程也比较程式化,下面以用户注册为例.     注册页面代码: <%@page contentType=" ...

  8. php获取当前是星期几

    <?php $weekarray=array("日","一","二","三","四",&quo ...

  9. 趁webpack5还没出,先升级成webpack4吧

    上一次将webpack1升级到3,也仅是 半年前,前端工具发展变化太快了,如今webpack4已经灰常稳定,传说性能提升非常高,值得升级. 一直用着的webpack3越来越慢,一分多钟的编译时间简直不 ...

  10. 记一次安装Nginx+php-fpm安装后无法解析.php文件,状态码200,但显示空白页

    安装环境: Nginx:Nginx1.12.2 PHP:PHP 7.2 系统:CentOS 7.4 安装方式: Nginx与PHP都是yum安装的,具体步骤: 1.安装epel源再安装Nginx: r ...