一种根据关键字进行分类的文本分类算法
2009-12-27 09:06
288 查看
前段时间在做文本分类,用了k-means算法来分500篇文章,花了1个小时,分的结果还乱七八糟。当年学的高数和线性代数已经还给老师了,看SVM等于看天书,无奈之下,自己想了个法子来进行分类,就是依靠关键字来进行分类。
简单的说下原理吧,如果某篇文章包含有很多军事类别的关键字,那么该文章很有可能就是军事方面的文章。OK,这样的话我们只需要从文章中提取关键字,然后对这些关键字的类别进行判断,就可以得到文章的类别了。
这样我们可以得出这个算法的重点:
1.提取关键字
如何自动提取关键字呢?我们知道IDF值在一定程度上可以表达一个词的重要程度,像“我的”,“你的”这样的关键字肯定无法判断出文章的类别,他们的IDF值也是较低的。而“AK47”,“火箭炮”这样的关键字可以判断出文章类别,他们的IDF也比一般的词要高。所以,我们只需要选择IDF高于一定值的词,就可以提取出绝大多数关键字了。
2.关键字分类
识别关键字的类别也是一个大问题,如果手工识别是不现实的,网上也没有什么算法是进行关键字分类的。想来想去,最后还是用IDF值把这个问题给解决了。其实思路很简单,可以说是上面一个问题的一种延续。假设现在我们有军事,经济,人文的文本各100篇。将经济,人文的文章复制4次,这样,我们就有军事文本100篇,经济,人文的文本各500篇(注意,经济人文的文章都是有重复的,每篇文章存在4个完全相同的副本)。
然后我们计算这些文章的IDF值,想想会出现什么结果?我们知道IDF的计算公式是log(总文章数/出现次数)。假设关键字“AK47”在没进行处理之前,在10篇文章中出现,那么它的值为log(300/10)=log30=1.47.
处理之后,“AK47”出现的次数不变,但是总文章数已经变为1100篇,那么AK47的IDF值为:log(1100/10)=log110=2.04。我们可以看到,经过这样的处理,军事的关键字都得到了加权,但是经济,文化的关键字的IDF值变化很小。这样,我们就能够把军事的关键字同其他的关键字区分开来。
我做的实验中,分出的关键字至少80%是军事类别的,实际的例子就不贴出来了。有的朋友就会问了,那你是怎么进行文本分类的?难道也是手工分?
嘿嘿,这个当然不是了。分好类的文本来自于搜狗实验室(http://www.sogou.com/labs/dl/c.html)。上面的类别也只有几种,如果要做其他类别的样本,只要用爬虫抓取某个专业网站或者某一类新闻,然后进行分析出正文就OK了。我们的目标是尽量偷懒,呵呵。
------------------------------------------------
解决了这两个难题,再回到算法本身来。首先,提取关键字,使得要比较的词语大大减少(我只提取15%~20%的关键字)。一篇1000字的文章词语也就那么300~400个,也就是说和一个类别比较50个关键字左右就可以判断出来了,也就是50次的hashmapping操作。然后,有几个类别就做几次判断,所以算法复杂度是O(m*n)。一般分成十几个类别已经很细了,整个算法复杂度不会很高。但是这个实验我没能做就申请离职了,伤心啊,我的心血都没了,如果以后有时间再实验下吧。
http://lucene-group.group.javaeye.com/group/topic/6503
简单的说下原理吧,如果某篇文章包含有很多军事类别的关键字,那么该文章很有可能就是军事方面的文章。OK,这样的话我们只需要从文章中提取关键字,然后对这些关键字的类别进行判断,就可以得到文章的类别了。
这样我们可以得出这个算法的重点:
1.提取关键字
如何自动提取关键字呢?我们知道IDF值在一定程度上可以表达一个词的重要程度,像“我的”,“你的”这样的关键字肯定无法判断出文章的类别,他们的IDF值也是较低的。而“AK47”,“火箭炮”这样的关键字可以判断出文章类别,他们的IDF也比一般的词要高。所以,我们只需要选择IDF高于一定值的词,就可以提取出绝大多数关键字了。
2.关键字分类
识别关键字的类别也是一个大问题,如果手工识别是不现实的,网上也没有什么算法是进行关键字分类的。想来想去,最后还是用IDF值把这个问题给解决了。其实思路很简单,可以说是上面一个问题的一种延续。假设现在我们有军事,经济,人文的文本各100篇。将经济,人文的文章复制4次,这样,我们就有军事文本100篇,经济,人文的文本各500篇(注意,经济人文的文章都是有重复的,每篇文章存在4个完全相同的副本)。
然后我们计算这些文章的IDF值,想想会出现什么结果?我们知道IDF的计算公式是log(总文章数/出现次数)。假设关键字“AK47”在没进行处理之前,在10篇文章中出现,那么它的值为log(300/10)=log30=1.47.
处理之后,“AK47”出现的次数不变,但是总文章数已经变为1100篇,那么AK47的IDF值为:log(1100/10)=log110=2.04。我们可以看到,经过这样的处理,军事的关键字都得到了加权,但是经济,文化的关键字的IDF值变化很小。这样,我们就能够把军事的关键字同其他的关键字区分开来。
我做的实验中,分出的关键字至少80%是军事类别的,实际的例子就不贴出来了。有的朋友就会问了,那你是怎么进行文本分类的?难道也是手工分?
嘿嘿,这个当然不是了。分好类的文本来自于搜狗实验室(http://www.sogou.com/labs/dl/c.html)。上面的类别也只有几种,如果要做其他类别的样本,只要用爬虫抓取某个专业网站或者某一类新闻,然后进行分析出正文就OK了。我们的目标是尽量偷懒,呵呵。
------------------------------------------------
解决了这两个难题,再回到算法本身来。首先,提取关键字,使得要比较的词语大大减少(我只提取15%~20%的关键字)。一篇1000字的文章词语也就那么300~400个,也就是说和一个类别比较50个关键字左右就可以判断出来了,也就是50次的hashmapping操作。然后,有几个类别就做几次判断,所以算法复杂度是O(m*n)。一般分成十几个类别已经很细了,整个算法复杂度不会很高。但是这个实验我没能做就申请离职了,伤心啊,我的心血都没了,如果以后有时间再实验下吧。
http://lucene-group.group.javaeye.com/group/topic/6503
相关文章推荐
- 一种根据关键字进行分类的文本分类算法
- 采用Weka中的KNN算法进行文本分类
- 利用TFIDF策略和朴素贝叶斯算法进行中文文本分类
- php 根据用户提交关键字,进行搜索展示(按行 文本)
- 逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是分类和预测算法中的一种。通过历史数据的表现对未来结果发生的概率进行预测。例如,我们可以将购买的概率设置为因变量,将用户的
- 朴素贝叶斯算法进行文本分类
- 根据文本对输入的字符串进行加密解密操作
- 文本分类算法之--贝叶斯文本分类算法
- 利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签
- 短文本/Query分类算法特征选择
- 使用fastText进行文本分类
- 特征词选择算法对文本分类准确率的影响(三)
- 实习生的监控算法: 利用机器学习方法进行曲线分类
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
- TextRank算法为文本生成关键字和摘要
- 一个迭代小算法,根据指定的个数对下标进行分组
- 基于朴素贝叶斯分类器的文本分类算法(下)
- 算法实战:根据Key或Value对Map进行排序及其应用
- 基于朴素贝叶斯分类器的文本分类算法的实现过程分析
- 根据CAP原理对NoSQL产品进行分类