Doc2Vec实践

  • 目录:
    • 前言:
    • 第一步:首先我们需要拿到对应的数据,相关的代码如下:
    • 第二步:拿到对应的数据后,就开始训练数据生成对应的model,对应的代码如下:
    • 第三步:得到生成的model后,我们就可以输入相应的问题得到相似的问题。代码如下:
    • 第四步:将拿到的相似问题表示出来就OK了。
    • 总结:

目录:

前言:

最近由于要开发一款项目,就想用doc2vec来实现其中的推荐功能,根据用户输入的问题利用doc2vec返回相似的问题。
以下是整个Demo的实现过程,具体的详细代码请参考我的Git:https://github.com/645187919/doc2vecDemo

对于doc2vec来说其实内部原理也是先拿到尽可能多的数据生成一个model然后根据输入再在model中进行匹配,得到对应的输入。

第一步:首先我们需要拿到对应的数据,相关的代码如下:

def get_datasest():fin = open("questions.txt",encoding='utf8').read().strip(' ')   #strip()取出首位空格# print(fin)# print(type(fin))# 添加自定义的词库用于分割或重组模块不能处理的词组。jieba.load_userdict("userdict.txt")# 添加自定义的停用词库,去除句子中的停用词。stopwords = set(open('stopwords.txt',encoding='utf8').read().strip('\n').split('\n'))   #读入停用词text = ' '.join([x for x in jieba.lcut(fin) if x not in stopwords])  #去掉停用词中的词# print(text)print (type(text),len(text))x_train = []word_list = text.split('\n')print(word_list[0])for i,sub_list in enumerate(word_list):document = TaggededDocument(sub_list, tags=[i])# document是一个Tupple,形式为:TaggedDocument( 杨千嬅 现在 教育 变成 一种 生意 , [42732])# print(document)x_train.append(document)return x_train

第二步:拿到对应的数据后,就开始训练数据生成对应的model,对应的代码如下:

def train(x_train, size=200, epoch_num=1):# D2V参数解释:# min_count:忽略所有单词中单词频率小于这个值的单词。# window:窗口的尺寸。(句子中当前和预测单词之间的最大距离)# size:特征向量的维度# sample:高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)。# negative: 如果>0,则会采用negativesampling,用于设置多少个noise words(一般是5-20)。默认值是5。# workers:用于控制训练的并行数。model_dm = Doc2Vec(x_train,min_count=1, window = 5, size = size, sample=1e-3, negative=5, workers=4,hs=1,iter=6)# total_examples:统计句子数# epochs:在语料库上的迭代次数(epochs)。model_dm.train(x_train, total_examples=model_dm.corpus_count, epochs=70)model_dm.save('model_test')return model_dm

第三步:得到生成的model后,我们就可以输入相应的问题得到相似的问题。代码如下:

def test():model_dm = Doc2Vec.load("model_test")test_ = '申请贷款需要什么条件?'#读入停用词stopwords = set(open('stopwords.txt',encoding='utf8').read().strip('\n').split('\n'))#去掉停用词中的词test_text = ' '.join([x for x in jieba.lcut(test_) if x not in stopwords])print(test_text)#获得对应的输入句子的向量inferred_vector_dm = model_dm.infer_vector(doc_words=test_text)# print(inferred_vector_dm)#返回相似的句子sims = model_dm.docvecs.most_similar([inferred_vector_dm], topn=10)return sims

第四步:将拿到的相似问题表示出来就OK了。

if __name__ == '__main__':x_train = get_datasest()# print(x_train)# model_dm = train(x_train)sims = test()# sims:[(89, 0.730167031288147), (6919, 0.6993225812911987), (6856, 0.6860911250114441), (40892, 0.6508388519287109), (40977, 0.6465731859207153), (30707, 0.6388640403747559), (40160, 0.6366203427314758), (11672, 0.6353889107704163), (16752, 0.6346361637115479), (40937, 0.6337493062019348)]# sim是一个Tuple,内部包含两个元素,一个是对应的句子的索引号(之前自定义的tag)一个是对应的相似度# print(type(sims))# print('sims:'+str(sims))for count, sim in sims:sentence = str(x_train[count])# sentence = x_train[count]# print('sentence:'+sentence)# print('sim:'+str(sim))print(sentence, sim, len(sentence))

当然中间你也可以拿到对应的句子的向量如下:

def getVecs(model, corpus, size):vecs = [np.array(model.docvecs[z.tags[0]].reshape(1, size)) for z in corpus]return np.concatenate(vecs)

总结:

虽然在程序中自定义了停词库和词库但是整体的效果依旧不尽人意,甚至在刚开始未调参阶段碰到对于同一个输入运行多次得到不同结果的尴尬情况……虽然这个问题在后来通过调参解决了,但是发现发现这里面仍有许多问题:如输入问题A,model中也包含问题A,但是返回的相似问题中,A的相关度有些却不是最高的等等。后来查了一些资料发现其他的一些网友做这个实验的时候也是效果不理想(至于出现这些问题的原因目前不是特别清楚,按照Doc2Vec的理论来说效果应该不会很差的,可实践后却啪啪啪打脸。。。)。所以暂时得到的结论就是:doc2vec效果时好时坏,偶然性大,不稳定。目前有找到另一种方法来满足我的需求,同样采用的是句子向量,同样是用余弦定理来求相似句子,理论比doc2vec简单,效果也比doc2vec好。等整理好了,会在下一篇文章中做介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux常用命令全网最全

一、linux文件系统结构 sudo apt-get install treetree --help #查看帮助tree -L 1 #显示文件目录 rootubuntu16 /# tree -L 1 . #系统根目录,有且只有一个根目录 ├── bin #存放常见的命令 ├── boot #系统启动文件和核心文件都在这个目录…

《开源思索集》一Source Code + X

本节书摘来异步社区《开源思索集》一书中的第1章,作者: 庄表伟 责编: 杨海玲, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 Source Code X 开源思索集最近,有一位来自学术界朋友,找到了我们这个开源的圈子…

机器学习中目标函数、损失函数以及正则项的通俗解释

目录:前言:1、什么是目标函数?2、损失函数3、正则化总结: 目录: 前言: 今天看到一篇很精简的文章来说明目标函数、损失函数以及正则项是什么。以下是文章正文。 转自:https://xiaozhuanlan.…

Linux中的 硬链接ln和软连接ln -s

文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件…

干货分享!DevExpressv16.2最新版演示示例等你来收!(上)

2019独角兽企业重金招聘Python工程师标准>>> 为解决大家找资源难的问题,EVGET联合DevExpress控件中文网盘点热门的DevExpress资讯、Demo示例、版本升级及下载,以及各种教程推荐等。更多下载及资讯也可以在DevExpress控件中文网中找到&#xf…

一文看懂哈夫曼树与哈夫曼编码

转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如JPEG中…

解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。

虚拟机无端出现: VMware Workstation 无法连接到虚拟机。请确保您有权限运行该程序、访问改程序使用的所有目录以及访问所有临时文件目录。未能将管道连接到虚拟机: 所有的管道范例都在使用中。 原因:Ubuntu开机慢到开不开,我就在任务管理器强制结束了…

tcpdf开发文档(中文翻译版)

2017年5月3日15:06:15 这个是英文翻译版,我看过作者的文档其实不太友善或者不方便阅读,不如wiki方便 后面补充一些,结构性文档翻译 这是一部官方网站文档,剩余大部分都是开发的时候和网络总结来的 项目官网:https://t…

CCF推荐各种国际学术会议和期刊目录

这是中国计算机学会推荐国际学术会议和期刊目录2015年版本的内容, 主要罗列了国际上计算机相关的各个方向的顶级学术会议和期刊目录(包含A、B、C三个等级)。 包含的方向有: 计算机体系结构/并行与分布计算/存储系统计算机网络网络…

Linux基本操作【作业】

1.如何使用命令立即重启linux操作系统? sudo reboot 2.如何查看/etc下的所有文件,并以列表格式显示,并且显示隐藏文件 cd /etc | ls -la 3.一次性创建 text/1/2/3/4 cd tmp mkdir -p text/1/2/3/4 (1&#xff…

开发日志_Jan.8.2017

这两天继续着手开发碰撞部分。 主要工作是写碰撞类和运动线程类。碰撞主要在于算法,运动线程只要管理好就行了。 之前碰撞测试中(即还未添加完整碰撞算法时)遇到各种bug,疑似机器人和小球的定位点不明所造成的。昨天研究了下QT下的…

Nginx【学习笔记】

Nginx 1. nginx可以做什么? 可针对静态资源高速高并发访问及缓存。 可使用反向代理加速,并且可进行数据缓存。 具有简单负载均衡、节点健康检查和容错功能。 支持远程FastCGI服务的缓存加速。 支持FastCGI、Uwsgi、SCGI、Memcached Servers的加速和…

第四次作业类测试代码+036+吴心怡

一、类图 二、代码 package application; public class Commission { /* * hp:耳机 80元 mpc:手机壳 10元 cpsp:手机贴膜 8元 */ public float calculate(String line) { int hp 0, mpc 0, cpsp 0; String[] input null; float money 0;…

LSI/LSA算法原理与实践Demo

目录:1、使用场景2、优缺点3、算法原理3.1、传统向量空间模型的缺陷3.2、Latent Semantic Analysis (Latent Semantic Indexing)3.3、算法实例 4、文档相似度的计算5、对应的实践Demo 目录: 1、使用场景 文本挖掘中,主题模型。聚类算法关注…

解决: ubuntu18.04没有网络直连

初次安装ubuntu 18.04, 发现没有网络. 直接上我遇到的这个问题的解决方法 sudo service NetworkManager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service NetworkManager start 未能解决问题的方法有 修改/etc/netplan/*.yaml 修改/etc/NetworkMana…

Linux学习134 Unit 8

Unit8 ldap网络帐号1.ldap是什么ldap目录服务认证,和windows活动目录类似,就是记录数据的一种方式2.ldap客户端所须软件yum sssd krb5-workstation -y3.如何开启ldap用户认证authconfig-tui┌────────────────┤ Authentication Configu…

FastText原理总结

目录:1、应用场景2、优缺点3、FastText的原理4、FastText词向量与word2vec对比 目录: 1、应用场景 fastText是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型,如SVM,Logistic …

解决 :sudo:/etc/sudoers 可被任何人写

问题: sudo:sudo /etc/sudoers is world writable sudo:no valid sudoers sources found ,quitting sudo:unable to initialize policy plugin 解决方案: 方法一: 1.开机按shift或esc进入ubantu高级模式 再进行recovery模式 2.选择root命令行模式 3.…

sqlserver数据库类型对应Java中的数据类型

SQL Server 类型JDBC 类型 (java.sql.Types)Java 语言类型 bigint BIGINT long timestamp binary BINARY byte[] bit BIT boolean char CHAR String decimal money smallmoney DECIMAL java.math.BigDecimal float DOUBLE double int INTEGER int image v…

Doc2Bow简介与实践Demo

Doc2Bow是Gensim中封装的一个方法,主要用于实现Bow模型,下面主要介绍下Bow模型。 1、BoW模型原理 Bag-of-words model (BoW model) 最早出现在自然语言处理(Natural Language Processing)和信息检索(Information Ret…