基于word2vec的短文本分析---开玩笑,分析什么,只是刚入门的自己的一些感受
来源:互联网 发布:淘宝客cms源码 编辑:程序博客网 时间:2024/05/17 03:33
ps:本文只作为是自己在学习的道路上的一个记录意义
文本分析,特别是中文文本分析,为什么会这么有难度,因为以前没办法将文字量化。没办法量化,就没办法给计算机识别,那就没办法自动化分析。(题外话:刚好在听书,猫腻的《将夜》,“符道就是让天地元气知道我们想要干什么”,和这里的意思异曲同工哈)
但好消息是,现在能够把文字量化了。这里把文字分为三个粒度,文章,句子,词语。那将文字量化的手段,其实也是可以分三个的,不过根据我目前的了解,主要是针对文章和词语的量化,本文说的Word2vec就是针对词语的量化。那接下来就说说几种常见的词语量化手段。
one-hot编码:就是做一个文档-词语矩阵(如下),当文档中有这个词,则对应位置为1,若没有这个词,则对应位置为0。但这种向量化的问题很明显,当文章的词语很多的时候,可能会有维度灾难,而且矩阵太过稀疏,另外这种方法脱离了语义(semantic),也就是 这种编码体现不出词语和词语之间,词语和文章之间的关系。
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/
本文到这里就结束了,因为是个人第一篇的博客,记录自己的一些学习心得和感受,希望对大家有一点帮助。不正确的地方也请多多指正,谢谢各位!
- 基于word2vec的短文本分析---开玩笑,分析什么,只是刚入门的自己的一些感受
- 短文本分析----基于python的TF-IDF特征词标签自动化提取
- 基于word2vec或doc2vec的情感分析
- 短文本情感分析
- 短文本情感分析
- 对做需求分析的一些感受
- 刚进软件公司的一些感受总结
- 只是一些自己关心的
- 短文本分类或lda的分析(ZZ)(转载pennyliang (pennyliang),)
- 基于CNN的短文本分类实验 PPT
- tensorflow的一些代码分析(六) tensorflow实现word2vec
- 【文献笔记】短文本分析
- 写给自己的短文----感谢
- 开玩笑的台风
- Google开源项目word2vec的分析
- Google 开源项目 word2vec 的分析
- PHP短文本匹配的排序算法
- 短文本分类遇到的bug
- Java内存溢出与栈溢出
- HTML&CSS基础篇之九:图像
- yuv420数据格式
- Web 安全 PHP 代码审查之常规漏洞
- HTTP
- 基于word2vec的短文本分析---开玩笑,分析什么,只是刚入门的自己的一些感受
- 查看进程死锁的命令
- 8-spring源码3.2.18解读+spring技术内幕(IOC容器的依赖注入(反射+递归调用))
- 线程池ThreadPool详解
- PHP正则匹配数字中英文及下划线
- 如何更加便捷地在Eclipse上开发GO语言
- [并行计算] 2. OpenMP简介
- B样曲线的绘制代码
- LeetCode