文本表示:其实就是文本的向量化问题。
向量空间模型的思想是把文档简化为特征项的权重为分量的向量表示,其中选取词作为特征项,权重用词频表示。
其主要用的是TF-IDF算法来计算:TF(词频)是一个词语出现的次数除以该文件的总词语数。IDF(文件频率)的方法是测定有多少文件出现过某个词,然后除以文件集里的文件数。注意这里IDF用的是逆向文件频率,即假如“汽车”一词在100份文件中出现过,总文件数是10000份,这时的逆向文件频率为log10(10000/100)=2log_{10}(10000/100)=2,而得到的TF是0.05,此时的TF-IDF分数为0.05x2=0.1。

也即是,如果某个词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为这个词有很好的类别区分能力,适合用来分类;IDF表示含有该词汇的文档,比例越低IDF越大,则说明该词汇具有良好的类别区分能力。

1. Rocchio算法

Rocchio算法是一种非常直观的文本分类算法。其核心思路是给每一个文档的类别都做一个的标准向量(也称为原型向量),然后用待分类的文档的向量和这个标准向量对比一下余弦相似度,相似度越高越可能属于该分类,反之亦然。

例如:在新闻网站中希望构造一个自动的文章分类系统,然后先收集10000个样本,然后由人给每篇文章划分类别,然后把每个类别里的每篇文章逐个拿出来做分词和向量化,这样每个类别里的每篇文章都有一个非常长的向量模型。再把得到的每个类别的所有文章进行维度的平均(词频的平均),得到的这个原型向量称为“质心”。当有一篇新的文章要分类时也同样进行分词和向量化,下面就是余弦相似度的计算了。cos(θ)cos(\theta )越接近1说明越相似,越接近0就说明越不相似,这里不存在小于0的情况。

这里要注意的是文本挖掘里的使用的向量和其他的向量使用有所不同,这里的维度数会因文本的不同而不同,而且这里维度的值不是枚举类型,是0—1的区间内的数。

2. 学习20newsgroups案例

20新闻组数据集是一个接近被2000个新闻组文档的集合,它是由Ken Lang收集的,也许是为了他的论文:”Newsweeder:学习过滤新闻”,尽管他没有明确的提到这个数据集.20新闻组集合在机器学习技术中的文本应用实验中已经成为一个流行的数据集.

数据的采集有两种方法,这里简单介绍下:

2.1 scikit-learn:加载本地的原始数据

可以先下载好数据集,然后使用sklearn.datasets.load_files函数加载解压缩文件夹内的子文件夹。

sklearn.datasets.load_files(container_path, description=None, categories=None,load_content=True, shuffle=True, encoding=None, decode_error='strict', random_state=0)

部分参数说明:container_path,load_content=True,encoding=None

  • container_path:“container_folder”的路径。
  • load_content=True:是否真的把文件中的内容加载到内存中,选择true就是了。
  • encoding=None:string or None (default is None),是否解码文件中的内容(主要针对图片、视频或其他二进制文件,而非文本内容);如果不是None,那么在load_content=True的情况下,就会解码文件中的内容。注意,当前文本文件的编码方式一般为“utf-8”。如果不指明编码方式(encoding=None),那么文件内容将会按照bytes处理,而不是unicode处理,这样模块“sklearn.feature_extraction.tex”中的很多函数就不能用了。

返回值:data : Bunch

值得注意的:

data:原始数据
filenames:每个文件的名字
target:类别标签(从0开始的整数索引)
target_names:类别标签(数字)的具体含义(由子文件夹的名字决定)

简单示例:
这里以加载20个新闻组数据集为例,提前把数据集下载好,放于和运行文件的同一个目录下。

代码:

from sklearn import datasets# 读取训练集
newsgroups_train = datasets.load_files("20news-bydate-train")
pprint(list(newsgroups_train.target_names))
print (len(newsgroups_train.target_names))

运行结果:

>>>
==== RESTART: C:\Users\LiLong\Desktop\test_now\naive_bayes_multinomial.py ====
['alt.atheism','comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware','comp.sys.mac.hardware','comp.windows.x','misc.forsale','rec.autos','rec.motorcycles','rec.sport.baseball','rec.sport.hockey','sci.crypt','sci.electronics','sci.med','sci.space','soc.religion.christian','talk.politics.guns','talk.politics.mideast','talk.politics.misc','talk.religion.misc']
20

2.2 在线下载数据集

我们也可以使用scikit-learn自带的toy example数据集进行测试,介绍一下如何加载自带的数据集。

可以使用sklearn.datasetsfetch_20newsgroups进行在线的自动下载。

函数原型:

fetch_20newsgroups(data_home=None,subset='train',categories=None,shuffle=True,random_state=42,remove=(),download_if_missing=True)
  • data_home:指的是数据集的地址,如果默认的话,所有的数据都会在’~/scikit_learn_data’文件夹下.
  • subset:就是train,test,all三种可选,分别对应训练集、测试集和所有样本。
  • categories:是指类别,如果指定类别,就会只提取出目标类,如果是默认,则是提取所有类别出来。
  • shuffle:是否打乱样本顺序,如果是相互独立的话。
  • random_state:打乱顺序的随机种子
  • remove:是一个元组,用来去除一些停用词的,例如标题引用之类的。
  • download_if_missing: 如果数据缺失,是否去下载。

注意:在线的下载会花费一段时间,如果你担心程序死掉了,可以打开在线下载文件的保存目录:C:\Users\lilong\scikit_learn_data\20news_home,这个文件夹下就是在线下载的保存目录,观察这个文件夹你会发现文件在一个一个增加,最后下载完成后压缩包文件和解压的文件都会被自动删除,最后只剩下20news-bydate_py3.pkz文件了,这里暂且看作是程序运行后内存可以读取的文件。

2.3 完整代码

#coding=utf-8
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from pprint import pprint# 读取训练集newsgroups_train = fetch_20newsgroups(subset='train')
pprint(list(newsgroups_train.target_names))
'''
newsgroups_train = datasets.load_files("20news-bydate-train")
# 得到20个主题
pprint(list(newsgroups_train.target_names))
print (len(newsgroups_train.target_names))# 这里选取4个主题
categories = ['rec.sport.baseball', 'alt.atheism', 'talk.politics.guns', 'sci.space']# 下载这4个主题
twenty_train = fetch_20newsgroups(subset='train', categories=categories)
print ('here..............')# 文件内容在twenty_train这个变量里,现在对内容进行分词和向量化操作
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)# 接着对向量化之后的结果做TF-IDF转换
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)# Rocchio的示例代码
from sklearn.neighbors.nearest_centroid import NearestCentroid
# 现在把TF-IDF转换后的结果和每条结果对应的主题编号twenty_train.target放入分类器进行训练
clf = NearestCentroid().fit(X_train_tfidf, twenty_train.target)# 创建测试集合,这里有2条数据,每条数据一行内容,进行向量化和tf-idf转换
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)# 预测
predicted = clf.predict(X_new_tfidf)# 打印结果
for doc, category in zip(docs_new, predicted):print('%r => %s' % (doc, twenty_train.target_names[category]))

运行结果:

>>>
==== RESTART: C:\Users\LiLong\Desktop\test_now\naive_bayes_multinomial.py ====
['alt.atheism','comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware','comp.sys.mac.hardware','comp.windows.x','misc.forsale','rec.autos','rec.motorcycles','rec.sport.baseball','rec.sport.hockey','sci.crypt','sci.electronics','sci.med','sci.space','soc.religion.christian','talk.politics.guns','talk.politics.mideast','talk.politics.misc','talk.religion.misc']
here..............
'God is love' => alt.atheism
'OpenGL on the GPU is fast' => sci.space

注意这里的Rocchio算法的缺陷是很明显的,它做了两个假设,使得它的分类能力大大折扣。
假设一:一个类别的文本仅仅聚集在一个质心的周围,实际情况往往不是。
假设二:训练样本是绝对正确的,因为它没有任何的定量衡量样本是否含有噪声的机制,错误的分类会影响质心的位置。

3. 笔记

zip([iterable, …])函数使用:其中iterabl 代表一个或多个迭代器,zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

参考:http://www.runoob.com/python/python-func-zip.html
http://blog.csdn.net/mmc2015/article/details/46852963
《白话大数据与机器学习》

Rocchio算法—文本分类相关推荐

  1. 朴素贝叶斯算法——文本分类(离散型)

    朴素贝叶斯算法:按照概率分类的算法. 我们在豆瓣上经常能看到一些书籍和电影评价,有好的评价,也有差评. 关于影评好坏的结果是怎么来的呢?后台小姐姐一条条的看,然后进行分类吗?利用我们的朴素贝叶斯算法, ...

  2. 文本分类实战--从TFIDF到深度学习(附代码)

    转自:http://blog.csdn.net/liuchonge/article/details/72614524 这几周因为在做竞赛所以没怎么看论文刷题写博客,今天抽时间把竞赛用到的东西总结一下. ...

  3. 机器学习_深度学习毕设题目汇总——文本分类

    下面是该类的一些题目:| 题目 | |–| |基于主题特征的多标签文本分类方法研究| |融合全局和局部特征的文本分类方法研究| |BiGRU-CapsNet文本分类模型研究| |基于Attentio ...

  4. Rocchio算法( pronounced Rockey-O)二分类

    文本的相关性来自于文本中每个关键词和领域的相关性. 假定中文语言词汇集为X={x1,x2,---xn},xi为词汇代号. 对于类A通过训练得到一个权重集合W={w1,w2,--..wn}. 权重集合的 ...

  5. 文本分类算法比较与总结

    本文对常用的几种文本分类算法进行了比较与总结,主要阐述它们之间的优劣,为算法的选择提供依据. 一.Rocchio算法 Rocchio算法应该算是人们思考文本分类问题最先能想到的,也是最符合直觉的解决方 ...

  6. 文本分类常用算法比较

    本文对文本分类中的常用算法进行了小结,比较它们之间的优劣,为算法的选择提供依据. 一.决策树(Decision Trees) 优点: 1.决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表 ...

  7. 文本分类算法研究与实现

    1 设计题目 文本分类的算法研究与实现 2 课题背景及研究现状 2.1 课题背景 近年来,随着Internet的迅猛发展,网络信息和数据信息不断扩展,如何有效利用这一丰富的数据信息,己成为广大信息技术 ...

  8. c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)

    基于朴素贝叶斯分类器的文本分类算法(C语言) 基于朴素贝叶斯分类器的文本分类算法(C语言).txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情.#include ...

  9. 文本分类的基本思想和朴素贝叶斯算法原理

    文本分类的基本思想和朴素贝叶斯算法原理

最新文章

  1. Windbg双机调试环境配置(Windows7/Windows XP+VirtualBox/VMware+WDK7600)
  2. PHP与Python哪个做网站产品好?
  3. 数值分析之数值稳定性篇
  4. 百度关闭新闻源背后的13个趋势风口
  5. 国家自然基金标书申报体会
  6. 将d:\java目录下的所有.java文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad
  7. edu汇编语言——实训课程
  8. SVO实时全局光照优化(里程碑MK2):Sparse Voxel Octree based Global Illumination (SVO GI)...
  9. python算法应用(三)——分级聚类
  10. 回顾Google IO 2016 -Keynote【图解】
  11. 常用地图经纬度转换,以及遇到的问题和解决方式
  12. 十大验证码解决方案服务比较
  13. 如何把握银行信息科技风险管理的“度”?
  14. 世界各国Google域名后缀对照表
  15. 第九讲 数据采集:用八爪鱼采集微博评论
  16. 【三维目标检测】3DSSD(一)
  17. 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】
  18. openfire smack消息回执设置,处理掉包问题
  19. ospf 实验详细分析
  20. case_02 股票波动率计算

热门文章

  1. Qt Creator编辑状态图
  2. Qt Creator使用文本编辑宏
  3. QT的QNetworkProxy类的使用
  4. QT的QMutableLinkedListIterator类的使用
  5. OCR识别缺点_福利:OCR大全
  6. 20 Python函数、定义一个函数、参数传递、匿名函数、return语句、变量作用域、
  7. MongoDB配置参数说明
  8. nginx在Centos下的安装,转:http://www.linuxidc.com/Linux/2016-09/134907.htm
  9. Linux_Oracle命令大全
  10. 02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写