Python文本特征抽取与向量化算法学习


Posted in Python onDecember 22, 2017

本文为大家分享了Python文本特征抽取与向量化的具体代码,供大家参考,具体内容如下

假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”(negative)呢?

这类问题就属于情感分析问题。这类问题处理的第一步,就是将文本转换为特征。

因此,这章我们只学习第一步,如何从文本中抽取特征,并将其向量化。

由于中文的处理涉及到分词问题,本文用一个简单的例子来说明如何使用Python的机器学习库,对英文进行特征提取。

1、数据准备

Python的sklearn.datasets支持从目录读取所有分类好的文本。不过目录必须按照一个文件夹一个标签名的规则放好。比如本文使用的数据集共有2个标签,一个为“net”,一个为“pos”,每个目录下面有6个文本文件。目录如下所示:

neg
    1.txt
    2.txt
    ......
pos
    1.txt
    2.txt
    ....

12个文件的内容汇总起来如下所示:

neg: 
  shit. 
  waste my money. 
  waste of money. 
  sb movie. 
  waste of time. 
  a shit movie. 
pos: 
  nb! nb movie! 
  nb! 
  worth my money. 
  I love this movie! 
  a nb movie. 
  worth it!

2、文本特征

如何从这些英文中抽取情感态度而进行分类呢?

最直观的做法就是抽取单词。通常认为,很多关键词能够反映说话者的态度。比如上面这个简单的数据集,很容易发现,凡是说了“shit”的,就一定属于neg类。

当然,上面数据集是为了方便描述而简单设计的。现实中一个词经常会有穆棱两可的态度。但是仍然有理由相信,某个单词在neg类中出现的越多,那么他表示neg态度的概率越大。
同样我们注意到有些单词对情感分类是毫无意义的。比如上述数据中的“of”,“I”之类的单词。这类词有个名字,叫“Stop_Word”(停用词)。这类词是可以完全忽略掉不做统计的。显然忽略掉这些词,词频记录的存储空间能够得到优化,而且构建速度也更快。
把每个单词的词频作为重要的特征也存在一个问题。比如上述数据中的”movie“,在12个样本中出现了5次,但是出现正反两边次数差不多,没有什么区分度。而”worth“出现了2次,但却只出现在pos类中,显然更具有强烈的刚晴色彩,即区分度很高。

因此,我们需要引入TF-IDF(Term Frequency-Inverse Document Frequency,词频和逆向文件频率)对每个单词做进一步考量。

TF(词频)的计算很简单,就是针对一个文件t,某个单词Nt 出现在该文档中的频率。比如文档“I love this movie”,单词“love”的TF为1/4。如果去掉停用词“I"和”it“,则为1/2。

IDF(逆向文件频率)的意义是,对于某个单词t,凡是出现了该单词的文档数Dt,占了全部测试文档D的比例,再求自然对数。
比如单词“movie“一共出现了5次,而文档总数为12,因此IDF为ln(5/12)。
很显然,IDF是为了凸显那种出现的少,但是占有强烈感情色彩的词语。比如“movie”这样的词的IDF=ln(12/5)=0.88,远小于“love”的IDF=ln(12/1)=2.48。

TF-IDF就是把二者简单的乘在一起即可。这样,求出每个文档中,每个单词的TF-IDF,就是我们提取得到的文本特征值。

3、向量化

有了上述基础,就能够将文档向量化了。我们先看代码,再来分析向量化的意义:

# -*- coding: utf-8 -*- 
import scipy as sp 
import numpy as np 
from sklearn.datasets import load_files 
from sklearn.cross_validation import train_test_split 
from sklearn.feature_extraction.text import TfidfVectorizer 
 
'''''加载数据集,切分数据集80%训练,20%测试''' 
movie_reviews = load_files('endata')  
doc_terms_train, doc_terms_test, y_train, y_test\ 
  = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) 
   
'''''BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口''' 
count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ 
              stop_words = 'english') 
x_train = count_vec.fit_transform(doc_terms_train) 
x_test = count_vec.transform(doc_terms_test) 
x    = count_vec.transform(movie_reviews.data) 
y    = movie_reviews.target 
print(doc_terms_train) 
print(count_vec.get_feature_names()) 
print(x_train.toarray()) 
print(movie_reviews.target)

运行结果如下:
[b'waste of time.', b'a shit movie.', b'a nb movie.', b'I love this movie!', b'shit.', b'worth my money.', b'sb movie.', b'worth it!']
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0.          0.          0.          0.          0.          0.   0.70710678  0.70710678  0.        ]
 [ 0.          0.          0.60335753  0.          0.          0.79747081   0.          0.          0.        ]
 [ 0.          0.          0.53550237  0.84453372  0.          0.          0.   0.          0.        ]
 [ 0.84453372  0.          0.53550237  0.          0.          0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          1.          0.   0.          0.        ]
 [ 0.          0.76642984  0.          0.          0.          0.          0.   0.          0.64232803]
 [ 0.          0.          0.53550237  0.          0.84453372  0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.          0.   0.          1.        ]]
[1 1 0 1 0 1 0 1 1 0 0 0]

python输出的比较混乱。我这里做了一个表格如下:

Python文本特征抽取与向量化算法学习

从上表可以发现如下几点:

1、停用词的过滤。

初始化count_vec的时候,我们在count_vec构造时传递了stop_words = 'english',表示使用默认的英文停用词。可以使用count_vec.get_stop_words()查看TfidfVectorizer内置的所有停用词。当然,在这里可以传递你自己的停用词list(比如这里的“movie”)

2、TF-IDF的计算。

这里词频的计算使用的是sklearn的TfidfVectorizer。这个类继承于CountVectorizer,在后者基本的词频统计基础上增加了如TF-IDF之类的功能。
我们会发现这里计算的结果跟我们之前计算不太一样。因为这里count_vec构造时默认传递了max_df=1,因此TF-IDF都做了规格化处理,以便将所有值约束在[0,1]之间。

3、count_vec.fit_transform的结果是一个巨大的矩阵。我们可以看到上表中有大量的0,因此sklearn在内部实现上使用了稀疏矩阵。本例子数据较小。如果读者有兴趣,可以试试机器学习科研工作者使用的真实数据,来自康奈尔大学:http://www.cs.cornell.edu/people/pabo/movie-review-data/。这个网站提供了很多数据集,其中有几个2M左右的数据库,正反例700个左右。这样的数据规模也不算大,1分钟内还是可以跑完的,建议大家试一试。不过要注意这些数据集可能存在非法字符问题。所以在构造count_vec时,传入了decode_error = 'ignore',以忽略这些非法字符。

上表的结果,就是训练8个样本的8个特征的一个结果。这个结果就可以使用各种分类算法进行分类了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
python3安装crypto出错及解决方法
Jul 30 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
Python实现把类当做字典来访问
Dec 16 Python
tornado+celery的简单使用详解
Dec 21 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
再谈python_tkinter弹出对话框创建
Mar 20 Python
用Python实现KNN分类算法
Dec 22 #Python
Python数据拟合与广义线性回归算法学习
Dec 22 #Python
python 动态加载的实现方法
Dec 22 #Python
Python决策树分类算法学习
Dec 22 #Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 #Python
Python2.7下安装Scrapy框架步骤教程
Dec 22 #Python
Python机器学习之决策树算法
Dec 22 #Python
You might like
非常好的php目录导航文件代码
2006/10/09 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
js定时器的使用(实例讲解)
2014/01/06 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
Python实现自动装机功能案例分析
2020/10/22 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
为数据库创建索引都需要注意些什么
2012/07/17 面试题
电气工程和自动化自荐信范文
2013/12/25 职场文书
办公室人员先进事迹
2014/01/27 职场文书
大学生毕业求职信
2014/06/12 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
javascript Number 与 Math对象的介绍
2021/11/17 Javascript