查看原文
其他

gensim:用Word2Vec进行文本分析

2017-10-06 大邓 大邓带你玩python

文本分析我写过一期gensim库的,今天我想实现下word2vec,进行一些词语相似性分析。

用gensim库做文本相似性分析

参数解释

参数含义
sentences形如[a,b,c...],且abc也是列表。这里输入的是一个文档数据(文档有很多句子),数据中abc相当于文档中的每个句子分词生成的列表
size每个词语对应的向量有size个元素组成,即size个维度
window窗口长度
min_count词语在语料中出现的最少次数,少于这个数值,忽略该词
workerscpu数目
from gensim.models import Word2Vec

#sentences参数为列表,且a,b, c也是列表。
model = Word2Vec(sentences=[a,b,c...],                 size=200,                 window=10,                 min_count=10,                 workers=4)

文本数据处理

这里我使用的语料是小说三体,首先我要将文本转化为列表Sentences,Sentences中含有分词后生成的列表。

在这里我为了省事,直接用正则剔除了除中文以外的所有字符,也就不是以句号断句。全部以行读入数据,相当于每行就是一个独立的句子。

为了降低对内存的消耗,这里我们使用iter,告诉Word2Vec输入的数据是可迭代的对象,使用生成器会大大降低内存消耗,所以这里我们返回的是生成器而不是列表(近似将生成器等同于列表)。

import jieba
import re

class MySentence(object):    def __init__(self,filename):        self.filename = filename    

   def __iter__(self):        lines = open(self.filename,'r',encoding='utf-8').readlines()        for line in lines:            #用正则剔除了除中文以外的所有字符            ChineseSentence = ''.join(re.findall(r'[\u4e00-\u9fa5]', line))                        #jieba.cut生成的是生成器,这里要转换为列表            wordlist = list(jieba.cut(ChineseSentence))                        yield wordlist

训练并生成模型

好了,现在开始导入数据,生成我们的模型。

#处理数据
MySentences = MySentence(filename=r'/Users/suosuo/Desktop/gensim学习/三体全集.txt')

#训练模型
model = Word2Vec(sentences=MySentences,                 size=200,                 window=10,                 min_count=10,                 #我的电脑是4个cpu                 workers=4)


#保存模型                
model.wv.save_word2vec_format(fname=r'/Users/suosuo/Desktop/gensim学习/model/santi_word2vec_binary.bin',binary=True)

导入模型

到这里我们已经将三体小说语料转化为word2vec模型。现在我们尝试做一些有意思的事情。我们在同一文件夹下,另外新建一个py文件。使用下面方法,导入训练好的模型。

from gensim.models import KeyedVectors
#导入模型 model = KeyedVectors.load_word2vec_format(r'/Users/suosuo/Desktop/gensim学习/model/santi_word2vec_binary.bin', binary=True)

使用模型

一、语料中的词语数

print(len(model.vocab))

4663

二、相似性

#计算两个词语的相似性(这里有点类似于共现性,出现在一起的概率)
print(model.similarity('智子','面壁计划'))
print(model.similarity('智子','三体'))

词语相似性

0.979347427218 0.848213543316

三、查看词向量

print(model['智子'])

词向量(这里是size长度的向量)

[ 0.02596524 -0.58146703  0.2551643  -0.11980443  0.05224045  0.52335924  0.28106797  0.19156754  0.12423556 -0.290573   -0.11983433 -0.20253746 ....... 0.25172633 -0.08110124  0.11124857 -0.57409805  0.08624712 -0.01513417  0.22165927  0.05142394  0.12320817 -0.32751641  0.1595141   0.39632329  0.06477572 -0.00696412]

四、找出气质不合的词语

将词语列表输入给doesnt_match函数,用来计算词语列表中与其他词语相似度最低的词语,相当于一个群体中的另类对象。

print(model.doesnt_match(['科学边界','基础物理','智子锁死','太空军']))

返回

太空军

看过三体小说的人都知道,智子锁死了人类的科学探索能力,使得人类应用科技在发展,但是基础科学毫无进展可言。会使得人类最终达到的科技水平是有天花板的。

所以当我在 科学便捷、基础物理、智子锁死几个比较接近的词中加入 太空军。model就计算出不合群的词是太空军。


五、近义词最相似的词语

找出跟 智子、三体 的 近义词最相似的10个词,

print(model.most_similar(positive=['智子','三体'], topn=10))

返回

[('建立', 0.9844928979873657), ('社会', 0.9788711667060852), ('基础', 0.9769335985183716), ('发展', 0.9769187569618225), ('战略', 0.976719319820404), ('力量', 0.9755910634994507), ('打击', 0.9754586815834045), ('目前', 0.9719493985176086), ('成为', 0.9698376655578613), ('生命', 0.9668488502502441)]

六、反义词中最相似的词

print(model.most_similar(negative=['智子','三体'], topn=10))

三体小说中,智子的对手是罗辑。我们看到反义词结果中出现了罗辑。

[('汪淼', 0.38320186734199524), ('着', 0.38044700026512146), ('地', 0.3708333969116211), ('程心', 0.36895543336868286), ('罗辑', 0.36442938446998596), ('看着', 0.34719690680503845), ('看', 0.33883702754974365), ('又', 0.337078332901001), ('起来', 0.2994344234466553), ('他', 0.2886667847633362)]

七、positive和negative可以一起用

print(model.most_similar(positive=['面壁计划'],negative=['智子','三体'], topn=10))

三体小说中,面壁计划是为对付三体文明(智子是三体人),而罗辑就是人类面壁计划所选择的面壁者。

从下面分析结果中,我们看到了罗辑,还是有一定的分析能力。

[('汪淼', 0.5990270972251892), ('看', 0.5883820056915283), ('罗辑', 0.5783265829086304), ('程心', 0.5780940651893616), ('地', 0.5771546363830566), ('看着', 0.567058801651001), ('又', 0.561230480670929), ('着', 0.5542294979095459), ('走', 0.5372697114944458), ('起来', 0.5181437730789185)]


可乐一下


数据及源代码

链接: https://pan.baidu.com/s/1bpFAEOf 密码: 3us3

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存