-
2021-03-11 14:51:59
- 安装gensim:pip install gensim
- 准备预料:word2vec中需要sens是经过预处理且用空格进行分词的
- 训练模型
w2v_model = gensim.models.Word2Vec(sentences, min_count=5, size=128, window=5)
size:词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
window:即词向量上下文最大距离,默认为5
min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
4.保存模型,训练好的词向量w2v_model.save("word2vec_model.bin") # 保存模型,save_binary=True w2v_model.wv.save_word2vec_format("word2vec.txt", binary=False) # 保存训练好的词向量
更多相关内容 -
Word2Vec:采用Word2Vec训练词向量,数据集:STS
2021-05-01 04:16:01Word2Vec 采用Word2Vec训练词向量,数据集:STS -
利用word2vec训练词向量
2021-09-18 10:54:33利用word2vec训练词向量 这里的代码是在pycharm上运行的 一、数据预处理 我们选用的数据集是新闻数据集一共有五千条新闻数据,一共有四个维度 数据集:https://pan.baidu.com/s/14z–kvHYgwDAbgO0dxlHDg 提取码:9a...利用word2vec训练词向量
这里的代码是在pycharm上运行的,文件列表如下:
一、数据预处理
我选用的数据集是新闻数据集一共有五千条新闻数据,一共有四个维度
数据集:https://pan.baidu.com/s/1ewzlU_tBnuwZQxVOKO8ZiA 提取码: mei3
首先我们要把我们需要的数据给提取出来,这里我们将数据集里的所有新闻提取出来,并对其进行分词,再删除停用词
import pandas as pd import jieba #读取数据集 new_data = pd.read_table("./data/new_data.txt",names=['label', 'theme', 'URL', 'content'],encoding='UTF-8') new_data = new_data.dropna() #删除数据集中的缺失值 #提取我们需要的文本数据 content = new_data["content"].values.tolist() #对文本数据进行分词 content_S = [] for text in content: cut_content = jieba.lcut(text) if len(cut_content) > 1 and cut_content != '\r\n': content_S.append(cut_content) #删除停用词 stopwords = pd.read_csv("./data/stopwords.txt",sep='t', quoting = 3, names = ["stopwords"], encoding='UTF-8') stopwords = stopwords.stopwords.values.tolist() #该方法用于删除停用词 def drop_stopwords(contents, stopwords): content_clearn = [] for line in contents: line_clearn = [] for word in line: if word in stopwords: continue line_clearn.append(word) content_clearn.append(line_clearn) return content_clearn content_clearn = drop_stopwords(content_S, stopwords)
上面我们已经把我们的文本数据处理完了,接下来我们把处理好的文本写入文件
一定要养成把处理过的数据集写入文件的习惯,不然每次重新运行太浪费时间了。f = open("./data/text.txt","w",encoding="UTF-8") for line in content_clearn: for word in line: f.write(word + ' ') f.close()
二、模型训练
这里用到的模型是word2vec,使用之前建议去了解一下这个模型的底层原理,这里奉上用到的模型参数.
参数 作用 sg=0 使用CBOW size 向量维度 window windowsize min_count=5 最小出现次数 workers 训练次数 再次强烈建议使用模型之前一定要了解它的原理,不然你连参数都调不明白
from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence import logging logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) def tarin_function(): new_data = open('./data/text.txt', "r",encoding='UTF-8') #r 只读 model = Word2Vec(LineSentence(new_data),sg=0, size=192, window=5, min_count=5, workers=9) model.save('new_data.word2vec') #训练完模型记得保存,不会吧 不会真的有人训练完不保存吧 if __name__ == '__main__': tarin_function()
三、利用词向量计算词语之间的相似度
这里我们用我们刚才训练好的模型分别计算了 销售 与 促销 和香蕉的相似度,之后又找出了10个跟"销售"相似度最大的词
#计算词与词之间的相似度 import gensim.models from gensim.models import Word2Vec model = gensim.models.Word2Vec.load("new_data.word2vec") print(model.similarity("销售","促销")) #0.80 print(model.similarity("销售","香蕉")) #0.46 #与销售最相近的十个词 word = "销售" if word in model.wv.index2word: print(model.most_similar(word))
这里要特别说明一下,最好选测试数据集中存在的词语,因为这个数据集太小了,根本就不足以处理之外的问题,训练出好的词向量需要非常庞大的数据集,由于本人电脑实在拉跨,维基百科的数据集跑不下来,所以就选用了这个数据集,有条件的,最好用更庞大的数据集,这里奉上维基百科中文网页的数据集地址:
https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2用这个数据集训练之前记得处理一下数据集
啊对了 我这里有处理过的可以直接拿来训练模型的数据集,下载链接如下:
数据集:https://pan.baidu.com/s/1hTkj0i9iZCYljvfDWiMbug 提取码:9yvm
(要不是我电脑算力不够,我就直接把我跑好的模型也传上来。。。。。。)
希望算力雄厚的你能帮我跑一下四、利用训练好的word2vec计算新闻之间的相似度
首先说一下wodrd2vec计算文章相似度的流程
- 提取关键词
- 关键词向量化
- 计算关键词之间的相似度
这里选用的数据是两条财经类的新闻,和一条汽车类的新闻。 首先分别提取这三条新闻的关键词
from jieba import analyse #提取句子的关键词 def keyword_extract(data, file_name): tfidf = analyse.extract_tags keywords = tfidf(data) return keywords #将文档中的每句话进行关键词提取 def getKeywords(docpath, savepath): with open(docpath, 'r',encoding='UTF-8') as docf, open(savepath, 'w',encoding='UTF-8') as outf: for data in docf: data = data[:len(data)-1] keywords = keyword_extract(data, savepath) for word in keywords: outf.write(word + ' ') outf.write('\n')
方法写好了,接下来我们提取新闻中的关键词
if __name__ == '__main__': new1 = './data/new1.txt' new2 = './data/new2.txt' new3 = './data/new3.txt' new1_keywords = './data/new1_keywords.txt' new2_keywords = './data/new2_keywords.txt' new3_keywords = './data/new3_keywords.txt' getKeywords(new1, new1_keywords) # 返回new1的关键词 getKeywords(new2, new2_keywords) # 返回new2的关键词 getKeywords(new3, new3_keywords) # 返回new3的关键词
关键词提取完了,接下来就是求关键词对应的词向量了,这里我选的新闻本身就是训练集里的,所以它的词向量我们的都已经训练出来了,不必担心找不到。(竟然有人拿训练集里的数据测试模型,不会吧,不会吧,这不是测试了个寂寞么)还是建议有条件的把那个维基百科的数据集跑出来,然后用一些数据集里没有数据来测试。
import codecs import numpy import gensim import numpy as np from keyword_extract import * wordvec_size=192 def get_char_pos(string,char): chPos=[] try: chPos=list(((pos) for pos,val in enumerate(string) if(val == char))) except: pass return chPos #从text文件中读取关键词,利用之前训练好的词向量获取关键词的词向量 def word2vec(file_name,model): with codecs.open(file_name, 'r',encoding='UTF-8') as f: word_vec_all = numpy.zeros(wordvec_size) for data in f: space_pos = get_char_pos(data, ' ') first_word=data[0:space_pos[0]] if model.__contains__(first_word): word_vec_all= word_vec_all+model[first_word] for i in range(len(space_pos) - 1): word = data[space_pos[i]:space_pos[i + 1]] if model.__contains__(word): word_vec_all = word_vec_all+model[word] return word_vec_all #通过余弦相似度计算两个向量之间的相似度 def simlarityCalu(vector1,vector2): vector1Mod=np.sqrt(vector1.dot(vector1)) vector2Mod=np.sqrt(vector2.dot(vector2)) if vector2Mod!=0 and vector1Mod!=0: simlarity=(vector1.dot(vector2))/(vector1Mod*vector2Mod) else: simlarity=0 return simlarity
接下来进行测试
if __name__ == '__main__': model = gensim.models.Word2Vec.load('new_data.word2vec') new1_keywords = './data/new1_keywords.txt' new2_keywords = './data/new2_keywords.txt' new3_keywords = './data/new3_keywords.txt' new1_vec=word2vec(new1_keywords,model) new2_vec=word2vec(new2_keywords,model) new3_vec=word2vec(new3_keywords,model) print(simlarityCalu(new1_vec,new2_vec)) #0.98 print(simlarityCalu(new1_vec,new3_vec)) #0.56
这里计算出这两条财经新闻的相似度是0.98,而第一条财经新闻与汽车新闻的相似度只有0.56
参考:《Python自然语言处理实战核心技术与算法》作者 刘祥,刘树春 涂铭
-
Python Word2vec训练医学短文本字/词向量实例实现,Word2vec训练字向量,Word2vec训练词向量,Word2vec训练...
2022-04-02 13:11:14Python Word2vec训练医学短文本字/词向量实例实现,Word2vec训练字向量,Word2vec训练词向量,Word2vec训练保存与加载模型,Word2vec基础一、Word2vec概念
(1)Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。
(2)一般分为CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型。CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量;Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。
CBOW
Skip-Gram模型
(3)CBOW(Continuous Bag-of-Words)
CBOW的训练模型如图所示:
1 )输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
2 )所有onehot分别乘以共享的输入权重矩阵W. {VN矩阵,N为自己设定的数,初始化权重矩阵W}
3 )所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1N.
4) 乘以输出权重矩阵W' {NV}
5 )得到向量 {1V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词}
6 )概率最大的index所指示的单词为预测出的中间词(target word)与true label的onehot做比较,误差越小越好(根据误差更新权重矩阵)(4)Skip-Gram
从直观上理解,Skip-Gram是给定input word来预测上下文。接下来我们来看看如何训练我们的神经网络。假如我们有一个句子“The dog barked at the mailman”。首先我们选句子中间的一个词作为我们的输入词,例如我们选取“dog”作为input word;有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input word在内)就是['The', 'dog','barked', 'at']。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('dog', 'barked'),('dog', 'the')。
二、word2vec词向量和字向量训练实例:
1、word2vec词向量训练依赖的包:gensim
2、直接安装:
pip install gensim
清华镜像源安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gensim
3、加载gensim,并训练模型,pandas为数据预处理,numpy转化为array
from gensim.models import Word2Vec import pandas as pd import numpy as np
训练词向量过程model=Word2Vec(sentences,sg=1,size=100,window=5,min_count=5,negative=3,sample=0.001,hs=1,workers=4)
参数配置详情:
(1)sentences 第一个参数是预处理后的训练语料库,是可迭代列表,但是对于较大的语料库,可以直接从磁盘/网络传输句子迭代。
(2)sg=1是skip-gram算法,对于低频词敏感;默认sg=0为CBOW算法
(3)size(int) 是输出词向量的维数默认值是100,。这个维度的取值和我们的语料库大小有关,比如小于100M的文本语料库,则使用默认值就可以。如果是超大语料库,建议增大维度。值太小会导致词映射因为冲突而导致影响结果,值太大则会耗内存并使计算变慢,一般取值为100到200之间,不过见的比较多的也有300的维度
(4)window(int) 是一个句子中当前单词和预测单词之间的最大距离,window越大,则和某一较远的词也会产生上下文关系。默认值为5。window值越大所需要枚举的预测词越多,计算时间越长。
(5)min_count 忽略所有频率低于此值的但单词,默认值是5.
(6)workers表示训练词向量时使用的进程数,默认是但当前运行机器的处理器核数。
还有关于采样和学习率的,一般不常设置:
(1)negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值是 1e-3。
(2)hs=1 表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被使用。df_01 = pd.read_excel('临床体征.xlsx')#加载数据 df_01.head()
我在这里训练的是医学短文本,有两种训练方式,一种是训练字向量,另一种训练词向量:
4、先看训练字向量,训练的都是excel表内第三列数据,转化为一维矩阵
list_ = list(set(df_01.value.to_list())) array_ = np.array(list_).reshape(14156,)#转化为一维矩阵 array_
训练模型
model_dis = Word2Vec(array_,min_count=1,negative=4,sample=0.001,hs=1,workers=4) #保存模型 model_dis.save('disease.model')
当前目录生成如下文件:
加载训练好的模型:
#加载模型 model_ = Word2Vec.load("disease.model") #查看相应字向量 vector= model_['汗'] print(vector)
5、训练词向量:注意转化为二维矩阵
list_ = list(set(df_01.value.to_list())) array_ = np.array(list_).reshape(14156,1)#转化为二维矩阵 array_
model_dis = Word2Vec(array_,min_count=1,negative=4,sample=0.001,hs=1,workers=4) #保存 model_dis.save('disease_01.model') #加载 model_ = Word2Vec.load("disease_01.model") #查询词向量 vector_01= model_['患侧额部无汗'] print(vector_01)
总结:以上是word2vec短文本训练字/词向量的简单实现,本次实验主要针对医学文本,其实最有效的训练是词向量训练+字向量训练,就是在一个list里面既有词又有字,这个就需要应用jieba分词工具把每一个长词进行切词+1-gram切分,这样最有效,能够弥补医学语料的缺乏,没有之一!!!
后续的功能后面再讲,大家下期再见。
-
在python下实现word2vec词向量训练与加载实例
2020-09-16 17:31:42主要介绍了在python下实现word2vec词向量训练与加载实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
word2vec词向量训练及中文文本相似度计算
2021-01-27 16:13:34PS:第一部分主要是给大家引入基础内容作铺垫,这类文章很多,希望大家自己去学习更多更好的基础内容,这篇博客主要是介绍Word2Vec对中文文本的用法。统计语言模型的一般形式是给定已知的一组词, -
gensim.word2vec 训练词向量
2020-10-31 10:38:04一、训练词向量 # 导入必要的包 import jieba import numpy as np import pandas as pd from gensim.models.word2vec import Word2Vec import joblib from sklearn.svm import SVC # 读取两个类别的语料 pos = pd....一、训练词向量
# 导入必要的包 import jieba import numpy as np import pandas as pd from gensim.models.word2vec import Word2Vec import joblib from sklearn.svm import SVC # 读取两个类别的语料 pos = pd.read_csv('weather_pos.txt', encoding='UTF-8', header=None) neg = pd.read_csv('weather_neg.txt', encoding='UTF-8', header=None) # 进行分词处理 pos['words'] = pos[0].apply(lambda x: jieba.lcut(x)) neg['words'] = neg[0].apply(lambda x: jieba.lcut(x)) # 将正负语料进行合并成训练语料然后并打上标签,正语料打上标签1,负语料打上标签0 x = np.concatenate((pos['words'], neg['words'])) y = np.concatenate((np.ones(len(pos)), np.zeros(len(neg)))) # 训练词向量128维 word2vec = Word2Vec(x, size=128, window=3, min_count=5, sg=1, hs=1, iter=10, workers=25) word2vec.save('word2vec.model')
二、使用词向量
- 加载词向量
word2vec_model = Word2Vec.load('word2vec.model')
- 将所有词的词向量保存
word2vec_model .wv.save_word2vec_format('word2vec.txt', binary=False)
- 获取某个词的词向量
word2vec_model .wv['温度']
- 获取某个词的相似词
word2vec_model .most_similar('天气')
-
word2vec中文词向量
2019-09-28 20:54:44使用gensim对维基百科作为预训练语料(约1.6G语料),生成词汇量约13000个词汇,维度为300,文件大小为45.6MB。使用方法,参考博客:https://blog.csdn.net/qq_36426650/article/details/87738919 -
dataSet_word2vec训练词向量
2018-06-19 09:35:15word2vec训练词向量,word2vec训练词向量,word2vec训练词向量 -
word2vec训练词向量的转换过程
2020-12-11 16:48:17word2vec训练词向量的转换过程CBOW为例第一步:把每个字用one-hot的形式表示出来第二步:初始化左边的权重。作用是分别得到向量V(代表一个单词),做法是利用输入的单词的onehot向量X和W相乘第三步:将得到的三个... -
word2vec中文词向量.zip
2019-12-03 15:22:41使用gensim对维基百科作为预训练语料(约1.6G语料),生成词汇量约13000个词汇,维度为300,文件大小为45.6MB。使用方法,参考博客:https://blog.csdn.net/qq_36426650/article/details/87738919 -
基于word2vec训练词向量(一)
2018-04-11 23:27:11上次说到了通过DNN模型训练词获得词向量,这次来讲解下如何用word2vec训练词获取词向量。 回顾下之前所说的DNN训练词向量的模型: DNN模型中我们使用CBOW或者Skip-gram模式结合随机梯度下降,这样每次都只是取训... -
Word2vec实例收藏——关于别人用word2vec训练词向量的流程收集
2019-11-22 12:35:21IF-IDF统计—jieba分词—Word2Vec模型训练使用 训练中文语料库 中文语料 用gensim实现word2vec 和 glove python训练work2vec词向量(python gensim -
利用Word2Vec训练词向量过程
2017-02-11 02:05:40先明确一点,选用不同的词向量作为模型的初始值,效果的差异非常大!那么怎么产生一个好的词...2、但是中文就不行了,没有一个公布一个权威的词向量。所以,当我们自己做试验时,就需要动手训练这个语义空间的词向量 -
word2vec训练词向量前期处理-中文分词等
2021-02-05 01:17:071.选择语料库这个是我项目私人的语料库具体操作方法就是把所有要处理的文字放到一个文件里,标点符号什么的可以等在分词的时候逐行处理,反正要逐行分词~如图:只能窥探一角~2.分词处理分词工具我选择的是jieba... -
word2vec训练词向量
2018-03-20 10:02:10输入是分词之后的文本输出是词向量./word2vec -train tlbb.seg -output tlbb.seg.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 0 -
中文的word2vec词向量
2018-05-05 18:12:38个人训练的一套word2vec中文词向量。维度为200维。python装gensim后可以直接用! -
Word2Vec词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】
2022-02-10 11:52:44一、前言 ...在开始本文前,首先说下本文使用的gensim版本为3.8.3(使用gensim的word2vec方法训练词向量),为确保进行本文所有流程,请与本文gensim版本一致,避免发生版本问题!本文也将会介绍藏文w... -
【NLP】基于python的gensim word2vec训练词向量
2016-10-12 17:18:37model.save('/model/word2vec_model') new_model=gensim.models.Word2Vec.load('/model/word2vec_model') 也可以获取每个词的词向量 model['computer'] 总结 训练词向量时传入的两个参数也对训练效果有很大影响,... -
基于中文对话文本使用Word2Vec进行训练得到的词向量
2020-12-27 11:24:51基于中文对话文本使用Word2Vec进行训练得到的词向量 -
word2vec训练中文词向量
2018-09-26 16:27:45良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,这里简单介绍词向量的训练,主要是记录学习模型和词向量的保存及一些函数用法。 一、搜狐新闻 1. ... -
词向量模型(word2vec)总结笔记
2021-01-07 01:43:38引言 自从Mikolov在他2013年的论文“Efficient Estimation of Word Representation in Vector ...相较于传统NLP的高维、稀疏的表示法(One-hot Representation),Word2Vec训练出的词向量是低维、稠密的。 在上一篇文章里 -
word2vec词向量训练及中文文本相似度计算 【源码+语料】
2016-02-18 00:57:18该资源主要参考我的博客:word2vec词向量训练及中文文本相似度计算 http://blog.csdn.net/eastmount/article/details/50637476 其中包括C语言的Word2vec源代码(从官网下载),自定义爬取的三大百科(百度百科、互动... -
基于word2vec的中文词向量训练
2019-02-20 10:38:30基于word2vec的中文词向量训练 一、引言 在绝大多数的自然语言处理任务中,语料是无法直接用来特征提取,需要将其转化为计算机可以读取的数值,因此引入独热编码,即对于语料库中为每一个词汇设置编号。在大语料... -
python gensim使用word2vec词向量处理中文语料的方法
2020-12-26 07:12:14word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够... 词向量:用Distributed Representation表示词,通常也被称为“Word Representation”或“Word Embedding -
【基础算法】word2vec词向量
2020-11-21 16:32:32而基于这两种模型结构,word2vec作者又提出了两种改进方法,用来提升模型训练速度,因此,word2vec可细分为四种模型: 1). 基于Hierarchical Softmax的CBOW模型 2). 基于Hierarchical Softmax的skip-Gram模型 -
Word2Vec中文词向量
2022-02-22 22:21:54word2vec中文词向量中文词向量训练模型保存模型导入 中文词向量训练 from gensim.models import Word2Vec sentences = ["被告人 段 某 酒后 与 其 妻子 王1 某 一起 准备 回 家 , 走 到 鸡飞乡 澡塘街 富达 通讯 ...