五年前做的一个很有意思的项目,印象深刻,翻了一下以前的代码,现在做个整理。
当时的需求是,提供了一些不同类别的样本文档,人事相关,财务相关,公司通告相关等等类别,需要根据样本数据训练模型,然后根据模型识别一份未分类的文档类型,给出最佳分类的百分比。这可能就是个简单的机器学习的应用,但当时本人对机器学习丝毫不懂,看了几天资料,也无法将看到的例子和这个场景结合应用起来。后来觉得用ik分词器和tf/idf算法的一些原理,也可以实现这种效果,可能不太精确,但项目的要求并不是很高。
ik分词器,很常用的一个分词器,基于词库进行分词。我的想法是,准备一个全面的大的词库作为基础分词器,然后针对样本的不同类别构建多个子分词器,子分词器的词库是和各个类别相关的词。通过样本数据提取出和各个类别最相关的一批词作为子分词器词库,这就是模型训练。模型训练好后,用各个类别的子分词器对新的文档进行分词,根据分词结果计算出文档最贴近的那一类别。
首先需要改造下ik分词器,允许创建多个分词实例,并创建管理者对象,集中管理这些分词器。这一步相对简单。
接下来准备词库,基础分词器的词库很好解决,可以从搜狗输入法的网站中搜集各种类型的词,全部堆到基础词库里,多多益善。
难点的在于提取各个类别的词库。这里用到 tf/idf算法的一些思想,如果某个词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。利用这个思想,我将所有的样本数据进行分词,统计每个分词在文档中出现的总次数 count,以及在各个类别文档中出现的次数 categoryCount,通过 categoryCount /count , 这个值越高,就表示这个词越能代表这个类别。进行计算后,取每个类别代表值排在前百分之十的词作为该分类的词库,也可以取百分之二十,可以调节。
接下来进行文档类型识别,用各个类别的分词器去对新的文档进行分词,对匹配到的词,先我们有记录这个词在这一分类的代表值,也就是上面的 categoryCount /count 值 ,这是个百分比。将这一分类所有匹配到的词的代表值相加,在除以匹配到的词的个数,就得到了这个文档在这一分类的匹配百分比,这个值越高则表示贴近这一分类。
整个计算逻辑很粗糙,精确度很低,好在项目要求不高。