关键词提取算法

摘要:昨天给大家演示简单的文本聚类,但要给每个聚类再提取一两个关键词用于表示该聚类。我们还是用TFIDF算法来做,因为这是比较简单的提取特征算法,不过这里的TF是指某词在本聚类内所有文章的词频,而不是本文章内出现的次数,IDF还是在所有文章里出现的倒文档频率。
原理:1、先给本聚类内的所有文档进行分词,然后用一个字典保存每个词出现的次数
2、遍历每个词,得到每个词在所有文档里的IDF值,和在本聚类内出现的次数(TF)相乘的值
3、用一个字典(key是词,value是TF*IDF权重)来保存所有的词信息,然后按value对字典排序,最后取权重排名靠前的几个词作为关键词

测试输入如下
================================
a 奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面
a 股民 要 清楚 自己 的 目的
a 印花税 之 股民 四季
a ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析
a 运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制
a asp.net 控件 开发 显示 控件 内容
a 奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款
a 某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民
a 残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一
a 介绍 一 个 ASP.net MVC 系列 教程
a 在 asp.net 中 实现 观察者 模式 ,或 有 更 好 的 方法 (续)
a 输 大钱 的 股民 给 我们 启迪
a Asp.Net 页面 执行 流程 分析
a 杭州 股民 放 鞭炮 庆祝 印花税 下调 
================================
数据还是昨天的数据,但每个文章前面都加了个a,所以这个词的IDF肯定很低,如果单村用词频来提取关键词,这个a肯定被当场关键词了,所以要乘以IDF值来调整特征提取的精度。我们要用程序把上面的文档分成3类,并提取每个类的两个关键词

我给TFIDFMeasure类加了一个GetKeyword的方法,第一个参数是传入几个文档id列表,第二个参数是要在这几个文档里提取几个关键词,下面是使用该方法的代码

 

关键词提取算法// 4、初始化k-means算法,第一个参数表示输入数据,第二个参数表示要聚成几个类
关键词提取算法
WawaKMeans kmeans  =   new  WawaKMeans(data, K);
关键词提取算法
// 5、开始迭代
关键词提取算法
kmeans.Start();
关键词提取算法
关键词提取算法
// 6、获取聚类结果并输出
关键词提取算法
WawaCluster[] clusters  =  kmeans.Clusters;
关键词提取算法StringBuilder sb 
=   new  StringBuilder();
关键词提取算法
foreach  (WawaCluster cluster  in  clusters)
------- ");
关键词提取算法    Console.WriteLine(sbTemp);
关键词提取算法
关键词提取算法    
//打印该聚类的成员
关键词提取算法
    sb.Append(sbTemp.ToString());
关键词提取算法    
foreach (int i in members)
{0}
", docs[i]);
关键词提取算法    }

关键词提取算法}

关键词提取算法
关键词提取算法

再看GetKeyword方法的实现

<returns></returns>
关键词提取算法public  IEnumerable < string >  GetKeyword(List < int >  arr,  int  count)
}
关键词提取算法
关键词提取算法


 

这里面用到一个SortByDuplicateCount方法,是对一个集合里的元素按重复次数排序,输出一个字典,字典的key是原始元素,value是出现次数,并按出现次数从大到小排序,像 { "abcd", "ab", "b", "a", "abcd", "ab", "ab", "ab", "cd", "cd", "cd" }这样一个集合应该输入如下结果。
ab-4
cd-3
abcd-2
b-1
a-1
原理是先用一个字典计算每个元素的出现次数,然后把该字典按value的大小排序,下面是实现代码

<returns></returns>
关键词提取算法public   static  Dictionary < T,  int >  SortByDuplicateCount < T > (IList < T >  inputList)
}
关键词提取算法
关键词提取算法


这里用到一个把一个字典按值的大小排序的方法GetSortByValueDict,代码如下,是泛型的

<returns></returns>
关键词提取算法public   static  Dictionary < K, V >  GetSortByValueDict < K,V > (IDictionary < K, V >  distinctDict)
}
关键词提取算法
关键词提取算法


对一个文章内出现的多个词进行消重是因为如果一个文章里堆叠关键词会影响本聚类关键词提取的准确性,所以要排重,算法如下,也是泛型的

<returns></returns>
关键词提取算法public   static  IEnumerable < T >  GetDistinctWords < T > (IEnumerable < T >  scanKeys)
}
关键词提取算法

最后效果如下
Iteration 0...
Iteration 1...
---------asp,net,-------

a ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析
a asp.net 控件 开发 显示 控件 内容
a 介绍 一 个 ASP.net MVC 系列 教程
a 在 asp.net 中 实现 观察者 模式 ,或 有 更 好 的 方法 (续)
a Asp.Net 页面 执行 流程 分析
---------股民,印花税,-------

a 股民 要 清楚 自己 的 目的
a 印花税 之 股民 四季
a 某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民
a 输 大钱 的 股民 给 我们 启迪
a 杭州 股民 放 鞭炮 庆祝 印花税 下调
---------奥运,拳击,-------

a 奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面
a 运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制
a 奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款
a 残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一

可以看到,提取的关键字还是准确的,并没把a当成关键字。