欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

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


解决思路:

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)算法,基于贝叶斯公式的算法。以及遗传算法。因为贝叶斯公式和遗传算法太出名,这里就不介绍了。(貌似科学松鼠会就有科普文章。)

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

相关标签: php