45-文本挖掘:无案牍之劳形
Posted 苏州机器学习互助小组
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了45-文本挖掘:无案牍之劳形相关的知识,希望对你有一定的参考价值。
世界非黑即白吗?大部分逻辑回归是这样的,结果非0即1,或曰“正面”,“负面”。但人就太复杂了,说出来的同一句话,遇上不同听众,得出的结论可能迥异。也是有简单一些的场景,比如电商网站上某商品的评论极性(好评or差评)。遇上这种无需烧脑的情况,对评论文本的分类略显体力,这时正是机器学习大显身手的时候。人的意识是流动的,在这方面机器学习相形见绌,深度学习中的RNN模型可能更加适用。如果能完全模拟人脑的复杂度与多变性,估计耗电量也很惊人了。但星辰般闪耀的梦想还是要有的,不然漫长的永夜会冷呢 。
今天的例子是IMDB电影评论的情感分析(正面评价or负面评价)。
数据可从这下载:http://ai.stanford.edu/~amaas/data/sentiment/
1、准备工作
解压之后,下面代码可将数据读成 Pandas 的 DataFrame:
随机打乱所有评论文本(之前0,1分布太集中,这样挑选一部分作为训练集时可能出现样本标签不平衡的情况,学习出来的模型泛化能力较差):
下面是可选操作:把数据保存为CSV文件,这样下次就不用重新读评论文本文件了。
上面这些只是准备工作,然而基础还远远没有打完,下面继续搬砖。
2、词袋模型
机器学习这样的技术比较喜欢被定义好的固定长度的输入和输出,因此不固定输入输出是文本建模的一个问题。
机器学习算法不能直接处理原始文本,文本必须转换成数字。具体来说,是数字的向量。这被称为特征提取或特征编码。Bag of words(BOW)方法是非常常见的一种文本特征提取方法。在这种方法中,我们查看文本中单词的直方图,即将每个单词的计数作为一个特性。
Bag of words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现。
下面用一个简单的例子在sklearn中调用词袋模型来做文本特征提取:
执行前面的命令,我们看到所有出现过的单词被存储在一个Python字典里,字典的“键”是出现过的单词,“值”是按字母表顺序给这个单词分配的唯一索引。接下来打印我们刚刚创建的特征向量:
3、Bigrams and N-Grams
完全丢弃词序并不总是一个好主意,作为复合短语通常有特定的意义,和修饰词not之类结合往往可以转化词的意义。
一种简单的保留一些词序信息的文本编码方式是n-gram编码。
在计算语言学中,n-gram指的是文本中连续的n个item(item可以是字母、单词、词组等)。n-gram 中如果n=1则为unigram,n=2则为bigram,n=3则为trigram。n>4后,则直接用数字指称,如4-gram,5gram。我们之前学习的正是unigram编码。
举个例子:
original text: "this is how you get ants"
1-gram: "this", "is", "how", "you", "get", "ants"
2-gram: "this is", "is how", "how you", "you get", "get ants"
3-gram: "this is how", "is how you", "how you get", "you get ants"
scikit-learn中的CountVectorizer类允许我们使用不同的n-gram模型,可以通过参数ngram_range指定(默认为1-gram)。
如果指定参数ngram_range=(2,3)的话将会出现下面的情况:
下周学习TF-IDF(term frequency–inverse document frequency),一种文本特征编码的常用加权技术,敬请期待:)
以上是关于45-文本挖掘:无案牍之劳形的主要内容,如果未能解决你的问题,请参考以下文章