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程序设计有所帮助。

(0)

相关推荐

  • Java实现将数字日期翻译成英文单词的工具类实例

    本文实例讲述了Java实现将数字日期翻译成英文单词的工具类.分享给大家供大家参考,具体如下: package com.sunyard.etp.ag.util; import java.math.BigDecimal; import java.util.Arrays; public class DateEngUtil { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated meth

  • Java中判断字符串是中文或者英文的工具类分享

    直接上代码: 复制代码 代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /**  *  * <p>  * ClassName ShowChineseInUnicodeBlock  * </p>  * <p>  * Description 提供判断字符串是中文或者是英文的一种思路  * </p>  *  * @author wangxu wangx89@126.com

  • Java正则表达式提取字符的方法实例

    正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐.于是想到用正则表达式来完成.项目需求是这样的:需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6 实现方法: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s

  • java 字浮串提取方法汇集

    该方法把该字符串转换成一个新的字符数组. String str="abcdefg"; char a[]; a=str.toCharArray(); 也可以用方法: getChars public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) 从该字符串中拷贝字符到目的字符数组中. 第一个要复制的字符在索引 srcBegin 处: 最后一个要复制的字符在索引 srcEnd-1 处(因此要复制的字符总数就

  • 利用java实现单词倒序排列

    本文就是会将数组里面的单词进行倒序排列 例如 how old are you -> you are old how 示例程序输出结果: the first: How old are you !? I don't understand the second: understand don't I ?! you are old How 示例代码 public static void main(String[] args) { char[] chars= new String("How old

  • Java实现对一行英文进行单词提取功能示例

    本文实例讲述了Java实现对一行英文进行单词提取功能.分享给大家供大家参考,具体如下: package fanyi; import java.util.Scanner; import java.util.StringTokenizer; public class text { public static void handle(String eString) { StringTokenizer st = new StringTokenizer(eString,",!' '.;"); w

  • java中判断字段真实长度的实例(中文2个字符,英文1个字符)

    实例如下: public class Char_cn { public static void main(String[] args) { // TODO Auto-generated method stub String haha = "我叫兜兜abcd"; int true_num = String_length(haha); System.out.println("true" + true_num); int false_num = haha.length()

  • Java统计输入字符的英文字母、空格、数字和其它

    题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 程序分析:利用while语句,条件为输入的字符不为 '\n '. 程序设计: import java.util.Scanner; public class ex7 { public static void main(String args[]) { System.out.println("请输入字符串:"); Scanner scan=new Scanner(System.in); String str=scan

  • Java 区分文本中的中英文字符函数

    复制代码 代码如下: public class EnCnTest { public static void main(String args[]) { byte buf[] = args[0].getBytes(); boolean halfChinese = false; for(int i=0;i { if(halfChinese) { byte ch[] = {buf[i-1],buf[i]}; System.out.println("索引"+(i-1)+"位置为中文(

  • Java简单统计字符串中汉字,英文字母及数字数量的方法

    本文实例讲述了Java简单统计字符串中汉字,英文字母及数字数量的方法.分享给大家供大家参考,具体如下: package org.zhy.demo.algorithm; /** * 有一个字符串,其中包含中文字符.英文字符和数字字符,请统计和打印出各个字符的个数 * * @author Administrator * */ public class Str { public static void main(String[] args) { String str = "adasfAAADFD阿萨德

  • java统计字符串单词个数的方法解析

    在一些项目中可能需要对一段字符串中的单词进行统计,我在这里写了一个简单的demo,有需要的同学可以拿去看一下. 不说废话了直接贴代码: 实现代码: /** * 统计各个单词出现的次数 * @param text */ public static void findEnglishNum(String text){ //找出所有的单词 String[] array = {".", " ", "?", "!"}; for (int

  • java识别一篇文章中某单词出现个数的方法

    本文实例讲述了java识别一篇文章中某单词出现个数的方法.分享给大家供大家参考.具体如下: 1. java代码: import java.io.DataInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.StringTokenizer; import java.util.regex.Matche

随机推荐