利用文本相似度进行英文文本分类(C++实现)。仅用于应付课程小作业。
代码在链接:利用文本相似度进行英文文本分类(C++实现)-C++文档类资源-CSDN下载
文本分类是自然语言处理中比较常见且重要的任务类型。本文主要利用TF_IDF算法实现关键词的提取和文本相似度的计算,通过与原始数据集进行相似度计算从而实现文本分类。
其中阅读文本并存放单词信息的核心思想是利用链表结点来保存单词的信息,包括字符数组、单词的出现次数、单词的TF值、单词的TF_IDF值。而原始数据集则是由三个大类:sports, education, economic组成,每个大类里存放二十篇新闻文本。链表和原始数据集的设计还存在许多可以改进的地方,在本学期后会逐步进行完善。
先来介绍一下核心算法和思想。
struct word // 结点用于存放每个单词及其出现次数,TF,TF_IDF值
void read(const char* filename, word*& head); // 阅读文本,将单词信息存放于结点中
void TF(word* head); // 计算每个单词出现的次数
void TF_IDF(word* head, word* h[]); // 计算每个单词的TF_IDF值
double Similar(word* h1, word* h2); // 计算文本相似度
首先定义结构体word用于存放单词信息,read()函数实现阅读文本并存放单词信息到结点上,这一步是提取文本信息的最重要的一步,只要把单词提取出来并实现词频统计,那么后续的操作只需围绕链表结点信息进行即可。
TF()函数用于计算每个单词的TF值。TF_IDF()函数用于计算每个单词的TF_IDF值(具体算法在这里就不具体说明了,各个地方都有许多很好的算法介绍),这里需要传入原始数据集(文本库)的链表头。此处所使用的原始数据集为三个已经分好类的文档,为了使结果更加明显,采用的分类为economic, sport, education。
最后的Similar()函数则是用与计算两文本的相似度(计算关键词向量余弦值),将所需分类的文本(用news.txt文档保存)分别与三个大类原始数据集进行相似度计算(调用三次Similar函数),取其中相似度最大的作为分类结果。
实现目标的基本思路为:首先依次调用read函数获得各个文档词集的链表头,然后都调用TF、TF_IDF和SortTF函数计算每个单词的TF、TF_IDF值并排序,最后调用三次Similar函数,将需要进行分类的文本与其余三个原始文本进行相似度计算,取值最大的输出其类名。
下面进行实例分析。
Economic, sport, education三个大类的原始数据集已事先准备好(为了提高效率,在准备文本库时将所有同类的文本放在同一个文档下),输入一个新闻文档news(改变文档中的内容)进行文本分类。
图表 2‑1 文档信息
例1.News: The top two universities are ranked in terms of satisfaction, and the second is a surprise.内容为双一流大学满意度的调查。
新闻内容:
图表 2‑2 例1新闻内容
测试结果1:
图表 2‑3测试结果1
例2.News: EDG wins the title! Behind the boss is the 71 billion real estate family of the second generation, each member of the team to send suites.内容为:EDG夺冠刷屏!背后老板是710亿地产家族二代,队员每人送套房。
测试结果2:
图表 2‑6 测试结果2
分析结果可以看到,虽然新闻中出现了EDG这个体育类的战队名,但整篇文章在谈论其老板的资产,使文本更偏向于经济类型,所以最终文本归类为economic。通过这个测试结果可以体会到,有一些文本可以涉及多种类型,本项目只负责输出相似度最高的那种类型,但实际生活中它却会出现在另外一个类型中,例如本例是在体育类新闻中搜集的而不是经济类。所以现实生活中的文本分类只计算相似度是远远不够的,还要考虑到多种相关联的因素,例如观看该文本的人群、文本标题中出现的可判断类型的词语等等。