NLP文本化向量常用包gensim之word2vec和doc2vec

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()

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值