1.gensim的介绍
gensim是nlp常用的包,能根据tf-idf,LDA,LSI等模型转化成向量模式,以便进一步处理,此外还实现了word2vec的功能,能够将单词转化为词向量。
gensim包常用模块corpora:一种格式或约定,转化为二维矩阵,我这里用了此模块下的WikiCorpus 获取xml文件的原始数据
model:此模块下包括各种常用方法,不多说,一会代码会有
2.文本向量化算法
该算法包括当下最刘翔的两种算法,一个是word2vec,另一个是doc2vec
首先我们先说一下word2vec
2.1词向量的训练
词向量的训练包括两部分,首先是中文语料预处理,再就是利用gensim模块训练词向量
先是中文预料预处理
from gensim.corpora import WikiCorpus #使用gensim模块中的WikiCorpus从bz2中获取原始文本数据
import jieba
def myfunction():
space = ' '
i = 0
l = []
zhwiki_name = ''
f = open('','w')
wiki = WikiCorpus(zhwiki_name,lemmatize=False,dictionary={}) # xml文件中当初的训练语料
for text in wiki.get_texts():
for temp_sentence in text:
temp_sentence =Converter('zh-hans').convert(temp_sentence) #将语料中的繁体字转换为简体
seg_list = list(jieba.cut(temp_sentence)) #利用jieba分词
for temp_term in seg_list:
l.append(temp_term)
f.write(space.join(l) + '\n')
l = []
i = i+1
if(i %200 == 0):
print("saved" + str(i)+"articles")
f.close()
if __name__ == '__main__':
myfunction()
然后是训练词向量,直接调用word2vec
直接调用这个方法建立词向量模型公知醒了三个步骤:
1.建立一个空的模型对象 model=gebsim.models.Word2Vec()
2.遍历一次语料库建立词典 model.build_vocab(sentences)
3.第二次遍历语料库建立神经网络模型 model.train(sentences)
# -*- coding: utf-8 -*-
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
def my_function():
wiki_news = open('','r')
model = Word2Vec(LineSentence(wiki_news),sg=0,size=192,window=5,min_count=5,workers=9)
model.save('zhiwiki_news.word2vec')
if __name__ == '__main__':
my_function()
在这说一下model.Word2Vec的各个参数:
1) sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。后面我们会有从文件读出的例子。
2) size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
3) window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为cc,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。
4) sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。
5) hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
6) negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。
7) cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xwxw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xwxw,默认值也是1,不推荐修改默认值。
8) min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
9) iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
10) alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为ηη,默认是0.025。
11) min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。
最后是将训练得到的词向量模型做应用
一般可以做三类应用1.找出某一个词向量语义最相近的词;2.计算两个词语的相似度;3.是找出不同类的词
import gensim
def my_function():
model = gensim.models.Word2Vec.load('')
print(model.similarity('西红柿','番茄'))
print(model.wv.similarity('西红柿','番茄'))
print(model.similarity('西红柿','土豆'))
word = '中国'
if word in model.wv.index2word:
print(model.most_similar(word))
# model.wv.similarity()
# model.similarity
# model.most_similar
if __name__ == '__main__':
my_function()
2.2 段落向量的训练
段落向量的训练分为训练数据处理和段落向量训练两个步骤。这里我们使用TaggedWikiDocument来预处理数据,这里不用将每个文档都分词,而是直接将转换后的简体文本保留
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gensim.models as g
from gensim.corpora import WikiCorpus
import logging
from langconv import *
#enable logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
docvec_size=192
class TaggedWikiDocument(object):
def __init__(self, wiki):
self.wiki = wiki
self.wiki.metadata = True
def __iter__(self):
import jieba
for content, (page_id, title) in self.wiki.get_texts():
yield g.doc2vec.LabeledSentence(words=[w for c in content for w in jieba.cut(Converter('zh-hans').convert(c))], tags=[title])
def my_function():
zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'
wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})
documents = TaggedWikiDocument(wiki)
model = g.Doc2Vec(documents, dm=0, dbow_words=1, size=docvec_size, window=8, min_count=19, iter=5, workers=8)
model.save('data/zhiwiki_news.doc2vec')
if __name__ == '__main__':
my_function()