概述
基于分词+停用词处理使用Gensim实现Word2Vec
导读
Genism是一个开源的Python库,可便捷高效地提取文档中的语义话题,关于word2vec,首先需要明白它并不是一个模型或者算法,它是描述从自然语言到词向量转换的一种技术。 Word2Vec本质上就是一个全连接神经网络,在给定文本中获取对应的输入层和输出层,在模型训练过程中不断修正参数,最后得到词向量。它将所有的词向量化,使词与词可以定量的去分析它们之间的关系。在Word2Vec模型中,主要有Skip-gram和CBOW两种模型,直观上理解,Skip-gram是用一个词语作为输入,来预测它周围的上下文。而CBOW是用一个词语的上下文作为输入,来预测这个词本身。本文用Gensim实现Word2Vec的skip-gram模型。
一、准备环境
Anaconda3
二、导入库
import jieba #用于分词处理
import pandas as pd #pandas提供了pd.read_csv()方法可以读取其中的数据并且转换成DataFrame数据帧
import gensim
from gensim.models import word2vec,Word2Vec
import multiprocessing
三、分词+停用词处理
定义一个函数,将分词和去停用词合并处理
参数raw在下文主函数中,在这里说明一下,raw为本次程序导入的csv文件
raw=pd.read_csv('科技.csv',names=['content'],sep='aaa',encoding='GBK')
1、首先导入停用词表,将这一列命名为‘w’,后续方便调用
2、定义一个空列表word_list用于接收每一行分词、去停用词后剩下的词语(本文选取前300行数据分析)
3、w_list用来接收前300行所有词语,转入一个列表
def t_words(raw):
stopwords = pd.read_csv('停用词.txt', names=['w'], sep='aaa', encoding='utf-8')
word_list = []
w_list=[]
for i in range(0,300):
word_list = [w for w in jieba.cut(str(result[i])) if w not in list(stopwords.w)] #收集的是每一行剔除停用词后剩下的词
b = ' '.join(word_list) #列表转化为字符串拼在一起
#print(b)
w_list.append(b) #列表
#print(wlist)
return w_list
四、将分词结果导入txt文件中
这里注意要去除‘[’和‘]‘这两个符号,应用replac()函数
for i in range(len(w_list)):
s = str(w_list[i]).replace('[','').replace(']','')#去除‘[’和‘]’,这两行按数据不同,可以选择
s = s.replace("'",'').replace(',','') +'n' #去除单引号,逗号,每行末尾追加换行符
file.write(s)
file.close()
五、用预处理的语料库训练模型
根据下面一句代码可生成一个模型,括号里的参数说明如下
model =Word2Vec(sentences, size=100, min_count=5, window=10, sg=1, workers=multiprocessing.cpu_count())
在gensim中,word2vec 相关的API都在包gensim.models.word2vec中,和算法有关的参数都在类gensim.models.word2vec.Word2Vec中,下面说明几个此次算法中需要注意的参数:
- sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。
- size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是较小的语料,则使用默认值一般就可以了。如果是数据量大的语料,建议增大维度。
- window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小,对于一般的语料这个值推荐在[5,10]之间。
- sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是skip-gram模型,默认是0即CBOW模型,本次应用skip-gram模型。
- hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
- min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
将模型保存后即可分词词与词之间的关系,本文取“科研”“科技”两个词。
n_dim=300
#LineSentence用于处理分行分词语料
sentences = word2vec.LineSentence('C:\Users\Dell\Desktop\11\分词结果.txt')#加载语料
#sg:用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
model =Word2Vec(sentences, size=100, min_count=5, window=10, sg=1, workers=multiprocessing.cpu_count())
model.save("test_01.model")#保存模型
model.wv.save_word2vec_format('test_01.model.txt','test_01.vocab.txt',binary=True) #将模型保存成文本
##计算某个词的相关词列表前十个
for word in model.wv.most_similar("研发", topn=10):
print(word)
for word in model.wv.most_similar("科技", topn=10):
print(word)
结果如下:
六、加载模型,验证模型
# 计算两个词的相似度/相关程度
role1 = ['网络','卫星','通信']
role2 = ['网络','互联网']
results= [(x,y) for x in role1 for y in role2]
print(results)
for result in results:
print("[%s]和[%s]的相似度为:" % (result[0],result[1]), model.wv.similarity(result[0], result[1])) # 预测相似性
结果如下:
最后
以上就是糊涂月饼为你收集整理的基于分词+停用词处理使用Gensim实现Word2Vec导读一、准备环境二、导入库三、分词+停用词处理四、将分词结果导入txt文件中五、用预处理的语料库训练模型六、加载模型,验证模型的全部内容,希望文章能够帮你解决基于分词+停用词处理使用Gensim实现Word2Vec导读一、准备环境二、导入库三、分词+停用词处理四、将分词结果导入txt文件中五、用预处理的语料库训练模型六、加载模型,验证模型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复