当前位置: 首页 > 编程日记 > 正文

文本分类技术基础

分类体系

分类:给定一个对象,从一个事先定义好的分类体系中挑出一个或多个最适合该对象的类别。

文本分类(TC, Text Categorization):在给定的分类体系下,根据文本内容自动的确定文本关联的类别。从数学角度看,文本分类是一个映射的过程,它将未标明类别的文本映射到已有的类别中,该映射可以是一对一或一对多的映射。

f:AB

其中,A表示待分类的文本集合,B表示分类体系中的类别集合。

文本分类属于有监督的学习(Supervised Learning),它的基本步骤如下:

  1. 定义分类体系,即确定具体要分到哪些类。
  2. 将预先分类过的文档作为训练集,对文档做分词、去停用词等准备工作。
  3. 确定表达模型,对文档矩阵进行降维,提取训练集中最有用的特征。
  4. 应用具体的分类模型和分类算法,训练出文本分类器。
  5. 在测试集上测试并评价分类器的性能。
  6. 应用性能最高的分类模型对待分类文档进行分类。

评价指标

准确率和召回率是检索(IR)系统中的概念,也可用来评价分类器性能。

TrueFalse
PositiveAB
NegativeCD
  • 准确率(P, Precision),A/(A+B),在所有被判断为正确的文档中,有多大比例是确实正确的。
  • 召回率(R, Recall),A/(A+C),在所有确实正确的文档中,有多大比例被我们判为正确。
  • F1测度(F-measure),2PR/(P+R),既衡量准确率,也衡量召回率。

准确率和召回率是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下准确率高、召回率就低,召回率低、准确率高,当然如果两者都低,那是什么地方出问题了。

其他一些指标:

  • 漏报率(miss rate) = 1 - recall
  • 准确度(accurarcy) = (A + D)/(A + B + C + D)
  • 错误率(error) = (B+C)/(A+B+C+D) = 1 - accurarcy
  • 虚报率(fallout) = B/(B+D) = false alarm rate
  • F = (β^2 +1)PR/(β^2+R)
  • BEP, Break Event Point, where P=R
  • AUC

表达模型

模型对每篇文档默认构造的向量是固定长度n,该n可能是我们汉语词典收录的词条数目,显然这会导致每个向量里的大部分特征值都是0。这是文本分类的主要特点:高维 和 数据稀疏。所以,降维是开始运用分类算法训练样本之前的一个关键预处理步骤。

降维有两种方法:

  • 特征选择(feature selection),它是对原始特征利用一些评估函数独立评估,按照评估结果高低排序,选择那些评估值较高的特征。常用的特征选择方法有词频信息、互信息、信息增益和卡方检验等
  • 特征抽取(feature detection),它是把原始特征映射到低维空间,这些被称为二次特征 (比如,奇异值分解后得到的lsi),从而生成模型产生的新特征。特征抽取方法比较常用的是lsa、plsa和lda等。

【注意】 特征选择和特征权重值计算是不同的,前者是根据特征对分类的重要程度来实现降维的手段,而后者是用于区分向量,实现分类算法中的相似度判断。它们是两个阶段的不同处理方法。特征权重值最典型的是tf-idf。

特征选择(feature selection)

针对英文纯文本的实验结果表明:作为特征选择方法时,卡方检验和信息增益的效果最佳(相同的分类算法,使用不同的特征选择算法来得到比较结果);文档频率方法的性能同前两者大体相当,术语强度方法性能一般;互信息方法的性能最差。

卡方检验(the χ^2 test)

属于分类c不属于分类c总计
包含特征tABA+B
不包含特征tCDC+D
总计A+CB+DN

卡方检验是通过计算每个特征和每个类别的关联程度,然后选择那些关联程度高的特征来实现降维。其基本思想就是衡量实际值与理论值的偏差来确定理论的正确与否。

χ2(t,c)=N×(ADBC)2(A+C)×(B+D)×(A+B)×(C+D)

其中,t是具体的每个特征(比如词),c是类别号。

信息增益法(information gain)

信息增益是通过计算每个特征对分类贡献的信息量,贡献越大信息增益越大,然后可以选择那些信息增益较高的特征实现降维。

信息熵定义:

H(C)=i=1mP(ci)logP(ci)

其中,ci是类别变量C可能的取值,P(ci)是各个类别出现的概率。

条件熵定义:

H(C|T)=P(t)H(C|t)+P(t¯)H(C|t¯)=P(t)i=1nP(Ci|t)log2P(Ci|t)P(t¯)i=1nP(Ci|t¯)log2P(Ci|t¯)

其中,带t¯的值表示特征t不出现的情况。

特征t给系统带来的信息增益是系统原本的熵与固定特征T后的条件熵之差。

G(t,c)=H(T)H(T|C)

信息增益也是考虑了特征出现和不出现两种情况,与卡方检验一样,是比较全面的,因而效果不错。但信息增益最大的问题还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓“全局”的特征选择(指所有的类都使用相同的特征集合),而无法做“本地”的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重)。

分类模型

在训练阶段,就是利用各种分类算法对转化后的文本向量估计模型。常用的分类算法有朴素贝叶斯、knn、决策树、神经网络和svm等。

一些基本概念:

  • 输入空间 为n维向量的集合 XRn,其中向量 xX, x=(w1,,wn),而 wi 是文档向量x的一个特征,比如,词,或者词和权重的二元组。
  • 输出空间 为类标号集合,可以是二元分类 Y={+1,1},或者多元分类 Y={y1,,ym}
  • 训练数据 为一组根据未知分布 P(x,y) 独立采样(i.i.d)的数据集合,由输入向量与输出类标号对组成D={(x1,y1),,(xl,yl)}

假设 (hypothesis):计算机对训练集背后的真实模型(真实的分类规则)的猜测称为假设。可以把真实的分类规则想像为一个目标函数,我们的假设则是另一个函数,假设函数在所有的训练数据上都得出与真实函数相同(或足够接近)的结果。

监督学习方法可以分为生成方法和判别方法,所学到的模型分别成为生成模型(generative model)和判别模型(discriminative model)。

生成方法由训练数据学习联合概率分布P(X,Y),然后求得条件概率分布P(Y|X)作为预测的模型,即生成模型:

P(Y|X)=P(X,Y)P(X)

这样的方法之所以称作生成模型,是因为模型表示了给定输入X产生输出Y的生成关系。典型的生成模型有:朴素贝叶斯法和隐马尔科夫模型。

判别方法直接学习决策函数f(X)或者条件概率分布P(Y|X)作为预测模型,即判别模型。判别方法关心的是对给定的输入X,应该预测什么样的输出Y。典型的判别模型有:knn、决策树、逻辑回归、EM、SVM、各种boosting算法等等。

朴素贝叶斯

根据条件独立性假设,Y=ck类别的后验概率正比于该类别的先验概率和条件概率的乘积:

P(Y=ck|X=x)=P(Y=ck)P(X=x|Y=ck)P(X=x)P(Y=ck)i=1nP(wi|Y=ck)

根据 极大后验概率假设(MAP, Maximum a posteriori probability hypothesis),使得后验概率P(Y=ck|X=x)最大的那个类别号误差最小。一般避免乘法导致浮点数溢出,可以转换为对数计算,不改变凸函数性质:

y=argmaxckP(Y=ck)i=1nP(wi|Y=ck)=argmaxcklogP(Y=ck)+i=1nlogP(wi|Y=ck)

实际的 参数计算 时会加入Laplace平滑:

P(Y=ck)=N(ck)mi=1N(ci)1+N(ck)|c|+mi=1N(ci)

其中,N(ck)是类别 ck 的文档的总数,|c|是分类总数。

P(wi|Y=ck)=N(wi,ck)nk=1N(wk,ck)1+N(wi,ck)|w|+nk=1N(wk,ck)

其中,N(wi,ck)表示特征词wi在类别ck的文档中出现的次数,|w|表示所有特征词总数。

建立NB分类器有两种方法,上述是多项式模型(Multinomial model),还有一种贝努利模型(Bernoulli model)。贝努利模型属于二值模型,对于每个词只统计是否出现,而不计算其出现次数。多项式模型适合处理长文本,而贝努利模型适合处理短文本。贝努利模型对噪声敏感,所以在使用之前必须要做特征选择。

SVM

对于一组训练数据 {(x1,y1),,(xl,yl)},其中 xRny{+1,1},在线性可分的情况下会有一个超平面,将这两类样本完全分开,并且离超平面最近的向量与超平面之间的距离最大。

f(x)=i=1nwixi+b=wx+b

参考

  • 统计学习方法, 李航, 4. 朴素贝叶斯
  • Introduction to IR, 13. Text classification and Naive Bayes

转载自:http://blog.jqian.net/post/classification.html#content

相关文章:

C# 返回值为 listT

public List<T> test<T>(List<T> EntityList) where T : class{return EntityList;} 转载于:https://www.cnblogs.com/enych/p/10497312.html

ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析

文章目录内存查看内存控制内存控制源码分析通过gperftools接口获取osd进程实际内存 动态设置cache大小动态调整cache比例trim释放内存本文通过对ceph-osd内存查看跟踪的5种手段以及osd内存控制的方式进行源码层面的说明&#xff0c;并未通过修改相关源码进行控制&#xff08;水…

c语言函数库学习~sscanf~格式化输入

---恢复内容开始--- 今天算是被打击到了吧&#xff0c;由郑轻的acm老师来我学院指导安排了个现场的小比赛&#xff0c;&#xff0c;俺们居然有还是输给一个大一的新手&#xff0c;&#xff0c;哎&#xff0c;情何以堪&#xff0c;&#xff0c;所以还是要重视下基础编程能力的培…

java mobile phone games_j2me100-src Java

文件名大小更新时间codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.class8192003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.java5752003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BoxLayoutFrame.class7262003-07-15code…

***突然断开可能是ADSL猫惹的祸

在我们使用服务器的时候&#xff0c;最讨厌的就是无故的断线了&#xff0c;可能正在和好一起副本&#xff0c;或者正在视频热聊中&#xff0c;还或者youtube视频看的正起劲&#xff0c;突然windows一个对话框弹出 - “连接已经断开”。实在是太影响体验了&#xff0c;断开之后&…

文件中数组的最大值及其对应的最小下标

2019年春季学期第二周作业基础作业请在第一周作业的基础上&#xff0c;继续完成&#xff1a;找出给定的文件中数组的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。并将最大值和对应的最小下标数值写入文件。 输入&#xff1a;请建立以自己英文名字命名的txt文…

ceph bluestore源码分析:admin_socket实时获取内存池数据

环境&#xff1a; 版本&#xff1a;ceph 12.2.1 部署完cephfs 使用ceph-fuse挂载&#xff0c;并写入数据 关键参数&#xff1a; debug_mempool true 将该参数置为true即可查看详细的blustore管理的内存池的数据 命令&#xff1a; ceph daemon osd.id dump_mempools该命令为ad…

java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...

通常&#xff0c;当我插入4000个字符限制时&#xff0c;它的工作正常&#xff0c;但当超过4000个字符时&#xff0c;它抛出SQL异常字符串文字太长&#xff0c;即使我的DISCHARGE_TEXT数据类型是CLOB我的JavaScript代码是function saveAsDraftNew(){var admissionNo document.g…

LC并联谐振回路

转载于:https://www.cnblogs.com/prayer521/p/4103091.html

zencart分类页产品页去掉url中的id号

最近公司新上的网站被seo指出要修改url&#xff0c;去掉url中产品id。由于我们用的是zencart框架&#xff0c;装了 Ultimate SEO URLs 插件&#xff0c;所以在网上应该有这方面的资料&#xff0c;本文主要参考资料&#xff1a;原网址&#xff1a;修改seo url中去掉产品id的方法…

hexo博客更新主题后上传Git操作

克隆主题: git clone https://github.com/SuperKieran/TKL.git _config.yml文件中主题改为新增主题 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: TKL 进入主题目录,更新git cd theme/TKL git pull 执行更新 hexo clean hex…

ceph bluestore源码分析:非对齐写逻辑

文章目录环境原理说明总结环境 ceph:12.2.1 场景&#xff1a;ec 21 部署cephfs&#xff0c;执行如右写模式:dd if/dev/zero of/xxx/cephfs bs6K count4 oflagdirect 关键配置&#xff1a; bluestore_min_alloc_size_hdd 65536 bluestore分配空间的最小粒度 单位&#xff1a;B…

JVM系列(之ClassLoader)

Class Loader Java运作流程 内部class loader bootstrap class loader --引导类加载器&#xff0c;它负责加载Java的核心类【java.* 】&#xff08;如classpath下面的类库&#xff09;&#xff0c;不是 java.lang.ClassLoader的子类&#xff0c;而是由JVM自身实现的。Code . UR…

java平台类成员访问修饰符_JAVA类的修饰符及访问权限

1.类外部类 class前的修饰符只能有publicfinalabstrct无(默认) &#xff1a;同包可见 (Eclipse中选择package)内部类 class前的修饰符有public、protected、private、默认、final、abstract、static。先看类的访问权限&#xff0c;再看成员的访问权限&#xff0c;类…

ios实例开发精品源码文章推荐

1、IOS代码分享:视图布局&#xff08;View Layout&#xff09;Border View140601bvpw22rir88b9i8i.png(19.97 KB, 下载次数: 0)下载附件保存到相册半小时前 上传http://www.apkbus.com/android-101999-1-14.html2、IOS代码分享&#xff1a;导航条&#xff08;Navigation Bar&am…

Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用

写博客&#xff0c;写博客&#xff0c;把自己知道的小知识点全部记录&#xff0c;? BeanDefinitionRegistryPostProcessor 接口属于Beanddefination 装配定义的范畴&#xff0c;此时bean 并没有初始化 BeanPostProcessor属于be an 实例化修改的范畴&#xff0c;be an 已经进行…

关于ceph源码 backtrace 打印函数调用栈

当集中精力看一个问题的时候&#xff0c;时间久了就会有这样一个状态&#xff0c;天空飘来五个字&#xff0c;那都不算事 ceph源码庞大的体量以及复杂的设计让很多人望而却步&#xff0c;尤其是大量的纯虚函数更是让读者迷失在代码的海洋&#xff0c;这个时候函数调用栈是一个救…

泛型java 代码讲解_Java泛型详解

2516326-5475e88a458a09e4.png一&#xff0c;打破砂锅问到底泛型存在的意义&#xff1f;泛型类&#xff0c;泛型接口&#xff0c;泛型方法如何定义&#xff1f;如何限定类型变量&#xff1f;泛型中使用的约束和局限性有哪些&#xff1f;泛型类型的继承规则是什么&#xff1f;泛…

(转)金额转中文大写

public class RMB {//返回转换好的大写形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 将小写金额转换成大写金额private static String splitNum(String s) {// 如果传入的是空串则继续返回空串if ("".e…

[IOS]UIWebView实现保存页面和读取服务器端json数据

如何通过viewView保存访问过的页面&#xff1f;和如何获取并解析服务器端发送过来的json数据&#xff1f;通过一个简单的Demo来学习一下吧&#xff01; 操作步骤&#xff1a; 1.创建SingleViewApplication应用&#xff0c;新建VIewController&#xff0c;并在xib试图中添加WebV…

struts2之配置文件struts.xml详解

struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Str…

ceph bluestore 源码分析:刷缓存(trim)逻辑

环境 ceph版本&#xff1a;12.2.1 部署模式&#xff1a;ec 21 osd&#xff1a; 3个 且资源池已经有数据 执行命令&#xff1a;ceph daemon osd.0 flush_store_cache 进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放 主要参数: bluestore_cac…

php中怎么过滤器_PHP 过滤器(Filter)

过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 重复调用&#xff0c;我们可以使用 filter_var_array 或 the filter_input_array 函数。在本例中&#xff0c;我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一…

c++ Qt向PHP接口POST文件流

Qt调用PHP写的接口&#xff0c;向其传递图片文件&#xff0c;并保存在服务器。 二进制文件无法直接传递&#xff0c;Qt采用Base64进行编码发送&#xff0c;PHP解码保存为文件。 注意&#xff1a;PHP收到数据之后会将POST过来的数据中的加号()替换为空格&#xff0c;造成接收到的…

在网络通讯中应用Protobuf

Protobuf的设计非常适用于在网络通讯中的数据载体&#xff0c;它序列化出来的数据量少再加上以K-V的方式来存储数据&#xff0c;对消息的版本兼容性非常强&#xff1b;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf. Protobuf…

JS中Math函数的常用方法

Math 是数学函数&#xff0c;但又属于对象数据类型 typeof Math > ‘object’ console.dir(Math) 查看Math的所有函数方法。 1&#xff0c;Math.abs() 获取绝对值 Math.abs(-12) 12 2&#xff0c;Math.ceil() and Math.floor() 向上取整和向下取整 console.log(Math.ceil(1…

C++ 泛型编程 -- 函数模版

文章目录定义声明调用方式函数模版的重载函数模版的特点工作中一个同事写了测试demo&#xff0c;想要自己尝试使用发现调用老出错&#xff0c;请教的时候发现是函数模版&#xff0c;有自己的调用方式&#xff0c;并且发现核心代码中大量的函数模版和类模版。特此做一个函数模版…

bellman_ford寻找平均权值最小的回路

给定一个有向图&#xff0c;如果存在平均值最小的回路&#xff0c;输出平均值。 使用二分法求解&#xff0c;对于一个猜测值mid&#xff0c;判断是否存在平均值小于mid的回路 如果存在平均值小于mid的包含k条边的回路&#xff0c;那么有w1w2w3...wk < k * mid,即(w1-mid)(w2…

守护进程中创建的对象php,在PHP中生成守护进程(Daemon Process)

前两天看到一篇文章《如何使用PHP编写daemon process》&#xff0c;其中对核心代码却没有细说&#xff0c;我又查了一些资料&#xff0c;还看了一本《理解Unix进程》&#xff0c;才搞明白生成守护进程的时候发生了什么。这段代码是这个样子的&#xff1a;function run(){//第一…

log4j个人使用整理

Log4j介绍&#xff1a; 略过。 配置&#xff1a; Eclipse项目中添加log4j.jar到lib下。 在bin目录下新建log4j.properties&#xff0c;编辑好log4j配置文件。 样例分析&#xff1a; 1 log4j.rootLoggerWARN, stdout, file2 log4j.appender.stdoutorg.apache.log4j.ConsoleAppen…