基于分词+停用词处理使用Gensim实现Word2Vec

基于分词+停用词处理使用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中,下面说明几个此次算法中需要注意的参数:

  1. sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。
  2. size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是较小的语料,则使用默认值一般就可以了。如果是数据量大的语料,建议增大维度。
  3. window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小,对于一般的语料这个值推荐在[5,10]之间。
  4. sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是skip-gram模型,默认是0即CBOW模型,本次应用skip-gram模型。
  5. hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
  6. 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)

结果如下:

在这里插入图片描述
在这里插入图片描述

扫描二维码关注公众号,回复: 11947389 查看本文章

六、加载模型,验证模型

# 计算两个词的相似度/相关程度
    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])) # 预测相似性

结果如下:
在这里插入图片描述





猜你喜欢

转载自blog.csdn.net/weixin_44985023/article/details/108816401