近几天在看一个文本分类的程序,写一下具体的实现过程。有的时候看了算法,感觉很明白了,但是自己实现的时候却又无从下手。这次从一个实际程序出发,或许能够更好的理解。
首先是训练数据集和测试数据集。每个文档一行, 主要包括 <class>1</class><title>asdfgh</title><content>asdfghjkl</content>等项目。届时程序会按行读取,每行读一个文档。
特征选择分以下几个步骤:
1.设置特征向量的维数:一般以3000为佳;
2.对训练数据做处理;
3.加载停用词;
4.针对不同特征选择算法的处理;
4.是否检查某些词语(?啥);
5.输出选择的特征项;
主要是第二步的预处理:
1.首先按行读取文件,每行是一个文档,doc;注意,以下几项都是对一个文档的处理;然后循环处理每个文档,直至文件结束;
2.对每个文档做处理,提取出其中的各个item,包括label,即class标签内的。title和content等;
3.若是中文数据集,调用分词模块做分词,英文数据集直接用字符流处理。分词结果保存在一个vector中;
4.接下来这一步是至关重要的,生成全局词典:
(1)将分词结果保存在一个map变量中,map<string, uint> wordsMap;第一项为词语,第二项为该词出现的次数;同时,定义变量wordsNum,记录该文档中出现的总词数;
(2)保存每个类别中的总文档数目和总词数;定义一个结构体,包含三个变量,一个类标,一个是总文档数;一个是总词数;放入一个全局的vector;
(3)这一步处理的信息很重要,生成全局词典:这个map的第一项为相应的term,第二项是一个结构体的vector,这个结构体包括类标名、文档数、该词出现的次数;因为一个term可能在多个类中出现,所以用vector来存储。vector的长度就是该term属于哪个类。
4(3)中生成的这个全局词典非常重要,后面各个算法都是用的这里面的信息。待续……