一、基本概念
文本分类是文本挖掘中的一个重要领域,所谓文本分类,事实上指的是为用户给出每个文档,文本片段等所要归属于哪一类(类别,主题等)的问题。
文本挖掘
文本挖掘(Text Mining)是从非结构化文本信息中获取用户感兴趣或者有用的模式 的过程。其中被普遍认可的文本挖掘定义如下:文本挖掘是指从大量文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考。
简言之,文本挖掘就是从非结构化的文本中寻找知识的过程。 文本挖掘的七个主要领域:
(1)搜索和信息检索(IR):存储和文本文档的检索,包括搜索引擎和关键字搜 索。
(2)文本聚类:使用聚类方法,对词汇,片段,段落或文件进行分组和归类。
(3)文本分类:对片段,段落或文件进行分组和归类,使用数据挖掘分类方法的 基础上,经过训练的标记示例模型。
(4)Web 挖掘:在互联网上进行数据和文本挖掘,并特别关注在网络的规模和相 互联系。
(5)信息抽取(IE):从非结构化文本中识别与提取有关的事实和关系;从非结构 化和半结构化文本制作的结构化数据的过程。
(6)自然语言处理(NLP):将语言作为一种有意义、有规则的符号系统,在底 层解析和理解语言的任务(例如,词性标注);目前的技术主要从语法、语义 的角度发现语言最本质的结构和所表达的意义。
(7)概念提取:把单词和短语按语义分组成意义相似的组。
文本分类的应用比较广泛,如:垃圾邮件检测,文件归档,网页分层等等。
二、基本步骤
1.预处理
2.词向量处理
3.TF-IDF权重策略
4.建立分类器
5.评价分类结果
中文特殊情况
1.预处理
2.分词处理
3.词向量处理
4.TF-IDF权重策略
5.建立分类器
6.评价分类结果
1.预处理
主要实现对文本内容的降噪,划分训练集、测试集等过程。
比如,抓取了200篇类别划分明确的百度百科,首先要去除内容中的一些html标签,留下需要用到的内容,删除不必要的内容等等。然后将这些内容进行训练集于测试集的划分。
2.分词处理
相对于英文而言,中文分词有一定的难点,将连续的汉字序列切分成一个个的单词要考虑很多因素,比如句法,精度等等。
比如:火车上有人
正确分词结果:火车 上 有 人
有歧义的结果:火 车上 有 人
分词的精度将直接导致文本的关键信息以至于对最后的分类结果造成影响。
目前已经有比较成熟的分词工具被提供使用:
具体可以参照一些比较好用的中文分词器
1 |
|
以上的代码,已经将文本进行分词并保存(PS.因为使用了交叉验证,所以没有划分测试集,测试集划分方法可以从已经分好词的文件中随机分出20%也可以先分出20%再进行分词)
如:
1 | #从切分的数据中分离出测试数据集 |
3.词向量处理
在这一步,会将已经分好词的训练集文本进行词频统计,并生成文本词向量空间,
词向量,顾名思义,就是使用向量来表达词。最常见的表达方式就是”one-hot”,其向量维度为整个语料库中词的总数,每一维代表语料库中的一个词(出现为1,不出现为0)
关于这一点可以参考
期间为了更好的进行下一步的TF-IDF的处理,可以将一些类似于(呢,啊,嗯)之类的停用词进行过滤。
4.TF-IDF权重策略
使用 TF-IDF 发现特征词,并抽取为反映文档主题 的特征
可以参照参考,主要工作就是提取文本的关键词信息。
1 | #第三步,处理词向量,包括去除停用词 |
如果需要使用测试集进行验证,则需要注意以下信息
- 测试集在向量化时,需要使用和训练器相同的矢量器 否则会报错 ValueError dimension mismatch
1 | def content_vectorizer_test(data): |
5.建立分类器
通过上面这些步骤,训练集基本已经处理完成,现在只需要使用合适的分类器进行训练处一个合适的分类器模型(sklearn有很多已经封装好的分类器,只需要按照需求进行调用就好)。
6.评价分类结果
训练出来的模型必须进行测试验证,最简单的方式是使用sklearn自带的交叉验证进行评测,当然,也可以按照第一步划分出来的测试集进行测试和验证。当然分值越高说明训练出的模型在处理分类时更加精准。
1 | # 创建分类器 |
记录下完整代码:
1 | #!/usr/bin/env python3 |
github:https://github.com/ilioner/ML-Classifier
参考: