您的位置:首页 > 其它

一种根据关键字进行分类的文本分类算法

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: