当我们尝试使用统计机器学习方法解决文本的有关问题时,第一个需要的解决的问题是,如果在计算机中表示出一个文本样本。一种经典而且被广泛运用的文本表示方法,即向量空间模型(VSM),俗称“词袋模型”。

我们首先看一下向量空间模型如何表示一个文本:

空间向量模型需要一个“字典”:文本的样本集中特征词集合,这个字典可以在样本集中产生,也可以从外部导入,上图中的字典是[baseball, specs, graphics,..., space, quicktime, computer]。

有了字典后便可以表示出某个文本。先定义一个与字典长度相同的向量,向量中的每个位置对应字典中的相应位置的单词,比如字典中的第一个单词baseball,对应向量中的第一个位置。然后遍历这个文本,对应文本中的出现某个单词,在向量中的对应位置,填入“某个值”。

实际上填入的“某个值”,就是当前特征词的权重(Term Weight),目前特征词的权重主要有以下四种:

  • Bool(presence)

表示某个单词是否在某个文档中出现,如果出现则记为1,否定则记为0。

  • Term frequency(TF)

表示某个单词在文本中出现的次数(上图中使用的权重),一个文本中,某个特征词出现的愈多,可能其在样本中的贡献越大。

  • Inverse document frequency(IDF)

document frequency表示特征词在数据集中出现的文档频率。某个词文档频率越低,相应的这些文档,越容易被捕获。

  • TF-IDF

TF-IDF则综合了上面两种特征权重的性质。

有关于“教育”的文档中,“高校”、“学生”等词出现的频率很高,而在“体育”类的文档中,“比赛”, “选手”出现的频率比很高。采用TF权重,这些特征词有着较高权重是合理的(Term frequency)。但是,某些词如“这些”,“是”, “的”,也有着较高的词频,但是重要度显然没有,“高校”、“学生”、“比赛”, “选手”来得重要。但“这些”,“是”, “的”这些词IDF往往比较低,很好的弥补了TF的缺陷。因此TF-IDF权重,在传统的文本分类,信息检索领域有着非常广泛的运用。

尽管TF-IDF权重有着非常广泛的应用,并不是所有的文本权重采用TF-IDF都会有较好的性能。比如,情感分类(Sentiment Classification)问题上,采用BOOL型的权重往往有较好的性能(Sentiment Classification的很多论文都采用BOOL型权重)。

现在,我们回到文章开头提高的向量空间模型。基于向量空间模型表示方法,每个特征词之间相互独立。由于这种表示简单的特点,在开始之初,推动了文本分类相关研究工作,但是随着时间的推移,传统的向量空间模型由于丢弃了词序、句法和部分语义信息,往往限制了某些领域的发展(如Sentiment Classification),成为影响性能的瓶颈。目前的解决思路有:

  • 使用N-Gram语法特征
  • 将语法语义信息考虑到分类任务中
  • 模型上改进...

最后,介绍一下sklearn中的文本的表示方法,并以此实现一个简单的文本分类。

我们使用的数据集是  movie_reviews 语料(情感分类器任务)。数据集的组织方式是,一个文本存放在文件下,标签相同的文件放在同一个文件夹下。其数据集的结构如下:

movie_reviews\

pos\

cv000_29590.txt,    cv001_18431.txt...cv999_13106.txt

neg\

cv000_29416.txt,   cv001_19502.txt, cv999_14636.txt

在sklearn中,sklearn.datasets.load_files,可以很好的加载这种结构的数据集,数据加载完成后,就可以利用前面介绍的VSM,将文本样本表示出来。

sklearn专门提供了文本特征的提取模块: sklearn.feature_extraction.text ,完成将一个文本样本变成一个词袋。CountVectorizer对应词频权重或是BOOL型权重(通过参数binary调节)向量空间模型, TfidfVectorizer提供了Tfidf权重下的向量空间模型。sklearn为他们提供了大量的参数(所有参数也都提供了默认参数),具有很高的灵活性和实用性。

在movie_reviews语料上,基于 sklearn 文本表示方法,并使用Multinomial Naive Bayes分类器进行情感分类的代码如下:

#!/usr/bin/env python
# coding=gbk import os
import sys import numpy as np
from sklearn.datasets import load_files
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB def text_classifly(dataset_dir_name):
#加载数据集,切分数据集80%训练,20%测试
movie_reviews = load_files(dataset_dir_name)
doc_terms_train, doc_terms_test, doc_class_train, doc_class_test = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.2) #BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口
count_vec = CountVectorizer(binary = True)
doc_train_bool = count_vec.fit_transform(doc_terms_train)
doc_test_bool = count_vec.transform(doc_terms_test) #调用MultinomialNB分类器
clf = MultinomialNB().fit(doc_train_bool, doc_class_train)
doc_class_predicted = clf.predict(doc_test_bool) print 'Accuracy: ', np.mean(doc_class_predicted == doc_class_test) if __name__ == '__main__':
dataset_dir_name = sys.argv[1]
text_classifly(dataset_dir_name)

文本分类之特征描述vsm和bow的更多相关文章

  1. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  2. 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践

    https://zhuanlan.zhihu.com/p/25928551 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类 ...

  3. [转] 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践

    转自知乎上看到的一篇很棒的文章:用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文 ...

  4. NLP学习(2)----文本分类模型

    实战:https://github.com/jiangxinyang227/NLP-Project 一.简介: 1.传统的文本分类方法:[人工特征工程+浅层分类模型] (1)文本预处理: ①(中文) ...

  5. 文本分类学习(六) AdaBoost和SVM

    直接从特征提取,跳到了BoostSVM,是因为自己一直在写程序,分析垃圾文本,和思考文本分类用于识别垃圾文本的短处.自己学习文本分类就是为了识别垃圾文本. 中间的博客待自己研究透彻后再补上吧. 因为获 ...

  6. 文本分类学习 (十)构造机器学习Libsvm 的C# wrapper(调用c/c++动态链接库)

    前言: 对于SVM的了解,看前辈写的博客加上读论文对于SVM的皮毛知识总算有点了解,比如线性分类器,和求凸二次规划中用到的高等数学知识.然而SVM最核心的地方应该在于核函数和求关于α函数的极值的方法: ...

  7. pyhanlp文本分类与情感分析

    语料库 本文语料库特指文本分类语料库,对应IDataSet接口.而文本分类语料库包含两个概念:文档和类目.一个文档只属于一个类目,一个类目可能含有多个文档.比如搜狗文本分类语料库迷你版.zip,下载前 ...

  8. 一个简单文本分类任务-EM算法-R语言

    一.问题介绍 概率分布模型中,有时只含有可观测变量,如单硬币投掷模型,对于每个测试样例,硬币最终是正面还是反面是可以观测的.而有时还含有不可观测变量,如三硬币投掷模型.问题这样描述,首先投掷硬币A,如 ...

  9. 文本分类需要CNN?No!fastText完美解决你的需求(后篇)

    http://blog.csdn.net/weixin_36604953/article/details/78324834 想必通过前一篇的介绍,各位小主已经对word2vec以及CBOW和Skip- ...

随机推荐

  1. Tomcat启动后访问首页报错 显示JSP 空指针异常

    HTTP Status 500 - type Exception report message description The server encountered an internal error ...

  2. Win8-64位安装OpenSSL详细过程

    相关软件: 1.ActivePerl 5.22.1 : http://www.activestate.com/activeperl/downloads 2.Microsoft visual_studi ...

  3. 语言基础:C#输入输出与数据类型及其转换

    今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...

  4. 今日思考:MVC系列框架之Struts存在的意义是什么?

    Struts其实就是MVC的代名词,那么提到MVC就不得不提早期的ModelⅠ.那时候JSP页面中混杂了大量的JAVA Scriptlet脚本语句,为了可维护性考虑,有人提出了ModelⅡ,也即现在的 ...

  5. CodeForces Round #290 Fox And Dinner

    而是Div2的最后一题,当时打比赛的时候还不会最大流.自己能够把它写出来然后1A还是很开心的. 题意: 有n个不小于2的整数,现在要把他们分成若干个圈.在每个圈中,数字的个数不少于3个,而且相邻的两个 ...

  6. jfinal框架教程-学习笔记(一)

    JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所有优势 ...

  7. POJ 1523 SPF (割点,连通分量)

    题意:给出一个网络(不一定连通),求所有的割点,以及割点可以切分出多少个连通分量. 思路:很多种情况. (1)如果给的图已经不是连通图,直接“  No SPF nodes”. (2)求所有割点应该不难 ...

  8. CentOS SVN服务器安装配置小记

    SVN的安装 安装很简单,尤其对于CentOS这种,直接: # yum install subversion# yum install mod_dav_svn 不同发行版的Package安装方法参见h ...

  9. 使用val()另一个妙用------选中select/checkbox/radio的值

    一直认为val()方法只有两个功能:1.能设置元素的值,2.获取元素的值.知道val()方法还有另外一个妙用,就是它能使select(下拉列表框).checkbox(多选框)和radio(单选框)相应 ...

  10. Metaspace 之一--java8 去掉 perm 用 Metaspace 来替代

    正如大家所知,JDK 8 Early Access版已经提供下载.这使开发者可以体验Java8的新特性.其中之一,是Oracle从JDK7发布以来就一直宣称的要完全移除永久代空间.例如,字符串内部池, ...