Word2Vec训练同义词模型

一、需求描述

     业务需求的目标是识别出目标词汇的同义词和相关词汇,如下为部分目标词汇(主要用于医疗问诊):

尿
痘痘
发冷
呼吸困难
恶心

数据源是若干im数据,那么这里我们选择google 的word2vec模型来训练同义词和相关词。

二、数据处理

    数据处理考虑以下几个方面:
1. 从hive中导出不同数据量的数据
2. 过滤无用的训练样本(例如字数少于5)
3. 准备自定义的词汇表
4. 准备停用词表

三、工具选择

    选择python 的gensim库,由于先做预研,数据量不是很大,选择单机就好,暂时不考虑spark训练。后续生产环境计划上spark。

详细的gensim中word2vec文档

上述文档有关工具的用法已经很详细了,就不多说。

分词采用jieba。

四、模型训练步骤简述

1.先做分词、去停用词处理

seg_word_line = jieba.cut(line, cut_all = True)

2.将分词的结果作为模型的输入

model = gensim.models.Word2Vec(LineSentence(source_separated_words_file), size=200, window=5, min_count=5, alpha=0.02, workers=4)

3.保存模型,方便以后调用,获得目标词的同义词

similary_words = model.most_similar(w, topn=10)

五、重要调参目标

     比较重要的参数:
1. 训练数据的大小,当初只用了10万数据,训练出来的模型很不好,后边不断地将训练语料增加到800万,效果得到了明显的提升
2. 向量的维度,这是词汇向量的维数,这个会影响到计算,理论上来说维数大一点会好。
3. 学习速率
4. 窗口大小

在调参上,并没有花太多精力,因为目测结果还好,到时上线使用前再仔细调整。

六、模型的实际效果

目标词同义词相关词
尿尿液,撒尿,尿急,尿尿有,尿到,内裤,尿意,小解,前列腺炎,小便
痘痘逗逗,豆豆,痘子,小痘,青春痘,红痘,长痘痘,粉刺,讽刺,白头
发冷发烫,没力,忽冷忽热,时冷时热,小柴胡,头昏,嗜睡,38.9,头晕,发寒
呼吸困难气来,气紧,窒息,大气,透不过气,出不上,濒死,粗气,压气,心律不齐
恶心闷,力气,呕心,胀气,涨,不好受,不进,晕车,闷闷,精神

七、可以跑的CODE

import codecs
import jieba
import gensim
from gensim.models.word2vec import LineSentencedef read_source_file(source_file_name):try:file_reader = codecs.open(source_file_name, 'r', 'utf-8',errors="ignore")lines = file_reader.readlines()print("Read complete!")file_reader.close()return linesexcept:print("There are some errors while reading.")def write_file(target_file_name, content):file_write = codecs.open(target_file_name, 'w+', 'utf-8')file_write.writelines(content)print("Write sussfully!")file_write.close()def separate_word(filename,user_dic_file, separated_file):print("separate_word")lines = read_source_file(filename)#jieba.load_userdict(user_dic_file)stopkey=[line.strip() for line in codecs.open('stopword_zh.txt','r','utf-8').readlines()]output = codecs.open(separated_file, 'w', 'utf-8')num = 0for line in lines:num = num + 1if num% 10000 == 0:print("Processing line number: " + str(num))seg_word_line = jieba.cut(line, cut_all = True)wordls = list(set(seg_word_line)-set(stopkey))if len(wordls)>0:word_line = ' '.join(wordls) + '\n'output.write(word_line)output.close()return separated_filedef build_model(source_separated_words_file,model_path):print("start building...",source_separated_words_file)model = gensim.models.Word2Vec(LineSentence(source_separated_words_file), size=200, window=5, min_count=5, alpha=0.02, workers=4)       model.save(model_path)print("build successful!", model_path)return modeldef get_similar_words_str(w, model, topn = 10):result_words = get_similar_words_list(w, model)    return str(result_words)def get_similar_words_list(w, model, topn = 10):result_words = []try:similary_words = model.most_similar(w, topn=10)print(similary_words)for (word, similarity) in similary_words:result_words.append(word)print(result_words)except:print("There are some errors!" + w)return result_wordsdef load_models(model_path):return gensim.models.Word2Vec.load(model_path)if "__name__ == __main__()":filename = "d:\\data\\dk_mainsuit_800w.txt" #source fileuser_dic_file = "new_dict.txt" # user dic fileseparated_file = "d:\\data\\dk_spe_file_20170216.txt" # separeted words filemodel_path = "information_model0830" # model file#source_separated_words_file = separate_word(filename, user_dic_file, separated_file)source_separated_words_file = separated_file    # if separated word file exist, don't separate_word againbuild_model(source_separated_words_file, model_path)# if model file is exist, don't buile modl model = load_models(model_path)words = get_similar_words_str('头痛', model)print(words)

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

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

相关文章

ElasticSearch 聚合查询

价格总和: 1,使用aggs 2,自己起个名字price_of_sum 3,求和sum 4,filed要求和的字段 GET /lib5/items/_search {"aggs": {"price_of_sum": {"sum": {"field": "price"}}} }聚合查询结果&#x…

hdu Candy Sharing Game

http://acm.hdu.edu.cn/showproblem.php?pid1034 模拟题 View Code 1 #include<iostream> 2 using namespace std; 3 int a[100000]; 4 int b[100000];//a的一半 5 int n; 6 int main() 7 { 8 while(cin>>n && n) 9 {10 int i;11 …

Spark下的word2vec模型训练

一、引言 前边一节介绍了Word2Vec模型训练同义词&#xff0c;那么在大数据量的情况下&#xff0c;我们自然想到了用spark来进行训练。下面就介绍我们是如何实现spark上的模型训练。 二、分词 模型训练的输入是分好词的语料&#xff0c;那么就得实现spark上的分词。 def split…

ElasticSearch 复合查询

使用bool查询 接收以下参数: must:文档必须匹配这些条件才能被包含进来。 must _not:文档必须不匹配这些条件才能被包含进来。 should:如果满足这些语句中的任意语句&#xff0c;将增加。score, 否则&#xff0c;无任何影响。它们主要用于修正每个文档的相关性得分。 filter:必…

对DataTable的一些解释

最经做导入导出Excel时&#xff0c;经常操作DataTable&#xff0c;DataSet&#xff0c;就按自己的需求对他们的一些常用的东西进行了一下总结。 一、DataTable简介 (1)构造函数 DataTable() 不带参数初始化DataTable 类的新实例。 DataTable(string …

最优化学习笔记(二十)——全局搜索算法

一、引言 前边的博文我们讨论过一些迭代算法&#xff0c;包括梯度方法、牛顿法、共轭梯度法和拟牛顿法&#xff0c;能够从初始点出发&#xff0c;产生一个迭代序列&#xff0c;但是往往这些迭代序列只能收敛到局部极小点&#xff0c;而且这些迭代方法需要计算目标函数的一阶导数…

Elasticsearch查询性能优化

constant_score的用处 当我们不关心检索词频率TF&#xff08;Term Frequency&#xff09;对搜索结果排序的影响时&#xff0c;可以使用constant_score将查询语句query或者过滤语句filter包装起来。 检索词频率&#xff1a;检索词在该字段出现的频率。出现频率越高&#xff0c…

Doc2Vec训练相似文章识别模型

一、需求描述 由于在平台上发布的文章是来源于不同渠道和作者的&#xff0c;发布的文章也存在一定程度上的抄袭或者太相似。为了避免对用户体验造成影响&#xff0c;避免不必要的文章费用支出&#xff0c;需要识别出哪些文章是相似的。数据源是若干文章&#xff08;中文&#x…

微软ping程序源代码完整版(附详细的注释)

作者:侯志江 单位:天津大学软件学院 E-mail :tjuhzjemailyahoo.com.cn 日期:2005年1月1日 内容简介: 编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块…

ElasticSearch原理

3.1解析es的分布式架构 3.1.1分布式架构的透明隐藏特性 ElasticSearch是一个分布式系统&#xff0c; 隐藏了复杂的处理机制 分片机制:我们不用关心数据是按照什么机制分片的、最后放入到哪个分片中 分片的副本: 集群发现机制(cluster discovery):比如当前我们启动了一-个es进程…

实时重复文章识别——SimHash

一、背景介绍 在前边的文章中&#xff0c;我们采用的是用google的Doc2Vec模型来识别重复文章的&#xff0c;从线上运行的效果来看&#xff0c;它的准确率是比较高的。当然&#xff0c;这是建立在把所有的文章都当做训练数据来训练Doc2Vec模型的基础上的&#xff0c;它推断出一篇…

Duplicate entry...for key...

Duplicate entry...for key...的错误原因是主键的唯一值重复&#xff0c;在对数据库进行修改、插入操作时&#xff0c;一但主键的唯一值重复就会报此错误&#xff0c;有时在表中存在多个主键时&#xff0c;对表操作仍然报此错误&#xff0c;是因为对该表的索引造成的。例如一个…

深入理解simhash原理

一、LSH 介绍 LSH(Locality sensitive hashing)是局部敏感性hashing&#xff0c;它与传统的hash是不同的。传统hash的目的是希望得到O&#xff08;1&#xff09;的查找性能&#xff0c;将原始数据映射到相应的桶内。 LSH的基本思想是将空间中原始数据相邻的2个数据点通过映…

我的bolg,我的收获(MVC首次接触)

一&#xff1a;VO&#xff1a;定义变量和getter和getter方法。 二&#xff1a;DBC&#xff1a;DateBaseConnection 三&#xff1a;接口&#xff1a;记住接口首字母用I开头。并且查询时用FindXxx等等区别 四:Impl实现类&#xff1a; 五&#xff1a;代理模式&#xff0c;负责关闭…

IntelliJ IDEA tomcat配置

1&#xff0c;首先安装好 IntelliJ IDEA 开发工具 2&#xff0c;右上角这里有个 Edit Configurations 3,添加模板 选择本地安装的tomcat 和 选择jdk 4&#xff0c;添加tomcat 这里tomcat就安装好了

Think in Java之斐波那契数列

斐波纳契数列&#xff08;Fibonacci Sequence&#xff09;&#xff0c;又称黄金分割数列。 指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、……这个数列从第三项开始&#xff0c;每一项都等于前两项之和。 在数学上&#xff0c;斐波纳契数列以如下被以递归的方法定…

(论文阅读笔记1)Collaborative Metric Learning(一)(WWW2017)

一、摘要 度量学习算法产生的距离度量捕获数据之间的重要关系。这里&#xff0c;我们将度量学习和协同过滤联系起来&#xff0c;提出了协同度量学习&#xff08;CML&#xff09;&#xff0c;它可以学习出一个共同的度量空间来编码用户偏好和user-user 和 item-item的相似度。 …

《论道HTML5》内容技术分享活动

HTML5小组的第12次活动&#xff0c;本期沙龙围绕5月出版的《论道HTML5》重点章节内容展开&#xff0c;由我和另外一位作者秀野堂主现场分享。欢迎大家参加&#xff0c;下面是活动的详细信息。活动介绍&#xff1a;时间&#xff1a;2012年04月21日 13:30-18:00地址&#xff1a;东…

基于SpringBoot实现一个可扩展的事件总线

基于SpringBoot实现一个可扩展的事件总线 前言 在日常开发中&#xff0c;我们经常会用到事件总线&#xff0c;SpringBoot通过事件多播器的形式为我们提供了一个事件总线&#xff0c;但是在开发中我们经常会用到其他的实现&#xff0c;比如Guava、Disruptor的。我们将基于Spri…