获取文章中的关键字


最近在做关于搜索方面的程序,查阅了许多资料,写下了下面的代码,已做后备

jar包下载地址:http://download.csdn.net/detail/zwdsmileface/8678353
 

 
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 = "丢失一条红色的狗";
	/** 获取关键字个数 */
	private final static Integer NUM=30;
	/** 截取关键字在几个单词以上的数量 */
	private final static Integer QUANTITY=2;
	
	/**
	 * 传入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();
		}
	}
}


 
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值