Java编程实现提取文章中关键字的方法

 更新时间:2015年11月05日 15:08:30   作者:awj3584  
这篇文章主要介绍了Java编程实现提取文章中关键字的方法,较为详细的分析了Java提取文章关键字的原理与具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Java编程实现提取文章中关键字的方法。分享给大家供大家参考,具体如下:

实现代码:

/**
 * 相关的jar包
 * lucene-core-3.6.2.jar,lucene-memory-3.6.2.jar,
 * lucene-highlighter-3.6.2.jar,lucene-analyzers-3.6.2.jar
 * IKAnalyzer2012.jar
 *
 * 截取一片文章中频繁出现的关键字,并给予分组排序(倒叙),以数组格式返回n个关键字
 *
 * 并该类内部含有一个List2Map方法,可将重复<String>集合转换为Map<String, Integer>格式
 * 并算出该<String>重复次数,放入相应的value中
 */
package com.lifeix.api.util; 
import java.io.IOException; 
import java.io.StringReader; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import org.apache.lucene.analysis.TokenStream; 
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 
import org.wltea.analyzer.lucene.IKAnalyzer; 
/** 
 * 获取文章关键字 
 * @author anwj 
 * 
 */ 
public class WordUtil { 
 /** 测试文章 */ 
 static String keyWord = "笑星潘长江当上“男媒婆”了,但这回可不是演小品——由他自编自导自演的都市喜剧《男媒婆》将于1月13日在北" + 
   "京卫视首播。剧中,潘长江变身成为能说会道、古道热肠的“新时代男媒婆”丁二春,与“台湾第一酒窝美女2”张庭上演了一出“屌丝逆袭”" + 
   "的浪漫追爱记。李明启、李文启、冯远征、任程伟、马丽、徐等明星也齐齐上阵制造“笑料”《男媒婆》围绕着丁二春和他所开" + 
   "办的“全成热恋”婚介所展开。人到中年的丁二春眼看来势汹涌的“婚恋大潮”商机不断,想凭借一张巧嘴开创事业和人生" + 
   "“第二春”。婚介所开张大吉,顾客盈门,提出的要求却也千奇百怪,拜金女、宅男、小老板粉墨登场,展开了一系列令人捧腹" + 
   "大笑又不失温情的精彩故事。剧中的一大看点是美女搭配“丑男”的搭配,张庭与潘长江成了一对欢喜冤家。张庭表示,剧中两人“" + 
   "身高有差距、年龄有距离,相貌不对等”。而潘长江谈到这种主角设定时认为:“张庭以往的角色都特别独立、可爱,而‘大女人'和‘" + 
   "小男人'正是我俩这对情侣的设定,所以张庭是非常合适的人选。”此外,该剧也是潘长江继《能人冯天贵》、《清凌凌的水蓝莹莹的天》" + 
   "第一、第二部之后第四次自导自演的喜剧作品。潘长江表示,全剧通过“媒婆”这个特殊职业的视角,展示着当代社会种种婚恋价值观,涵盖了" + 
   "黄昏恋、拜金女、凤凰男等诸多引发热议的时代话题。(记者 尹春芳)免责声明:本文仅代表作者个人观点,与环球网无关。其原创性以及文中" + 
   "陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考," + 
   "并请自行核实相关内容。"; 
 /** 获取关键字个数 */ 
 private final static Integer NUM=5; 
 /** 截取关键字在几个单词以上的数量 */ 
 private final static Integer QUANTITY=1; 
 /** 
  * 传入String类型的文章,智能提取单词放入list中 
  * @param article 
  * @param a 
  * @return 
  * @throws IOException 
  */ 
 private static List<String> extract(String article,Integer a) throws IOException { 
  List<String> list =new ArrayList<String>(); //定义一个list来接收将要截取出来单词 
  IKAnalyzer analyzer = new IKAnalyzer(); //初始化IKAnalyzer 
  analyzer.setUseSmart(true); //将IKAnalyzer设置成智能截取 
  TokenStream tokenStream= //调用tokenStream方法(读取文章的字符流) 
    analyzer.tokenStream("", new StringReader(article)); 
  while (tokenStream.incrementToken()) { //循环获得截取出来的单词 
   CharTermAttribute charTermAttribute = //转换为char类型 
     tokenStream.getAttribute(CharTermAttribute.class); 
   String keWord= charTermAttribute.toString(); //转换为String类型 
   if (keWord.length()>a) { //判断截取关键字在几个单词以上的数量(默认为2个单词以上) 
    list.add(keWord); //将最终获得的单词放入list集合中 
   } 
  } 
  return list; 
 } 
 /** 
  * 将list中的集合转换成Map中的key,value为数量默认为1 
  * @param list 
  * @return 
  */ 
 private static Map<String, Integer> list2Map(List<String> list){ 
  Map<String, Integer> map=new HashMap<String, Integer>(); 
  for(String key:list){ //循环获得的List集合 
   if (list.contains(key)) { //判断这个集合中是否存在该字符串 
    map.put(key, map.get(key) == null ? 1 : map.get(key)+1); 
   } //将集中获得的字符串放在map的key键上 
  } //并计算其value是否有值,如有则+1操作 
  return map; 
 } 
 /** 
  * 提取关键字方法 
  * @param article 
  * @param a 
  * @param n 
  * @return 
  * @throws IOException 
  */ 
 public static String[] getKeyWords(String article,Integer a,Integer n) throws IOException { 
  List<String> keyWordsList= extract(article,a); //调用提取单词方法 
  Map<String, Integer> map=list2Map(keyWordsList); //list转map并计次数 
  //使用Collections的比较方法进行对map中value的排序 
  ArrayList<Entry<String, Integer>> list = new ArrayList<Entry<String,Integer>>(map.entrySet()); 
  Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 
   public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
    return (o2.getValue() - o1.getValue()); 
   } 
  }); 
  if (list.size()<n) n=list.size(); //排序后的长度,以免获得到null的字符 
  String[] keyWords=new String[n]; //设置将要输出的关键字数组空间 
  for(int i=0; i< list.size(); i++) { //循环排序后的数组 
   if (i<n) { //判断个数 
    keyWords[i]=list.get(i).getKey(); //设置关键字进入数组 
   } 
  } 
  return keyWords; 
 } 
 /** 
  * 
  * @param article 
  * @return 
  * @throws IOException 
  */ 
 public static String[] getKeyWords(String article) throws IOException{ 
  return getKeyWords(article,QUANTITY,NUM); 
 } 
 public static void main(String[] args) { 
  try { 
   String [] keywords = getKeyWords(keyWord); 
   for(int i=0; i<keywords.length; i++){ 
    System.out.println(keywords[i]); 
   } 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
 } 
}

希望本文所述对大家Java程序设计有所帮助。

相关文章

  • 关于Spring的@Autowired依赖注入常见错误的总结

    关于Spring的@Autowired依赖注入常见错误的总结

    有时我们会使用@Autowired自动注入,同时也存在注入到集合、数组等复杂类型的场景。这都是方便写 bug 的场景,本篇文章带你了解Spring @Autowired依赖注入的坑
    2021-09-09
  • 深入理解Java中1是true0是false

    深入理解Java中1是true0是false

    Java中,1可以被看作是true,0可以被看作是false,本文就来进行详细的讲解,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java多线程中ReentrantLock与Condition详解

    Java多线程中ReentrantLock与Condition详解

    这篇文章主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
    2017-11-11
  • Java读取.properties配置文件方法示例

    Java读取.properties配置文件方法示例

    这篇文章主要介绍了Java读取.properties配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot集成swagger-ui以及swagger分组显示操作

    SpringBoot集成swagger-ui以及swagger分组显示操作

    这篇文章主要介绍了SpringBoot集成swagger-ui以及swagger分组显示操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 详解Springboot 注入装配到IOC容器方式

    详解Springboot 注入装配到IOC容器方式

    今天通过实例代码给大家介绍了Springboot 注入装配到IOC容器方式,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧
    2021-10-10
  • 分布式Netty源码分析概览

    分布式Netty源码分析概览

    这篇文章主要为大家介绍了分布式Netty源码分析概览,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 关于IDEA配置文件字符集的问题

    关于IDEA配置文件字符集的问题

    这篇文章主要介绍了关于IDEA配置文件字符集的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Springboot项目升级2.2.x升至2.7.x的示例代码

    Springboot项目升级2.2.x升至2.7.x的示例代码

    本文主要介绍了Springboot项目升级2.2.x升至2.7.x的示例代码,会有很多的坑,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot 集成短信和邮件的配置示例详解

    SpringBoot 集成短信和邮件的配置示例详解

    这篇文章主要介绍了SpringBoot 集成短信和邮件的相关知识,项目中使用lombok插件和swagger依赖,无相关依赖的请自行修改,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论