gensim:用Word2Vec进行文本分析
文本分析我写过一期gensim库的,今天我想实现下word2vec,进行一些词语相似性分析。
参数解释
参数 | 含义 |
---|---|
sentences | 形如[a,b,c...],且abc也是列表。这里输入的是一个文档数据(文档有很多句子),数据中abc相当于文档中的每个句子分词生成的列表 |
size | 每个词语对应的向量有size个元素组成,即size个维度 |
window | 窗口长度 |
min_count | 词语在语料中出现的最少次数,少于这个数值,忽略该词 |
workers | cpu数目 |
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