利用word2vec训练词向量

article/2025/9/21 17:00:23

利用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:continueline_clearn.append(word)content_clearn.append(line_clearn)return  content_clearncontent_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向量维度
windowwindowsize
min_count=5最小出现次数
workers线程数
epoch训练次数

再次强烈建议使用模型之前一定要了解它的原理,不然你连参数都调不明白

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import logginglogging.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 Word2Vecmodel = 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))

这里要特别说明一下,最好选测试数据集中存在的词语,因为这个数据集太小了,训练出来的词向量效果很差,训练出好的词向量需要非常庞大的数据集,由于本人电脑实在拉跨(MX150了解一下),维基百科的数据集跑不下来,所以就选用了这个数据集,有条件的,最好用更庞大的数据集,这里奉上维基百科中文网页的数据集地址:
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_tagskeywords = 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:passreturn 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=0return 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.98print(simlarityCalu(new1_vec,new3_vec)) #0.56

这里计算出这两条财经新闻的相似度是0.98,而第一条财经新闻与汽车新闻的相似度只有0.56

参考:《Python自然语言处理实战核心技术与算法》作者 刘祥,刘树春 涂铭


http://chatgpt.dhexx.cn/article/cU1IqGOc.shtml

相关文章

词向量(WordVector)

词向量(WordVector) 时间: 2015-06-12 22:01:12 阅读: 2120 评论: 0 收藏: 0 [点我收藏] 标签: Reference:http://licstar.net/archives/328 (比较综合的词向量研究现状分…

词向量表示方法及其语义相关性

关键字: 文档 句子 词语 单词 上下文单词 上下文窗口 向量 相似性 类比性 欧几距离 余弦距离 余弦相似度 相似度阀值 归于此类 创建新的类别 词向量 --- word2vec、glove 相似度 --- 欧几距离、余弦距离 聚类 --- kmeans 、词向量 是指将词转化成为稠密向量&…

词向量表示和句向量、文章向量计算方法

本文介绍一种计算句向量和文章向量的方法及参考代码,自然语言处理的第一步即是要进行文本的向量化,包括获得词向量,句向量或者文章向量,以便输入各种机器学习模型或者深度学习模型。 词向量 可以笼统的认为词向量是文本向量的基…

词袋模型和词向量模型

在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型。更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外的处理。…

中文词向量的训练

最近在做毕设,需要对中文进行向量化表示,现有的最全中文词向量预训练向量有:最全中文词向量 part 1:以上链接中的词向量介绍: 格式 预先训练好的向量文件是文本格式。每行包含一个单词和它的向量。每个值由空格分隔。第一行记录…

如何训练一个词向量

现在在NLP领域,词向量是一切自然语言处理的基础,有了词向量我们就可以进行数据分析,文本聚类分类的一系列操作了。接下来我们就开始学习如何训练词向量,之前我们有介绍关于 word2vec 的博文 word2vec算法理解和数学推导&#xff0…

词向量训练

词向量训练 一、 实验目的 掌握课堂所讲词向量的基本概念和训练方法。加强对pytorch、tensorflow等深度学习框架的使用能力。 二、 实验要求 任选课上讲的一种词向量模型进行实现即可,如是其他模型则请写明模型结构,作业压缩文件中也提供给大家相关的…

语言模型+词向量

文章目录 统计语言模型神经语言模型词向量(浅层) 统计语言模型 语言模型基本概念 弗莱德里克贾里尼克提出用数学的方法描述语言规律(语言模型) 语言模型基本思想: 用句子 S w 1 , w 2 , . . . , w n Sw_{1},w_{2},..…

学习笔记:深度学习(5)——词向量的相关概念

学习时间:2022.04.21 自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机…

深度学习之词向量

一、词向量 自上世纪90年代开始,特征空间模型就应用于分布式语言理解中,在当时许多模型用连续性的表征来表示词语,包括潜在语义分析LSA、隐含狄利克雷分布LDA主题模型。Bengio et al.在2003年首先提出了词向量的概念,当时是将其与…

自然语言处理——使用词向量(腾讯词向量)

向量化是使用一套统一的标准打分,比如填写表格:年龄、性别、性格、学历、经验、资产列表,并逐项打分,分数范围[-1,1],用一套分值代表一个人,就叫作向量化,虽然不能代表全部,但至少是…

词向量Word2Vec(深度细致分析)

本文以博客园刘建平Pinard对于word2vec的解释为基础,同时参考了其他相关博客的分析并加入了自己的理解,希望站在巨人的肩膀上进行一定的学习输出。至于本片文章的属性,个人认为是伪原创吧,有需要的同学可以自行转到相应的链接。 w…

一、词向量模型

因为计算机不能理解词语,所以我们需要用词向量表示一个词。 词向量有一个发展历程:从one-hot到word embedding。 1 one-hot 设词典的大小为n(词典中有n个词),假如某个词在词典中的位置为k,则设立一个n维向…

词向量算法

https://www.cnblogs.com/the-wolf-sky/articles/10192363.html https://blog.csdn.net/weixin_37947156/article/details/83146141 基于神经网络的表示一般称为词向量、词嵌入(word embdding)或分布式表示。 神经网络的词向量和其他分布式类似,都基于分布式表达…

词向量(Word Embedding)

一、词的表示 在自然语言处理任务中,首先需要考虑词如何在计算机中表示。通常,有两种表示方式:one-hot representation和distribution representation。简而言之,词向量技术是将词转化成为稠密向量,并且对于相似的词&…

二、词向量

目录 一、什么是词向量 二、词向量的离散表示 1、one-hot编码 2、 Bag of Words表示 3、TF-IDF表示 4、 Bi-gram和N-gram 5、离散表示的问题: 三、词的分布式表示(Distributed representation) 1、Skip-Gram模型 2、代码 一、什么是…

【NLP】词向量

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

第四章(1):词向量定义与意义

第四章(1):词向量定义与意义 目录 第四章(1):词向量定义与意义前言1. 词的表示1.1 离散表示1.1.1 One-Hot独热编码1.1.2 ngram特征表示1.2 分布式表示2. 意义前言 在自然语言处理的领域中,每个单词都可以被表示为一个向量,这些向量叫做“词向量”。换句话说,每个单词…

什么是词向量?(NPL入门)

什么是词向量? 我们组实训选择的主题是与自然语言识别相关的,那么就不得不学习和了解一下自然语言识别中非常重要和基础的。于是我对于自己对词向量的学习进行了以下的总结。 简而言之,词向量技术是将词转化成为稠密向量,并且对…

词向量表示

目录 1、语言表示 1.1、分布假说 1.2、语言模型 2、词向量表示 2.1、词向量表示之one-hot 2.2、词带模型之 (Bag of Words) 2.3、词的分布式表示 2.3.1 基于矩阵的分布式表示 2.3.2 基于聚类的分布式表示 2.4基于神经网络的分布式表示 2.4.1、…