文本关键词的提取算法实验

来源:互联网 发布:java权限管理系统demo 编辑:程序博客网 时间:2024/05/18 17:44

     近期刚刚开始进入 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 杭州 股民 放 鞭炮 庆祝 印花税 下调
-------------股民  印花税  ---

 

 

 

 

 

原创粉丝点击