首页 >社区问答列表 >php - SCWS演示站中文本自动分类是如何实现的

php - SCWS演示站中文本自动分类是如何实现的

这是网址,我尝试了一些文本的输入,匹配的准确度挺高的,它实现的原理是什么?是否是检索已有的数据库来匹配文本?我在网上查了很久也没找到关于这方面的资料,哪里能有参考资料下载?

  • 怪我咯
  • 怪我咯    2017-04-10 14:41:581楼

    SCWS 是个 PHP 代码的分词库。这个自动分类没有开源,不知道它具体是怎么做的。

    可能的思路是:

    SCWS给文本分词,分词之后,进行分析。(也许需要去一点噪音,比如“的”、“了”之类。)

    最简单粗暴的方法,维护一个分类的字典,某一分类下有一堆词,如果这堆词中的任何一个在文本中出现了,就加1分,然后统计每个分类所得的分数,最后计算出所属分类。

    如果嫌上面的太简单粗暴,那么我们可以改进:

    细化一些规则。比如,分类的字典里,某一分类下的词中,一部分词比另一部分词和这个分类联系更紧密,把这个权重算进去。文章开头和结尾出现的词,权重更大,强调结构中的词权重更大,等等。再比如,如果我们有把握某一分类下的文本不太可能出现某些词,那么一旦文本中出现了这些词,这个文本属于那一类的概率要给它调低。

    简单来说,就是分词把文本变成词集,然后再按照制定的规则进行分析。

    然后规则不一定要我们一条一条地写出来,可以让机器自动去“发现”。这就是统计分析。一般而言我们先有一堆分好类的文本作标准,然后,用机器去分析这些分好类的范本,来挖掘词与类的联系。然后机器将学习所得应用到新的词集上,计算出所属的类。

    整个过程可以反复进行,就是说如果我们感觉计算结果不精确,可以调整参数什么的,如果感觉精确,可以把结果加到范本里。范本越多,机器的判断一般就会更准确。

    上面提到“挖掘词与类的联系”,这实际包含两方面,首先我们要找出和分类关系最紧密的那些词,或者说,最能区分自身所属的类别的那些词——也就是特征。

    上面已经提到,出现频率高的词更可能区分文章。按照这个思路去计算,就是一个算法。如果我们考虑到,在所有类型的文本中出现频率较高的词,不太可能区分文章(例如“的”,到处都是高频,没什么用)。那么,我们就要找那些在本文中频率高,而在所有文本中频率不高的词。这个提取特征的算法就叫作“TF-IDF(term frequency–inverse document frequency)”。

    除此之外,还有IG、MI、CHI等算法。上面我们提到“如果我们有把握某一分类下的文本不太可能出现某些词”,类似这样的想法就是这三个算法背后的直觉。IG(Information Gain)统计某个类别的文本中一个词出现和不出现的概率。MI(Mutual Information)考虑的是,如果两个词同时出现,或者一个词出现,另一个不出现,更可能是某一类。(比如,“机器”和“编程”同时出现,那么更可能是编程类,“机器”和“机床”同时出现,加上“编程”、“软件”等词没有出现,那就不太可能是编程类。)在MI的基础上,再加上如果出现了“种马”的就不太可能属于女性向YY小说类的设定,就是CHI(卡方检定——这个名字来源于卡方分布)。

    好了,上面的方法各异,有的方法看上去更完善一点,但是性能可能差一点,还有,完善的方法需要参数找准才行,如果参数不对,可能还拼不过简单的方法。然后,上面的方法都没有考虑词出现的位置,还有改进的空间。例如我们前面说开始、结尾、强调结构等处的词权重要大,这个因素也可以加进去计算,这里不深入。

    不管用哪种方法,假定我们已经提取好了特征,接着就要比较相似度了,最简单的思路,寻找最接近待分类文本的n个样本,然后根据这n个样本的分类,加权每个样本的相似度,就可以计算出最接近哪一类。这个思路,就是KNN(K近邻)算法。

    还有NB(Naïve Bayes)算法,基于贝叶斯公式的算法。以及遗传算法。因为贝叶斯公式和遗传算法太出名,这里就不介绍了。(貌似科学松鼠会就有科普文章。)

    以上都是一些原理的皮毛。深入的话,请找机器学习或者数据挖掘类的书来读。

    +0添加回复

  • 回复