本文为大家共享了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输出的比较混乱。我这里做了一个表格如下:

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

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文本特征抽取与向量化算法学习相关推荐

  1. python数据获取与文本分析_python文本分析之处理和理解文本

    前言: 在进行自然语言的建模(NLP)时,我们通常难以处理文字类型的数据,因此在常见的机器学习项目中,数据的格式是结构化的,就算在视觉处理的时候也是一个矩阵或者高维张量的形式.那么文字类型的数据我们应 ...

  2. python kmeans聚类_python机器学习之k-means聚类算法(1)

    k-means算法是一种无监督的机器学习算法,虽然是机器学习,但它简单易于实现.本篇采用python语言,自主编程实现k-menas算法,当然python用专门的库函数来实现该算法,但本次主要使用该算 ...

  3. python单词反转_python文本 字符串逐字符反转以及逐单词反转

    python文本 字符串逐字符反转以及逐单词反转 场景: 字符串逐字符反转以及逐单词反转 首先来看字符串逐字符反转,由于python提供了非常有用的切片,所以只需要一句就可以搞定了 >>& ...

  4. python文本发音_Python文本转化语音模块大比拼,看看青铜与王者的差别!

    自从开始公众号写作,作息问题就成了一件让人很头大的事情,相对平时学习时间的基础上,每天需要再多抽出来至少两个小时进行公众号写作,这些时间只能从睡眠中挤出来.别人研究怎么碎片化学习,我现在每天盘算的是怎 ...

  5. python关键词统计_Python文本处理2个小案例(文本嗅探与关键词占比统计)

    问题描述:有一些句子和一些关键词,现在想找出包含至少一个关键词的那些句子(文本嗅探),可以参考print('='*30)之前的代码.如果想进一步计算每个句子中的关键词占比(句子中所有关键词长度之和/句 ...

  6. python文本聚类_python 文本聚类算法

    三体下载 将下载的文件重命名为santi.txt,放在文件的目录下 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ...

  7. python数据清洗实例_Python文本清洗案例分析:直播弹幕数据清洗

    任务需求 清洗json格式的弹幕数据(以"聆听丶芒果鱼直播间时间切片弹幕.json"为例),具体要求如下: 提取出所有弹幕类型(列表中的第1个元素)为"NM"的 ...

  8. python免费入门_python入门 2018最新最全学习资料免费获取啦

    是否非常想学好 Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓? 幸运的是,Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间 ...

  9. python的热潮_python为何掀起了全民入门学习的热潮?

    原标题:python为何掀起了全民入门学习的热潮? 目前人工智能正处于发展红利时期,准备学习的小伙伴不要错过,可能有人会说Python是一种计算机语言,具有简洁性.易读性.及可扩展性,相对于其他语言学 ...

最新文章

  1. 浅谈学前教育与计算机,浅谈学前教育专业计算机教学改革与实践.doc
  2. 在html中引用css样式表,怎么引用css样式?
  3. iangularjs 模板_在AngularJS中使用内联模板
  4. 如何在 Flutter 和 Dart 中检查数字字符串
  5. 五、PHP框架Laravel学习笔记——回退、当前路由、单行为
  6. python 第三方登录_【Python web 开发】social_django 集成第三方登录
  7. ES面试基础知识要点
  8. 程序员与产品经理大打出手,公司的处理结果让所有人都笑开了花
  9. 将excel中的数据导入到oracle数据库中
  10. Mail_Android_Video_SW_DDK_Intergration_Guide_And_Codec_User_Manual中文翻译【chapter1】
  11. 高精度NTC测温的硬件电路以及软件设计
  12. 微型计算机的中央处理器由什么组成,中央处理器由什么组成?
  13. 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值5钱,一只母鸡值3钱,三只小鸡值1钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
  14. 安装和配置zabbix-5.0.20
  15. windows磁盘引导分区
  16. 推荐系统三十六式——学习笔记(三)
  17. android设置不锁屏adb,如何通过ADB锁定Android屏幕?
  18. 在MATLAB中调用 Python
  19. Oracle Start With的用法
  20. MATLAB实现利用图像深度信息合成不同浓度的雾【Cityscapes_foggy数据集】

热门文章

  1. C++学习笔记4[循环语句]
  2. wxWidgets:wxColourDatabase类用法
  3. boost::units模块实现带有转换的用户定义单位的测试程序
  4. boost::spirit模块实现逗号分隔的数字列表的解析器的测试程序
  5. boost::histogram::axis::transform用法的测试程序
  6. boost::graph_as_tree用法的测试程序
  7. boost::gil::matrix3x2用法的测试程序
  8. boost::contract模块实现非成员函数的测试程序
  9. boost::contract模块实现check宏的测试程序
  10. Boost:bimap双图的突变关系的测试程序