文本分类之特征描述vsm和bow

当我们尝试使用统计机器学习方法解决文本的有关问题时,第一个需要的解决的问题是,如果在计算机中表示出一个文本样本。一种经典而且被广泛运用的文本表示方法,即向量空间模型(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)
时间: 2024-12-13 15:01:41

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

记一个文本分类系统的实现

基于信息检索课程,完成实现了一个文本分类系统,现记录一下整个实现过程. 文本分类以文本数据为分类对象,本质上是机器学习方法在信息检索领域的一种应用,可以继承机器学习领域的很多概念和方法,但同时也需要结合信息检索领域的特点进行处理.主要研究的方向是:文本分词方法.文本特征提取方法.分类算法. 本人主要使用了5种常用的分类算法,分别是kNN.Rocchio.NBC.SVM和ANN,对每种算法的结果进行了比较,使用了十折交叉验证绘制了各自的准确率曲线.由于本系统基于的搜狗语料库,是中文文本,因此使用的

文本分类入门(番外篇)特征选择与特征权重计算的区别

http://www.blogjava.net/zhenandaci/archive/2009/04/19/266388.html 在文本分类的过程中,特征(也可以简单的理解为“词”)从人类能够理解的形式转换为计算机能够理解的形式时,实际上经过了两步骤的量化——特征选择阶段的重要程度量化和将具体文本转化为向量时的特征权重量化.初次接触文本分类的人很容易混淆这两个步骤使用的方法和各自的目的,因而我经常听到读者有类似“如何使用TFIDF做特征选择”或者“卡方检验量化权重后每篇文章都一样”等等困惑.

文本分类之情感分析– 去除低信息量的特征

当你的分类模型有数百个或数千个特征,由于是文本分类的情况下,许多(如果不是大多数)的特点是低信息量的,这是一个不错的选择.这些特征对所有类都是通用的,因此在分类过程中作出很小贡献.个别是无害的,但汇总的话,低信息量的特征会降低性能. 通过消除噪声数据给你的模型清晰度,这样就去除了低信息量特征.它可以把你从过拟合和维数灾难中救出来.当你只使用更高的信息特征,可以提高性能,同时也降低了模型的大小,从而导致伴随着更快的训练和分类的是,使用更少的内存的大小.删除特征似乎直觉错了,但请等你看到结果. 高信

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

上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的向量.这样每个文本在分词之后,就可以根据我们之前得到的词袋,构造成一个向量,词袋中有多少个词,那这个向量就是多少维度的了.然后就把这些向量交给计算机去计算,而不再需要文本啦.而向量中的数字表示的是每个词所代表的权重.代表这个词对文本类型的影响程度. 在这个过程中我们需要解决两个问题:1.如何计算出适

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

转自https://zhuanlan.zhihu.com/p/25928551 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类领域特别是应用深度学习解决文本分类的相关的思路.做法和部分实践的经验. 业务问题描述: 淘宝商品的一个典型的例子见下图,图中商品的标题是"夏装雪纺条纹短袖t恤女春半袖衣服夏天中长款大码胖mm显瘦上衣夏".淘宝网后台是通过树形的多层的类目体系管理商品的,覆盖叶子类目数量达上万个,商品量也

统计学习方法文本分类

一个文本分类问题就是将一篇文档归入预先定义的几个类别中的一个或几个,而文本的自动分类则是使用计算机程序来实现这样的分类.通俗点说,就好比你拿一篇文章,问计算机这文章要说的究竟是体育,经济还是教育,计算机答不上,说明计算机弱爆了就打它的屁屁. 注意这个定义当中着重强调的两个事实. 第一,用于分类所需要的类别体系是预先确定的.例如新浪新闻的分类体系,Yahoo!网页导航的分类层次.这种分类层次一旦确定,在相当长的时间内都是不可变的,或者即使要变更,也要付出相当大的代价(基本不亚于推倒并重建一个分类系

机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用

摘要: 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类.总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型:当各特征相关性较小时,朴素贝叶斯分类性能最为良好.另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算.本文详述了朴素贝叶斯分类的统计学

多种贝叶斯模型构建文本分类

多种贝叶斯模型构建及文本分类的实现 作者:白宁超 2015年9月29日11:10:02 摘要:当前数据挖掘技术使用最为广泛的莫过于文本挖掘领域,包括领域本体构建.短文本实体抽取以及代码的语义级构件方法研究.常用的数据挖掘功能包括分类.聚类.预测和关联四大模型.本文针对四大模型之一的分类进行讨论.分类算法包括回归.决策树.支持向量机.贝叶斯等,显然,不少涉及机器学习的知识(随后会写些机器学习专题).本文重点介绍贝叶斯分类,涉及朴素贝叶斯模型.二项独立模型.多项模型.混合模型等知识.在本人研究贝叶斯

文本分类实战

文本分类实战 分类任务 算法流程 数据标注 特征抽取 特征选择 分类器 训练与评估 坑 分词 特征重要度 有偏训练集 模型大小优化 One More Thing… term 扩展 Distributed Representation 分类任务 其实工程上对于文本分类的需求还是挺多的,主要可以分为下面两类,并对每类给了两个例子. 二分类   色情新闻分类 这是一个非平衡数据集的二分类问题,因为色情新闻数是远小于非色情新闻数的.   判断是否医疗Query 这个就关系到搜索变现了,还记得莆田系”事件