热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python实现gensim.word2vec模型训练实例

word2vec在NLP领域的运用比较多,最近看了网上的例子觉得挺有意思的,就自己动手实践了一下。简单总结:所谓的wordvector,就是指将单词向量化,将某个单词用特定的向量来

word2vec在NLP领域的运用比较多,最近看了网上的例子觉得挺有意思的,就自己动手实践了一下。

简单总结:

所谓的word vector,就是指将单词向量化,将某个单词用特定的向量来表示。将单词转化成对应的向量以后,就可以将其应用于各种机器学习的算法中去。一般来讲,词向量主要有两种形式,分别是稀疏向量和密集向量。

所谓稀疏向量,又称为one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典的大小N,向量的分量只有一个1,其他全为0,1的位置对应该词在词典中的索引[1]。举例来说,如果有一个词典[“面条”,”方便面”,”狮子”],那么“面条”对应的词向量就是[1,0,0],“方便面”对应的词向量就是[0,1,0]。这种表示方法不需要繁琐的计算,简单易得,但是缺点也不少,比如长度过长(这会引发维数灾难),以及无法体现出近义词之间的关系,比如“面条”和“方便面”显然有非常紧密的关系,但转化成向量[1,0,0]和[0,1,0]以后,就看不出两者有什么关系了,因为这两个向量相互正交。当然了,用这种稀疏向量求和来表示文档向量效果还不错,清华的长文本分类工具THUCTC使用的就是此种表示方法

至于密集向量,又称distributed representation,即分布式表示。最早由Hinton提出,可以克服one-hot representation的上述缺点,基本思路是通过训练将每个词映射成一个固定长度的短向量,所有这些向量就构成一个词向量空间,每一个向量可视为该空间上的一个点[1]。此时向量长度可以自由选择,与词典规模无关。这是非常大的优势。还是用之前的例子[“面条”,”方便面”,”狮子”],经过训练后,“面条”对应的向量可能是[1,0,1,1,0],而“方便面”对应的可能是[1,0,1,0,0],而“狮子”对应的可能是[0,1,0,0,1]。这样“面条”向量乘“方便面”=2,而“面条”向量乘“狮子”=0 。这样就体现出面条与方便面之间的关系更加紧密,而与狮子就没什么关系了。这种表示方式更精准的表现出近义词之间的关系,比之稀疏向量优势很明显。可以说这是深度学习在NLP领域的第一个运用(虽然我觉得并没深到哪里去)

回过头来看word2vec,其实word2vec做的事情很简单,大致来说,就是构建了一个多层神经网络,然后在给定文本中获取对应的输入和输出,在训练过程中不断修正神经网络中的参数,最后得到词向量。

训练模型主要步骤包括:

第一节:读取文件

import jieba,re,os
from gensim.models import word2vec
import logging
#jieba.load_userdict("data\\userdict.txt")
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO,filename='test_01.log')
filename = 'test_01.txt' #测试文本
pre,ext = os.path.splitext(filename) #输入文件分开前缀,后缀 pre=test_01 ext=.txt
corpus = pre + '_seg' + ext #训练语料为按行分词后的文本文件 corpus=test_01_seg.txt
fin = open(filename,encoding='utf8').read().strip(' ').strip('\n').replace('\n\n','\n') #strip()取出首位空格,和换行符,用\n替换\n\n
stopwords = set(open('test_01停用词.txt',encoding='utf8').read().strip('\n').split('\n')) #读入停用词

对日志处理,logging.basiConfig函数的各个参数可以参考:

  1. logging.basicConfig函数各参数:  
  2. filename: 指定日志文件名  
  3. filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’  
  4. format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:  
  5.  %(levelno)s: 打印日志级别的数值  
  6.  %(levelname)s: 打印日志级别名称  
  7.  %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]  
  8.  %(filename)s: 打印当前执行程序名  
  9.  %(funcName)s: 打印日志的当前函数  
  10.  %(lineno)d: 打印日志的当前行号  
  11.  %(asctime)s: 打印日志的时间  
  12.  %(thread)d: 打印线程ID  
  13.  %(threadName)s: 打印线程名称  
  14.  %(process)d: 打印进程ID  
  15.  %(message)s: 打印日志信息  
  16. datefmt: 指定时间格式,同time.strftime()  
  17. level: 设置日志级别,默认为logging.WARNING  
  18. stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略 

第二:分词,将训练文本中的词做处理,不能包含停用词中的词,以及长度少于等于1的词,去标点,

所谓停用词,就是出现频率太高的词,如逗号,句号等等,以至于没有区分度。

text = ' '.join([x for x in jieba.lcut(fin) if x not in stopwords and len(x)>1 and x != '\n']) #去掉停用词中的词,去掉长度小于等于1的词
print(text)
results = re.sub('[()::?“”《》,。!·、\d ]+',' ',text) #去标点
open(corpus,'w+',encoding='utf8').write(results) #按行分词后存为训练语料

第三:用预处理好的语料 训练模型

#3.训练模型
sentences = word2vec.LineSentence(corpus) # 加载语料,LineSentence用于处理分行分词语料
#sentences1 = word2vec.Text8Corpus(corpus) #用来处理按文本分词语料
#print('=--=-=-=-=-=',sentences)
model = word2vec.Word2Vec(sentences, size=12,window=25,min_count=2,workers=5,sg=1,hs=1) #训练模型就这一句话 去掉出现频率小于2的词
# http://blog.csdn.net/szlcw1/article/details/52751314 训练skip-gram模型; 第一个参数是训练预料,min_count是小于该数的单词会被踢出,默认值为5,size是神经网络的隐藏层单元数,在保存的model.txt中会显示size维的向量值。默认是100。默认window=5

第四:保存模型

# 4保存模型,以便重用
model.save("test_01.model") #保存模型
model.wv.save_word2vec_format('test_01.model.txt','test_01.vocab.txt',binary=False) # 将模型保存成文本,model.wv.save_word2vec_format()来进行模型的保存的话,会生成一个模型文件。里边存放着模型中所有词的词向量。这个文件中有多少行模型中就有多少个词向量。

第五:加载模型,验证模型

#5词向量验证
#加载训练好的模型
model = word2vec.Word2Vec.load("test_01.model") #加载训练好的语料模型
# 计算两个词的相似度/相关程度
# role1 = ['大圣','悟空','齐天大圣','师兄','老孙','行者','孙行者','孙悟空']
# role2 = ['天蓬','猪悟能','老猪','八戒','猪八戒','呆子']
role1 = ['天地','万物','一元']
role2 = ['天地','百岁']
pairs = [(x,y) for x in role1 for y in role2]

print(pairs) #[('天地', '天地'), ('天地', '百岁'), ('万物', '天地'), ('万物', '百岁'), ('一元', '天地'), ('一元', '百岁')]
#pairs = [('观音','猪悟能'),('观音','天蓬'),('观音','八戒'),('呆子','八戒'),('天蓬','嫦娥'),('天蓬','大圣'),('天蓬','卷帘'),('八戒','姐姐')]
for pair in pairs:
print("> [%s]和[%s]的相似度为:" % (pair[0],pair[1]), model.similarity(pair[0], pair[1])) # 预测相似性

# 计算某个词的相关词列表
figures = ['如来','西天','观音','老君','师父','老孙','八戒','沙和尚','南天门','王母','天王']
for figure in figures:
print("> 和[%s]最相关的词有:\n" % figure, '\n'.join([x[0].ljust(4,' ')+str(x[1]) for x in model.most_similar(figure, topn=10)]),sep='') # 默认10个最相关

结果:

《python实现gensim.word2vec模型训练实例》《python实现gensim.word2vec模型训练实例》

《python实现gensim.word2vec模型训练实例》

参考文章:

http://blog.csdn.net/u014595019/article/details/51884529

scikit-learn文本特征提取之TfidfVectorizer   :

    http://blog.csdn.net/pipisorry/article/details/41957763

    http://blog.csdn.net/pipisorry/article/details/41957763


推荐阅读
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • TensorFlow基础知识深化讲解
    批标准化批标准化(batchnormalization,BN)是为了克服神经网络层数加深导致难以训练而诞生的。深度神经网络随着深度加深,收 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 图像相似度分析软件及常用算法综述
    有没有一款软件能比对两张照片是否一样? 可以用AI软件来对比。AI人脸比对已经变成非常常用的AI场景之一。步骤如下:1、浏览器输入网址百度AI应用,AI ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
author-avatar
hsc686
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有