上一节做了分词器的实现,并实现了Simple、Standar、Cn、ICTCLAS几个分词算法。本节实现文档转向量表示,并命名为特征权重量化器,特征权重量化器我只实现1个算法----TFIDF算法。
项目类图如下:
测试程序如下:
Code
1namespace Waemz.ChnGlobal.Test
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 string[] docs = new string[5];
8 docs[0] = "SimpleSpliter的分词方法是以空格、或标点分词,并去掉了标点";
9 docs[1] = "StandarSpliter的粉刺方法是中文单字分词,英文以空格分词,并去掉了标点";
10 docs[2] = "CnSpliter的分词方法是中文单字分词,对单个无意义的英文字母直接去掉了;-_-!";
11 docs[3] = "ICTCLAS的分词方法比较适合使用,对“我们“、”是“这样的无意义中文进行了过滤,中文分词效果也比较理想。";
12 docs[4] = "我自己简易封装了一个分词器,使用Lucene.Net.类图如下";
13
14 string[][] terms = new string[5][];
15
16 AbsChnSpliter spliter = new ICTCLASSpliter();
17 for (int i = 0; i < 5; i++)
18 {
19 string str = spliter.ChnSplit(docs[i], "|");
20 terms[i] = str.Split('|');
21 }
22
23 AbsMeasure mea = new TFIDFMeasure(terms);
24
25 double[][] vectors = new double[5][];
26 for (int i = 0; i < 5; i++)
27 {
28 vectors[i] = mea.GetVectorMeasure(i);
29 }
30
31 for (int i = 0; i < vectors.Length; i++)
32 {
33 for (int j = 0; j < vectors[i].Length; j++)
34 {
35 Console.Write(vectors[i][j]+"--");
36 }
37 Console.WriteLine("\n\n");
38 }
39
40 Console.ReadKey();
41
42
43
44 }
45 }
46}
1namespace Waemz.ChnGlobal.Test
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 string[] docs = new string[5];
8 docs[0] = "SimpleSpliter的分词方法是以空格、或标点分词,并去掉了标点";
9 docs[1] = "StandarSpliter的粉刺方法是中文单字分词,英文以空格分词,并去掉了标点";
10 docs[2] = "CnSpliter的分词方法是中文单字分词,对单个无意义的英文字母直接去掉了;-_-!";
11 docs[3] = "ICTCLAS的分词方法比较适合使用,对“我们“、”是“这样的无意义中文进行了过滤,中文分词效果也比较理想。";
12 docs[4] = "我自己简易封装了一个分词器,使用Lucene.Net.类图如下";
13
14 string[][] terms = new string[5][];
15
16 AbsChnSpliter spliter = new ICTCLASSpliter();
17 for (int i = 0; i < 5; i++)
18 {
19 string str = spliter.ChnSplit(docs[i], "|");
20 terms[i] = str.Split('|');
21 }
22
23 AbsMeasure mea = new TFIDFMeasure(terms);
24
25 double[][] vectors = new double[5][];
26 for (int i = 0; i < 5; i++)
27 {
28 vectors[i] = mea.GetVectorMeasure(i);
29 }
30
31 for (int i = 0; i < vectors.Length; i++)
32 {
33 for (int j = 0; j < vectors[i].Length; j++)
34 {
35 Console.Write(vectors[i][j]+"--");
36 }
37 Console.WriteLine("\n\n");
38 }
39
40 Console.ReadKey();
41
42
43
44 }
45 }
46}
测试结果输出如下:
需要完善的地方:
1、根据TFIDF计算出的向量表示维数很高,一般维数等于所有样本中消去重复词后词的数目,下一步进行降维。降维我现有的思路是:(1)事先进行特征选取(特征选取方法有信息增益、卡方检验),然后再用TFIDF进行特征提取;(2)计算出TFIDF后进行降维。(3)在分词阶段对停用词、标点符号等特殊字符的有效过滤也实际上起到降维的作用,而实际上标点符号对文档来说是没有作用的。(4)在文本分类中,还可以事先建立与分类相关的专业词汇库,特征提取时与词汇库比较,词汇库中不存在的词,认为是对分类没有意义的词。这样进行降维。
稍后贴出代码下载.