转载自:http://blog.csdn.net/samule704/article/details/5118425
近期刚刚开始进入 SE 的领域,觉得这里面确实有很多值得研究的东西,从 网络爬虫 到 网页信息的抽取 再到 文本关键词的提取 以及用户检索(个性化SE) 等等 包罗万象。
下午玩完,先来无事,再次浏览了一下 蛙蛙池塘 的博客,觉得里面的对关键词的提取算法还不错,所以个人又在上午实验的基础上,完善了下这部分。
对于该部分,蛙蛙池塘 的实现我觉得有一点是不合理的(个人意见):对于词频的统计应该是该词在该类中所出现的所有次数(如:在某一类(1,2,4)中,单词A在1中出现的次数是3次, 在4中出现的次数是1次, 在 2中出现了 0次, 那么单词A的词频应该是 3+1+0 =4 , 而不是 1+1+0=2 )
输入数据是:
测试输入如下
================================
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 杭州 股民 放 鞭炮 庆祝 印花税 下调
================================
具体的Java实现如下: 只列举了 GetKeyword的实现
public List<String> GetKeyword(List<Integer> arr, int count) {
// 1、给每个文档分词并保存在一个列表里
List<String> allWords = new ArrayList<String>();
for (int i = 0; i < arr.size(); i++) {
// 这里把一个文档里出现的多个词进行消重
List s1 = this._tokenizer.Partition(_docs[arr.get(i)]);
String[] s2 = this.GetDistinctWords((String[]) s1
.toArray(new String[s1.size()]));
for (int i1 = 0; i1 < s2.length; i1++)
allWords.add(s2[i1]);
}
// 2、用一个字典保存词的词频,key是词,value是重复次数
Map.Entry[] tfDict = SortByDuplicateCount(allWords);
// 3、遍历已排序的词频字典,并获取每个词的IDF值,并把更新后的结果放入一个tfidfDict词典
// 该词典的key是词,value是tfidf值
Map<String, Float> tfidfDict = new HashMap<String, Float>();
for (int i = 0; i < tfDict.length; i++) {
int termt = (Integer) tfDict[i].getValue();
String term = (String) tfDict[i].getKey();
{
int index = this._wordsIndex.get(term);
float idf = GetInverseDocumentFrequency(index);
// System.out.println(tfDict[i].getKey()+" 词频:"+ termt
// +"文档频率:"+idf+" "+termt * idf);
tfidfDict.put(term, termt * idf);
}
}
// 4、给tfidf字典俺权重排序
Map.Entry[] tfidfDictSet = SortMap.getSortedHashtableByValue(tfidfDict);// GetSortByValueDict(tfidfDict);
// 5、更新要提取的关键词数量
int keywordCount = count;
if (keywordCount > tfidfDict.size())
keywordCount = tfidfDict.size();
// 6、用一个数组保存tfidf字典的keys,这些key已排序
// String[] keywordArr = new String[tfidfDict.size()];
// tfidfDict.Keys.CopyTo(keywordArr,0);
// Set keySet = tfidfDict.keySet();
// 7、在关键词数组里取出前几个关键词返回给调用者
List<String> result = new ArrayList<String>(keywordCount);
int tempCount = 0;
for (int i = 0; i < tfidfDictSet.length; i++) {
tempCount++;
result.add((String) tfidfDictSet[i].getKey());
if (tempCount >= keywordCount)
break;
}
return result;
}
输出数据:
Iteration 0...
Iteration 1...
Iteration 2...
-----------------
0 聚类成员是 :[3, 5, 9, 10, 11]
a ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析
a asp.net 控件 开发 显示 控件 内容
a 介绍 一 个 ASP.net MVC 系列 教程
a 在 asp.net 中 实现 观察者 模式 ,或 有 更 好 的 方法 (续)
a 输 大钱 的 股民 给 我们 启迪
-------------asp.net 控件 ---
-----------------
1 聚类成员是 :[0, 4, 6, 8]
a 奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面
a 运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制
a 奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款
a 残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一 拳击
-------------奥运 拳击 ---
-----------------
2 聚类成员是 :[1, 2, 7, 12, 13]
a 股民 要 清楚 自己 的 目的
a 印花税 之 股民 四季
a 某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民
a Asp.Net 页面 执行 流程 分析
a 杭州 股民 放 鞭炮 庆祝 印花税 下调
-------------股民 印花税 ---