2020-05-11

                                             文章自动分类打标签

一、项目背景与目标

        目标网站上积累了大量与疾病主题相关的文章、帖子等文本数据,这些文章没有做内容分类,也没有打上相应的标签,不便于对内容进行管理。为了对文章按主题进行分类、做集约化管理,方便后期向用户做个性化推荐,需要先将大量历史文章、帖子做分类整理,同时为每篇文章打上与其主题相关的标签。

二、思    路

        首先,将数据源分类为训练集和测试集,分别对其进行分词处理,建立语料库、去除停用词,这里需要使用python中的jieba库做中文分词;

        其次,为了方便后续生成词向量空间模型,将分词后的训练集和测试集分别转换成文本向量信息并对象化,需要用到sklearn库中的Bunch数据结构;

        再者,分别对训练集和测试集进行特征建立,使用TF-IDF算法计算词空间向量,其中需要将训练集的词向量空间坐标赋值给测试集数据;

        最后,构建模型对文本进行分类与模型评价,需要使用朴素贝叶斯算法。

三、算法简介

        TF-IDF:该算法是一种针对关键词的统计分析方法,用于评估一个词对于一个文件集或一个语料库的重要程度。它基于假设—一个词的重要程度跟它在文章中出现的次数成正比,与它在语料库出现的频率成反比。这种计算方式能有效避免常用词对关键词的影响,提高关键词与文章之间的相关性。

        其中TF=(某词在文档中出现的总次数/文档的词总数),IDF=lg (语料库中文档总数/包含该词的文档数)+1 ;当然该算法也有它的缺陷第一,它没有考虑文档中该词本身的重要性第二,没有考虑语料库中该词的分布情况,例如该词在语料库中某一类文档出现频率很高,在其他类中出现频率低,本质上该词对于文章来说是很重要的,但基于该算法,它的IDF权重系数会很小,认为该词不重要。第三,没有考虑到词在文章中的位置

        具体可以在sklearn中调用TfidfVectorizer库实现TF-IDF算法,并且可以通过stop_words参数来设置文档中的停用词(没有意义的词,比如语气词等)使停用词不纳入计算范围。


        朴素贝叶斯分类

        该算法是基于贝叶斯原理,它是一种简单但极为强大的预测建模算法。之所以称为朴素贝叶斯,是因为它假设每个输入变量是独立的,这是一个强硬的假设,实际情况并不一定,但这项技术对于绝大部分的复杂问题仍然非常有效。

        朴素贝叶斯模型由两种类型的概率组成:

        1、每个类别的概率P(C_{j} )

        2、每个属性的条件概率P(A_{j} |C_{j} )

        为了训练朴素贝叶斯模型,我们需要先给出训练数据,以及这些数据对应的分类。那么类别概率和条件概率,他们都可以从给出的训练数据中计算出来,一旦计算出来,概率模型就可以使用贝叶斯原理对新数据进行预测。本案例使用sklearn中的MultinomialNB包实现对文章的朴素贝叶斯分类。


四、建模流程

1、文本分词处理

        为了构建词空间向量,首先需要对待分类文本做切词处理,将切好后的词语写入指定的路径下。这里我们使用python中的jieba工具对文本进行分词,同时使用jieba.analyse.extract_tags方法(基于TF-IDF算法)抽取文章的主题标签。代码(文件word_cut.ipynb):


执行程序后,将训练集和测试集对应的文本分别进行了分词处理,并将分词后的文本存入了新建立的文件夹中(train_segments,test_segments),同时对测试集的每一个文本抽取了文章的主题标签,存入了新文件夹(theme_tag1)



2、数据结构处理

        为了方便后续生成词向量空间模型,需要将这些分词后的文本信息转换成文本向量信息并对象化。这里使用sklearn库中Bunch数据结构,将文本存储成链式结构,本文中定义Bunch(label=[],filepath=[],contents=[]),其中label标注训练集每份文本归属的类别,filepath标注文本的存储路径,contents保存训练集和测试集中每一类别下的文本内容。代码(文件word_to_bunch.ipynb)


上述程序是将每篇文档的类型、存储路径、文章内容写入Bunch数据结构中,执行程序后生成train_bunch_bag.dat和test_bunch_bag.dat文件



3、计算文本的TF-IDF权重矩阵

此步骤是将上一步存储的结构化数据构建成为一个TF-IDF词向量空间,空间中的词全部来自该训练集,各个词的权重矩阵也一并保存下来,建模过程中需要注意将训练集的词向量空间的坐标赋值给测试集。代码(文件TF-IDF_count.ipynb)


执行该程序会将训练集和测试集数据转换为TF-IDF词向量空间中的实例,其中space表示词向量空间坐标,tdm表示训练集合测试集数据的TF-IDF权重矩阵。执行完程序生成train_tfidfspace.dat和test_tfidfspace.dat数据文件



4、朴素贝叶斯方法分类文章

使用训练集数据训练模型得到朴素贝叶斯分类器,再用训练好的分类器对测试集进行分类,得到结果,从精确率、召回率、F-测度值三个角度评价。代码(nbayes_classify.ipynb)


从得到的结果可以看出,精确率0.926,召回率0.923,F-测度值0.933,分类效果还是很不错的,同时将预测结果写入新文件(classify_result_file.txt)

源数据、代码文件、每段代码生成的文件网盘地址:   

链接:https://pan.b aidu.com/s/1jkk3W2cpBkXT5tR53hVfNw           提取码:t2s3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容