基于word2vec的短文本分析---开玩笑,分析什么,只是刚入门的自己的一些感受

来源:互联网 发布:淘宝客cms源码 编辑:程序博客网 时间:2024/05/17 03:33

  ps:本文只作为是自己在学习的道路上的一个记录意义

        文本分析,特别是中文文本分析,为什么会这么有难度,因为以前没办法将文字量化。没办法量化,就没办法给计算机识别,那就没办法自动化分析。(题外话:刚好在听书,猫腻的《将夜》,“符道就是让天地元气知道我们想要干什么”,和这里的意思异曲同工哈)

       但好消息是,现在能够把文字量化了。这里把文字分为三个粒度,文章,句子,词语。那将文字量化的手段,其实也是可以分三个的,不过根据我目前的了解,主要是针对文章和词语的量化,本文说的Word2vec就是针对词语的量化。那接下来就说说几种常见的词语量化手段。

      one-hot编码:就是做一个文档-词语矩阵(如下),当文档中有这个词,则对应位置为1,若没有这个词,则对应位置为0。但这种向量化的问题很明显,当文章的词语很多的时候,可能会有维度灾难,而且矩阵太过稀疏,另外这种方法脱离了语义(semantic),也就是 这种编码体现不出词语和词语之间,词语和文章之间的关系。

 今天是七月的一天文档100101文档211010文档310001文档四00110

     BOW(bag of words):相当于把整个文档集合一起来统计,创建一个词典,然后给每个词创建一个index,这样每篇文章,就变成了 某个词:出现次数 这样的表现了。但这样的表现还是有一定的问题,仍然忽略了词序、语义等因素。

   接下来就说word2vec了。Word2vec 跟上面的方法一样,是将一个词变成一个向量的方法。但这里想要生成的向量,第一,是能够体现出语义的,第二,是固定维度的。下面贴一个比较经典的图,说明这个word2vec生成的词向量,是体现出语义的。


  实现word2vec主要有两个模型,一个是CBOW,一个室SKIP-GRAM。CBOW是根据某个词的上下文,推测出这个出现的概率。而SKIP-GRAM就相反,是根据某个词,推测出它的上下文。但这个说法只是很笼统,两个模型还是有很深奥的理论知识,本人还在摸索。下面说说如何实现这个Word2vec。

  这里用到了gensim包,python的话可以直接pip install gensim。因为我就是这样装的而且也没遇到什么问题,这里就不说了。当然这个word2vec的实现还可以利用神经网络,这里我也还在尝试。

  实现的流程大概如下:数据收集-----分词以及去掉停用词-----利用模型训练-----得到Word2vec输出-------进行简单分析

  数据收集:因为还不太会爬虫,所以得到的数据是现成的,是来一些微博,数据量大概是 百万级级的。

  分词以及去掉停用词:这里利用到了结巴分词。

# -*- coding: utf-8 -*-import jiebaimport pandasimport osimport sysreload(sys)sys.setdefaultencoding('utf8')sys.dont_write_bytecode = Truestopwords = pandas.read_csv(    "stopword.txt",    encoding='utf8',    index_col=False)fr = open('data.txt')corpor = []i = 0lines = fr.readlines()for line in lines:    text = line.split('\t')[6]    segs = jieba.cut(text)    string = []    i = i + 1    for seg in segs:        if seg not in stopwords.stopword.values and len(seg.strip())>0:             string.append(seg)    corpor.append(string)f=open('demo.txt','w')for i in corpor:    k=' '.join([str(j) for j in i])    f.write(k+"\n")f.close()
  到最后的输出,就是每行代表一个文章,每个文章都被分为一个个用空格间隔的词语。如下:

 [有生之年 我 最 喜欢 的 up 主 跟 我 的 三体 勾搭 到 一起 了 幸福感 爆棚 黑桐 谷歌]

  然后这个文档就直接可以输入到gensim的模型里面的,这里的代码是参考了http://blog.imaou.com/opensource/2015/08/31/how_to_train_word2vec.html 这篇文章的,具体的代码我就不方便贴出来了,大家可以直接到这里去看.

 模型训练出来之后,会以一个Word2vec为后缀的文档出现。可以利用model.Word2vec.load(fname)的方法导入到python中。然后就可以利用model中的函数进行分析了,如Word2vec.wv[u'微博']可以查看这个词向量的具体数值,most_similar(positive=[u'银行'],topn=50)可以查看于这个词向量相近的词语。得出效果如下:
[(u'金融机构', 0.7204301953315735),
 (u'工行', 0.6933443546295166),
 (u'贷款', 0.6927849054336548),
 (u'商业银行', 0.6907452344894409),
 (u'支付', 0.6881821751594543),
 (u'开户', 0.6866061687469482),
 (u'信用卡', 0.6864449381828308),
 (u'交通银行', 0.6839807033538818),
 (u'工商银行', 0.6823513507843018),
 (u'信托', 0.6745952367782593),
 (u'建行', 0.6735872030258179),
 (u'农行', 0.6734776496887207),
 (u'邮政储蓄', 0.6718761920928955),
 (u'微众', 0.666603684425354),
 (u'股份制', 0.6622452735900879),
 (u'网上银行', 0.6608501672744751),
 (u'放贷', 0.6597179770469666),
 (u'证券', 0.6578166484832764),
 (u'建设银行', 0.6559270620346069),
 (u'分行', 0.6537438631057739)]

  因为我拿到的数据并没有针对某一个领域或者某一个类型,所以得出的结果并不是最好的。但如果拿到的数据是针对某一方面的,得到的结果就会有趣很多了。具体的应用这里再推荐大家一个资料。http://www.infoq.com/cn/presentations/application-exploration-of-bank-text-mining-technology/

  本文到这里就结束了,因为是个人第一篇的博客,记录自己的一些学习心得和感受,希望对大家有一点帮助。不正确的地方也请多多指正,谢谢各位!






原创粉丝点击