当前位置:首页 » 操作系统 » word2vec源码

word2vec源码

发布时间: 2024-10-21 16:09:43

python gensim怎么用word2vect

词向量(word2vec)原始的代码是C写的,python也有对应的版本,被集成在一个非常牛逼的框架gensim中。

我在自己的开源语义网络项目graph-mind(其实是我自己写的小玩具)中使用了这些功能,大家可以直接用我在上面做的进一步的封装傻瓜式地完成一些操作,下面分享调用方法和一些code上的心得。

1.一些类成员变量:

[python]view plain

  • def__init__(self,modelPath,_size=100,_window=5,_minCount=1,_workers=multiprocessing.cpu_count()):

  • self.modelPath=modelPath

  • self._size=_size

  • self._window=_window

  • self._minCount=_minCount

  • self._workers=_workers

  • modelPath是word2vec训练模型的磁盘存储文件(model在内存中总是不踏实),_size是词向量的维度,_window是词向量训练时的上下文扫描窗口大小,后面那个不知道,按默认来,_workers是训练的进程数(需要更精准的解释,请指正),默认是当前运行机器的处理器核数。这些参数先记住就可以了。

    2.初始化并首次训练word2vec模型

    完成这个功能的核心函数是initTrainWord2VecModel,传入两个参数:corpusFilePath和safe_model,分别代表训练语料的路径和是否选择“安全模式”进行初次训练。关于这个“安全模式”后面会讲,先看代码:

    [python]view plain

  • definitTrainWord2VecModel(self,corpusFilePath,safe_model=False):

  • '''''

  • initandtrainaneww2vmodel

  • (,

  • aboutsoft_model:

  • ifsafe_modelistrue,,

  • andthiscankeeptheusageofos'smemorysafebutslowly.

  • andifsafe_modelisfalse,

  • .)

  • '''

  • extraSegOpt().reLoadEncoding()

  • fileType=localFileOptUnit.checkFileState(corpusFilePath)

  • iffileType==u'error':

  • warnings.warn('loadfileerror!')

  • returnNone

  • else:

  • model=None

  • iffileType==u'opened':

  • print('trainingmodelfromsingleFile!')

  • model=Word2Vec(LineSentence(corpusFilePath),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • eliffileType==u'file':

  • corpusFile=open(corpusFilePath,u'r')

  • print('trainingmodelfromsingleFile!')

  • model=Word2Vec(LineSentence(corpusFile),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • eliffileType==u'directory':

  • corpusFiles=localFileOptUnit.listAllFileInDirectory(corpusFilePath)

  • print('!')

  • ifsafe_model==True:

  • model=Word2Vec(LineSentence(corpusFiles[0]),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • forfileincorpusFiles[1:len(corpusFiles)]:

  • model=self.updateW2VModelUnit(model,file)

  • else:

  • sentences=self.loadSetencesFromFiles(corpusFiles)

  • model=Word2Vec(sentences,size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • eliffileType==u'other':

  • #TODOaddsentenceslistdirectly

  • pass

  • model.save(self.modelPath)

  • model.init_sims()

  • print('procingword2vecmodel...ok!')

  • returnmodel

  • 首先是一些杂七杂八的,判断一下输入文件路径下访问结果的类型,根据不同的类型做出不同的文件处理反应,这个大家应该能看懂,以corpusFilePath为一个已经打开的file对象为例,创建word2vec model的代码为:

    [python]view plain

  • model=Word2Vec(LineSentence(corpusFilePath),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • 其实就是这么简单,但是为了代码健壮一些,就变成了上面那么长。问题是在面对一个路径下的许多训练文档且数目巨大的时候,一次性载入内存可能不太靠谱了(没有细研究gensim在Word2Vec构造方法中有没有考虑这个问题,只是一种习惯性的警惕),于是我设定了一个参数safe_model用于判断初始训练是否开启“安全模式”,所谓安全模式,就是最初只载入一篇语料的内容,后面的初始训练文档通过增量式学习的方式,更新到原先的model中。

    上面的代码里,corpusFilePath可以传入一个已经打开的file对象,或是一个单个文件的地址,或一个文件夹的路径,通过函数checkFileState已经做了类型的判断。另外一个函数是updateW2VModelUnit,用于增量式训练更新w2v的model,下面会具体介绍。loadSetencesFromFiles函数用于载入一个文件夹中全部语料的所有句子,这个在源代码里有,很简单,哥就不多说了。

    3.增量式训练更新word2vec模型

    增量式训练w2v模型,上面提到了一个这么做的原因:避免把全部的训练语料一次性载入到内存中。另一个原因是为了应对语料随时增加的情况。gensim当然给出了这样的solution,调用如下:

    [python]view plain

  • defupdateW2VModelUnit(self,model,corpusSingleFilePath):

  • '''''

  • (onlycanbeasingleFile)

  • '''

  • fileType=localFileOptUnit.checkFileState(corpusSingleFilePath)

  • iffileType==u'directory':

  • warnings.warn('cannotdealadirectory!')

  • returnmodel

  • iffileType==u'opened':

  • trainedWordCount=model.train(LineSentence(corpusSingleFilePath))

  • print('updatemodel,updatewordsnumis:'+trainedWordCount)

  • eliffileType==u'file':

  • corpusSingleFile=open(corpusSingleFilePath,u'r')

  • trainedWordCount=model.train(LineSentence(corpusSingleFile))

  • print('updatemodel,updatewordsnumis:'+trainedWordCount)

  • else:

  • #TODOaddsentenceslistdirectly(sameaslastfunction)

  • pass

  • returnmodel

  • 简单检查文件type之后,调用model对象的train方法就可以实现对model的更新,这个方法传入的是新语料的sentences,会返回模型中新增词汇的数量。函数全部执行完后,return更新后的model,源代码中在这个函数下面有能够处理多类文件参数(同2)的增强方法,这里就不多介绍了。

    4.各种基础查询

    当你确定model已经训练完成,不会再更新的时候,可以对model进行锁定,并且据说是预载了相似度矩阵能够提高后面的查询速度,但是你的model从此以后就read only了。

    [python]view plain

  • deffinishTrainModel(self,modelFilePath=None):

  • '''''

  • warning:afterthis,themodelisread-only(can'tbeupdate)

  • '''

  • ifmodelFilePath==None:

  • modelFilePath=self.modelPath

  • model=self.loadModelfromFile(modelFilePath)

  • model.init_sims(replace=True)

  • 可以看到,所谓的锁定模型方法,就是init_sims,并且把里面的replace参数设定为True。

    然后是一些word2vec模型的查询方法:

    [python]view plain

  • defgetWordVec(self,model,wordStr):

  • '''''

  • gettheword'

  • '''

  • returnmodel[wordStr]

  • [python]view plain

  • defqueryMostSimilarWordVec(self,model,wordStr,topN=20):

  • '''''

  • return2-dimList[0]isword[1]isdouble-prob

  • '''

  • similarPairList=model.most_similar(wordStr.decode('utf-8'),topn=topN)

  • returnsimilarPairList

  • [python]view plain

  • defculSimBtwWordVecs(self,model,wordStr1,wordStr2):

  • '''''

  • returndouble-prob

  • '''

  • similarValue=model.similarity(wordStr1.decode('utf-8'),wordStr2.decode('utf-8'))

  • returnsimilarValue

  • 上述方法都很简单,基本上一行解决,在源代码中,各个函数下面依然是配套了相应的model文件处理版的函数。其中,getWordVec是得到查询词的word2vec词向量本身,打印出来是一个纯数字的array;queryMostSimilarWordVec是得到与查询词关联度最高的N个词以及对应的相似度,返回是一个二维list(注释里面写的蛮清楚);culSimBtwWordVecs是得到两个给定词的相似度值,直接返回double值。

    5.Word2Vec词向量的计算

    研究过w2v理论的童鞋肯定知道词向量是可以做加减计算的,基于这个性质,gensim给出了相应的方法,调用如下:

    [python]view plain

  • (self,model,posWordStrList,negWordStrList,topN=20):

  • '''''

  • pos-neg

  • return2-dimList[0]isword[1]isdouble-prob

  • '''

  • posWordList=[]

  • negWordList=[]

  • forwordStrinposWordStrList:

  • posWordList.append(wordStr.decode('utf-8'))

  • forwordStrinnegWordStrList:

  • negWordList.append(wordStr.decode('utf-8'))

  • pnSimilarPairList=model.most_similar(positive=posWordList,negative=negWordList,topn=topN)

  • returnpnSimilarPairList

  • 由于用的是py27,所以之前对传入的词列表数据进行编码过滤,这里面posWordList可以认为是对结果产生正能量的词集,negWordList则是对结果产生负能量的词集,同时送入most_similar方法,在设定return答案的topN,得到的返回结果形式同4中的queryMostSimilarWordVec函数,大家可以这样数学地理解这个操作:

    下面一个操作是我自创的,假设我想用上面词向量topN“词-关联度”的形式展现两个词或两组词之间的关联,我是这么做的:

    [python]view plain

  • (self,model,wordStrList1,wordStrList2,topN_rev=20,topN=20):

  • '''''

  • -wordListandtag-wordList

  • first,usethetag-wordListasneg-wordListtogettherev-wordList,

  • thenusethescr-wordListandtherev-wordListasthenewsrc-tag-wordList

  • topN_revistopNofrev-

  • '''

  • srcWordList=[]

  • tagWordList=[]

  • srcWordList.extend(wordStr.decode('utf-8')forwordStrinwordStrList1)

  • tagWordList.extend(wordStr.decode('utf-8')forwordStrinwordStrList2)

  • revSimilarPairList=self.queryMSimilarVecswithPosNeg(model,[],tagWordList,topN_rev)

  • revWordList=[]

  • revWordList.extend(pair[0].decode('utf-8')forpairinrevSimilarPairList)

  • stSimilarPairList=self.queryMSimilarVecswithPosNeg(model,srcWordList,revWordList,topN)

  • returnstSimilarPairList

  • 这个操作的思路就是,首先用两组词中的一组作为negWordList,传入上面的queryMSimilarVecswithPosNeg函数,得到topN一组的中转词,在使用这些中转词与原先的另一组词进行queryMSimilarVecswithPosNeg操作,很容易理解,第一步得到的是一组词作为negWordList的反向结果,再通过这个反向结果与另一组词得到“负负得正”的效果。这样就可以通过一组topN的“词-关联度”配对List表示两组词之间的关系。

② python学科课程分几个部分

以下是老男孩教育Python全栈课程内容:
阶段一:Python开发基础
Python开发基础课程内容包括:计算机硬件、操作系统原理、安装linux操作系统、linux操作系统维护常用命令、Python语言介绍、环境安装、基本语法、基本数据类型、二进制运算、流程控制、字符编码、文件处理、数据类型、用户认证、三级菜单程序、购物车程序开发、函数、内置方法、递归、迭代器、装饰器、内置方法、员工信息表开发、模块的跨目录导入、常用标准库学习,b加密\re正则\logging日志模块等,软件开发规范学习,计算器程序、ATM程序开发等。
阶段二:Python高级级编编程&数据库开发
Python高级级编编程&数据库开发课程内容包括:面向对象介绍、特性、成员变量、方法、封装、继承、多态、类的生成原理、MetaClass、__new__的作用、抽象类、静态方法、类方法、属性方法、如何在程序中使用面向对象思想写程序、选课程序开发、TCP/IP协议介绍、Socket网络套接字模块学习、简单远程命令执行客户端开发、C\S架构FTP服务器开发、线程、进程、队列、IO多路模型、数据库类型、特性介绍,表字段类型、表结构构建语句、常用增删改查语句、索引、存储过程、视图、触发器、事务、分组、聚合、分页、连接池、基于数据库的学员管理系统开发等。
阶段三:前端开发
前端开发课程内容包括:HTML\CSS\JS学习、DOM操作、JSONP、原生Ajax异步加载、购物商城开发、Jquery、动画效果、事件、定时期、轮播图、跑马灯、HTML5\CSS3语法学习、bootstrap、抽屉新热榜开发、流行前端框架介绍、Vue架构剖析、mvvm开发思想、Vue数据绑定与计算属性、条件渲染类与样式绑定、表单控件绑定、事件绑定webpack使用、vue-router使用、vuex单向数据流与应用结构、vuex actions与mutations热重载、vue单页面项目实战开发等。
阶段四:WEB框架开发
WEB框架开发课程内容包括:Web框架原理剖析、Web请求生命周期、自行开发简单的Web框架、MTV\MVC框架介绍、Django框架使用、路由系统、模板引擎、FBV\CBV视图、Models ORM、FORM、表单验证、Django session & cookie、CSRF验证、XSS、中间件、分页、自定义tags、Django Admin、cache系统、信号、message、自定义用户认证、Memcached、redis缓存学习、RabbitMQ队列学习、Celery分布式任务队列学习、Flask框架、Tornado框架、Restful API、BBS+Blog实战项目开发等。
阶段五:爬虫开发
爬虫开发课程内容包括:Requests模块、BeautifulSoup,Selenium模块、PhantomJS模块学习、基于requests实现登陆:抽屉、github、知乎、博客园、爬取拉钩职位信息、开发Web版微信、高性能IO性能相关模块:asyncio、aiohttp、grequests、Twisted、自定义开发一个异步非阻塞模块、验证码图像识别、Scrapy框架以及源码剖析、框架组件介绍(engine、spider、downloader、scheler、pipeline)、分布式爬虫实战等。
阶段六:全栈项目实战
全栈项目实战课程内容包括:互联网企业专业开发流程讲解、git、github协作开发工具讲解、任务管理系统讲解、接口单元测试、敏捷开发与持续集成介绍、django + uwsgi + nginx生产环境部署学习、接口文档编写示例、互联网企业大型项目架构图深度讲解、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。
阶段七:数据分析
数据分析课程内容包括:金融、股票知识入门股票基本概念、常见投资工具介绍、市基本交易规则、A股构成等,K线、平均线、KDJ、MACD等各项技术指标分析,股市操作模拟盘演示量化策略的开发流程,金融量化与Python,numpy、pandas、matplotlib模块常用功能学习在线量化投资平台:优矿、聚宽、米筐等介绍和使用、常见量化策略学习,如双均线策略、因子选股策略、因子选股策略、小市值策略、海龟交易法则、均值回归、策略、动量策略、反转策略、羊驼交易法则、PEG策略等、开发一个简单的量化策略平台,实现选股、择时、仓位管理、止盈止损、回测结果展示等功能。
阶段八:人工智能
人工智能课程内容包括:机器学习要素、常见流派、自然语言识别、分析原理词向量模型word2vec、剖析分类、聚类、决策树、随机森林、回归以及神经网络、测试集以及评价标准Python机器学习常用库scikit-learn、数据预处理、Tensorflow学习、基于Tensorflow的CNN与RNN模型、Caffe两种常用数据源制作、OpenCV库详解、人脸识别技术、车牌自动提取和遮蔽、无人机开发、Keras深度学习、贝叶斯模型、无人驾驶模拟器使用和开发、特斯拉远程控制API和自动化驾驶开发等。
阶段九:自动化运维&开发
自动化运维&开发课程内容包括:设计符合企业实际需求的CMDB资产管理系统,如安全API接口开发与使用,开发支持windows和linux平台的客户端,对其它系统开放灵活的api设计与开发IT资产的上线、下线、变更流程等业务流程。IT审计+主机管理系统开发,真实企业系统的用户行为、管理权限、批量文件操作、用户登录报表等。分布式主机监控系统开发,监控多个服务,多种设备,报警机制,基于http+restful架构开发,实现水平扩展,可轻松实现分布式监控等功能。
阶段十:高并发语言GO开发高并发语言GO开发课程内容包括:Golang的发展介绍、开发环境搭建、golang和其他语言对比、字符串详解、条件判断、循环、使用数组和map数据类型、go程序编译和Makefile、gofmt工具、godoc文档生成工具详解、斐波那契数列、数据和切片、make&new、字符串、go程序调试、slice&map、map排序、常用标准库使用、文件增删改查操作、函数和面向对象详解、并发、并行与goroute、channel详解goroute同步、channel、超时与定时器reover捕获异常、Go高并发模型、Lazy生成器、并发数控制、高并发web服务器的开发等。

热点内容
fgo脚本登录 发布:2024-11-24 00:20:29 浏览:18
在dos下如何查看配置 发布:2024-11-24 00:20:28 浏览:731
北京时间服务器在什么地方 发布:2024-11-24 00:19:50 浏览:18
分贝的算法 发布:2024-11-24 00:16:07 浏览:928
横截面算法 发布:2024-11-24 00:15:12 浏览:258
pythontile 发布:2024-11-24 00:10:04 浏览:546
修改pdf加密文件 发布:2024-11-24 00:09:50 浏览:223
DVFFORTRAN编译器 发布:2024-11-24 00:03:50 浏览:615
sublimetext如何配置php 发布:2024-11-23 23:54:22 浏览:436
linux文件系统分区 发布:2024-11-23 23:54:15 浏览:736