![397cf7d0887c599d5fe0c6dfd00f3c2a.png](https://i-blog.csdnimg.cn/blog_migrate/a5e666428f971ad10de0efbf052889e9.jpeg)
这一周比较忙碌,而且自动标注为“民生”的类目中badcase的整理以及分析解决,到昨天为止还没有完成。下周还要继续整理“经济”类和“政治”类的badcase,同时这周也在专栏中增加了“fastText系列”的一部分内容,“HanLP系列”的一部分内容。
baiziyu:HanLP-实词分词器zhuanlan.zhihu.com![07b9b6330c11b18bbfb019b1a2050856.png](https://i-blog.csdnimg.cn/blog_migrate/79a302aa3a1de64b357f93cd0ad07ba1.jpeg)
![9ee639645ab7025fd7ac867195eb6270.png](https://i-blog.csdnimg.cn/blog_migrate/725170c31a31175d15c2a18b4ada7fd7.jpeg)
![74318bb37b8d5194f0117ec0cac30448.png](https://i-blog.csdnimg.cn/blog_migrate/cf16205ee48a112478dfa497413dae58.jpeg)
下边对前边我们做的“文本分类语料构建”部分的内容先做一个小的梳理,然后增加有关“民生”类badcase的解决方案。
1. 文本分类体系的构建
在文本分类实践中,第1步面临的问题就是分类体系的构建。一般的类目体系为四到五级,电商商品文本的类目一般为四级,新闻舆情文本的类目体系一般为五级。但在训练文本分类模型时,一般采用两级类目。原因是类别涉及概念越细,所能提供的训练样本越少,也不排除产生数据不平衡的问题。这里有关分类体系构建的文章有下边几个
《中文新闻信息分类标准》研究-徐曼
baiziyuandyufei/text_classificationgithub.com![91cb0f9890c615bd86f180ca4faf6c4d.png](https://i-blog.csdnimg.cn/blog_migrate/2a65ec1e7c8c5846e6322e65c18a5cf4.png)
2006-13-突发事件新闻语料分类体系研究-杨丽英
https://github.com/baiziyuandyufei/text_classification/blob/master/doc/%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB%E4%BD%93%E7%B3%BB%E6%9E%84%E5%BB%BA/2006-13-%E7%AA%81%E5%8F%91%E4%BA%8B%E4%BB%B6%E6%96%B0%E9%97%BB%E8%AF%AD%E6%96%99%E5%88%86%E7%B1%BB%E4%BD%93%E7%B3%BB%E7%A0%94%E7%A9%B6-%E6%9D%A8%E4%B8%BD%E8%8B%B1.pdfgithub.com同时在新闻领域中,有一份分类体系标准
GBT20093-2006 中文新闻信息分类与代码.pdfgithub.com该标准规定了中文新闻信息分类的原则、方法、体系和类目代码。标准适用于通讯社、报社、广播电台、电视台、杂志社、网络媒体,以及各种资讯机构对中文新闻信息进行分类、检索、标识等方面的处理与交换业务。标准中主类表由三个表组成,分别为一级类表、简表和详表。其中一级类表是一级类目组成的一览表,又称基本大类表。简表是一级、二级类目组成的一览表,又称基本类目表。详表是全部类目组成的一览表,又称主表。标准由三大部类构成:政治部类,代码01~05;经济部类,代码11~22,文化部类,代码为31~39,详情可以看标准的表1“中文新闻信息分类一级类表”。标准的详表中最多分为五个层级类目,其中一级类目23个,二级类目293个。
该标准的类目体系结构如下
![7effdf2f2bda9160604a89db957877b9.png](https://i-blog.csdnimg.cn/blog_migrate/40b72a28094e175e3212cf0b74749c85.jpeg)
一级类表如下
![7aad2abc7200161dc3dee2fa5609a32a.png](https://i-blog.csdnimg.cn/blog_migrate/3e7f75b070e4e6915242e84ae724bc8e.jpeg)
如果小伙伴们所要处理的分类语料也属于新闻舆情类的话,可以考虑参考上边的一级类表来设计自己的类目体系,当然这里需要说明的是类目体系的构建需要结合后边文本分类语料库的构建进行适当的调整(增加、删除、合并类目)。
这里我们的一级类目有以下几个:经济、政治、文教、民生、信息、工业、能源、农业、其他。
2. 类目关键词构建
当我们有了类目体系以后,就要确定每个类目的关键词了。那么如果只通过人工按照类目的概念给出一些关键词,势必会不全也不够准确,原因是我们最终分类的还是文本,我们需要根据我们要处理的文本来确定这些类目的关键词,同时必要时还可以在这一步修改类目体系。这里我将介绍几种构建类目关键词的方法。
- 利用无监督聚类技术构建类目关键词的方法,方法步骤为
- 对没有类别标记的语料进行聚类
- 对聚类得到的每个簇抽取关键词
- 将簇关键词人工分配到各类目上作为类目关键词
实际这三步的代码我已经在专栏的文中写过了,只不过分成了两篇文章来写的,大家可以参考这两篇文章来完成这一步骤。
baiziyu:文本聚类示例2——single-pass增量聚类zhuanlan.zhihu.com![370be1ed1e9e2ccbfcd8418b9255bdf9.png](https://i-blog.csdnimg.cn/blog_migrate/a455aabe3d6551a6ddd9b56f1c0d134a.jpeg)
![fde1047c954c3483ec2669574f69f08c.png](https://i-blog.csdnimg.cn/blog_migrate/66898c08d0847b501be39ccb533fea40.jpeg)
同时后续我会整理出一个完整的Python代码来完成这一部分内容。
- 类目关键词扩展方法
上边的方法只适合于时间比较充裕的情况,在时间不是很宽裕时怎么办呢?我们可以首先为每个类目指定一些关键词。之后利用词嵌入技术,来扩展这些类目关键词,具体步骤为
- 首先把所有类目关键词放在一起,使用词嵌入技术来表示这些词语,然后用Single-Pass对词语进行聚类。相似度阈值设置为0.6。
- 对含有2个以上词语的簇,人工打上类别标记。
- 对只含有1个词语的簇,利用词语向量库检索近义词来扩充这些簇,最后人工校对扩展出的词语并给簇打上类别标记。
当然这3步是尝试过程,如果可以大家可以直接试试就直接对所有类关键词扩展然后再进行人工筛选。
那么有关这一方法的实现代码大家可以参考专栏中的这几篇文章
baiziyu:K-Means与Single-Pass在词语聚类上的比较zhuanlan.zhihu.com![78a210872d91b6b4139f414c9c38f8cd.png](https://i-blog.csdnimg.cn/blog_migrate/b2a54a1e9442e2c698753df90cc12011.jpeg)
![6f4d4cfc9f6d97e670512a44771752bd.png](https://i-blog.csdnimg.cn/blog_migrate/8940aea3867987aca84be4c0b2f1105b.jpeg)
![f56de0d99dc49555b6907a8fcd76e60f.png](https://i-blog.csdnimg.cn/blog_migrate/584b6c52a48e4b5ef2da9ba2ad98b32c.jpeg)
这里我们给出查询相关词的函数代码
def
- 获取相关类目的语料抽取关键词或直接找相关类目词典
上边的两种方法我们都利用了聚类+人工的方式,那么有没有更简便的方法呢?当然有你可以爬去或查找相关类目的文本内容,然后对这些文本内容抽取关键词,用这些关键词作为类目关键词,当然当前的抽取关键词的代码的准确性都不是特别高,总还是需要人工校对筛选的。
下边给出tf法关键词抽取代码
#coding:utf-8
3. 构建类目向量并进行自动标注
有了类目关键词后,我们就可以利用词嵌入技术来表示类目向量了。表示的方法为
![33fe5d752d5240e7fe1fbaa4529604ab.png](https://i-blog.csdnimg.cn/blog_migrate/b3ee55d399ed3f10b9ba6657ee9a3a3a.png)
一条未标注的文本,这里指的是短文本,那么它的向量表示与类目向量表示类似公式如下
![415df6c4d5ab4c505281d6da66ca07ed.png](https://i-blog.csdnimg.cn/blog_migrate/ef2b9767e2a93bb78949cffe87334289.jpeg)
通过上边的两步,我们有了类目的向量,待标注文本的向量,接下来就可以进行文本的自动类别标注了。原理其实就是看文本向量跟哪个类目向量的相似性最大,具体步骤为
- 计算每个类目的向量
- 计算待标注文本向量
- 计算文本向量与各类目向量的相似度(余弦相似度)
- 对类目名称按相似度值降序排列,取top1作为自动标注结果
类目向量构建及可视化代码如下,这段代码属于实验验证的代码,不具有保留性,所以我们记在这里以后的文章里可能也不会再用。当然如果你对向量可视化比较感兴趣,可以运行以下。我在前边的文章中也提到过,文本的向量由于维度高是不具有可视化特性的。运行前需要给出你要绘制的类目以及类目下的关键词列表。
#coding:utf-8
有关自动标注的代码逻辑,请看下边的“4. 自动标注代码逻辑”
==============================================================================================================
******************************************************************************************
==============================================================================================================
接下来,我们进入今天的主题,昨天的文章中我们对自动标注为“民生”类的badcase做了一些分析,今天的内容是针对昨天分析后提出的改进方案进行实现。
1. 增加汽车品牌零件词
我们找到了一个汽车品牌零件词的词表,品牌零件词下载地址为
fighting41love/funNLPgithub.com![b2a45286d8011aa985789d9f6bc799ac.png](https://i-blog.csdnimg.cn/blog_migrate/e4486aaf47448c0e2f2e6cda56e2ec05.jpeg)
里边有两张词表合并了两张词表,之后我们将这些词语按照是否有对应的fastText向量分成两部分,其中有fastText对应向量的作为关键词表放到“工业#汽车”类下;另一部分没有fastText对应向量的词语,我们校对了3字以下(包含3字)的词,将校对过滤后的这部分词直接作为规则词语,凡是包含这些词的句子都将被自动标注为“工业#汽车”。我猜想这份词表应该是从维修记录里抽取出来的,里边有品牌词、机构名、人名、汽车类比赛,最多的是汽车零件词也有机械零件词。
2. 农业类关键词抽取
我们对自动标注为“民生”而原类目是“农业”的句子用tf法抽取了关键词,之后人工筛选了具有农业类特征的词语,把能够在fastText词矩阵中找到的词语作为“农业”类关键词,其他不能用fastText向量表示的词语作为规则,凡是包含这些词语的词都将被标注为“农业”类。
3. 制作类目集合到自动标注类目规则表
这张表主要是用来解决那种含有两种类目关键词句子的类别不确定问题。比如在上一篇文章中提到的农村住房的句子类别问题。当句子中含有两个类目的关键词,且只有两个类目的关键词时(注意关键词数量不一定是两个),我们就来看这张表,如果对应这两个类目的规则,则按照规则自动标注句子的类别。规则表的样子像下边这样。
4. 自动标注代码逻辑
截至目前,我们整理一下自动标注代码的主要逻辑。
(1)加载词表以及fastText向量库
- 读取类目关键词表,返回一级类目关键词与类目名称映射字典,二级类目关键词与类目名称映射字典。类目关键词表形式应当如下所示
其中第1列表示一级类目id,第2列表示一级类目名称,第3列表示二级类目id,第4列表示二级类目名称,第5列表示各二级类目关键词。
- 读取“关键词->一级类目名称 二级类目名称”的规则表
- 读取“类目名称集合->类目名称”的规则表
类目名称集合之间需要以空格分隔,集合与类目名称之间以t分隔。类目名称集合中的类目需要属于同一级,目前为一级类目。
- 读取fastText词向量模型
- 构建一级类目向量并返回类目名称列表
(2)程序分为本地终端单条语句自动标注模式和批量自动标注模式
- 批量自动标注模式要求输入的文件一行表示一条文本,输入的文本可以有标记也可以无类别标记,如果是有类别标记的,需要给出类别标记对应于系统的类别标记映射关系。程序会根据该映射关系来统一类别名称体系,并在最后给出自动标注系统在各个类目下的准确率,并输出每个类目的badcase。
(3)对单条语句进行自动标注
- 文本预处理
文本预处理主要完成文本的分词,这里使用的是HanLP的实词分词器,有关实词分词器的内容可以看这篇文章https://zhuanlan.zhihu.com/p/66778787。去掉单字词,单字词往往会影响分类效果,注意HanLP的实词分词器默认是去除停用词的,有关停用词表的修改方法参考https://zhuanlan.zhihu.com/p/64401302。
- 基于规则的标注
对于匹配上“关键词->类目”规则的句子,按照规则进行自动标注。对于匹配上“类目名称集合->类目”规则的句子,按照规则进行自动标注。如果句子中不含有任何类目关键词自动标注为其他。如果没有匹配上上边所述的任何规则,返回None表示没有可用的规则来自动标注句子的类别。
- 基于相似度的自动标注
计算句子的向量,如果句子中所有词语都不在fastText中,则自动标注句子为其他。句子向量的计算方法在本文前边介绍文本向量时已述。计算句子与各类目的相似度并按照相似度值对类目名称降序排列,返回top1类目名称作为自动标注结果。
这篇文章写了2天,本来打算周末看一下“民生”类badcase的改善效果,结果还是没时间了。等着周一跑一下看看效果吧。下周还要看 “民生”类文教的badcase。以及“经济”和“政治”类的badcase。希望文章对从事文本分类相关业务的小伙伴有些许的帮助。