首先需要的jar包

       下载apache的lucene-core-3.6.2.jar,lucene-highlighter-3.6.2.jar,lucene-memory-3.6.2.jar,lucene-analyzers-3.6.2.jar和一个开源的工具包IKAnalyzer2012.jar。

   版本一样要对应好IKAnalyzer2012之前的版本只支持到lucene3.3之前版本,版本最是坑爹啊。

如果需要使用xml配置,匹配单词和拦截单词时,必须使用相应的字符格式。


/**
 * 相关的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方法,可将重复集合转换为Map格式
 *      并算出该重复次数,放入相应的value中
 */
package com.gjz.get;
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;
/**
 * 获得关键字方法类
 * @创建人 PengBo
 * @创建时间 2013-6-8  下午4:25:23
 */
public class WordUitl {
                                                                                                                                                                                                                                           
    /** 测试文章 */
    static String keyWord = "冗长的代码常常是复杂性的标志,会导致代码难以测试和维护." +
            "这是一道逻辑计算题,先不说1+2=?的问题,你肯定要知道1+1=2,否则你无法知道2是怎么来的。" +
            "冗长的代码常常是复杂性的标志,会导致代码难以测试和维护." +
            "这是一道逻辑计算题,先不说1+2=?的问题,你肯定要知道1+1=2,否则你无法知道2是怎么来的。" +
            "冗长的代码常常是复杂性的标志,会导致代码难以测试和维护.";
    /** 获取关键字个数 */
    private final static Integer NUM=5;
    /** 截取关键字在几个单词以上的数量 */
    private final static Integer QUANTITY=1;
    /**
     * 传入String类型的文章,智能提取单词放入list中(可以设置xml中的条件)
     * @param article
     * @return
     * @throws IOException
     * @创建人 PengBo
     * @创建时间 2013-6-7  上午11:56:53
     */
    @SuppressWarnings("resource")
    private static List extract(String article,Integer a) throws IOException {
        List list =new ArrayList();         //定义一个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  返回一个key不可重复的map
     * @创建人 PengBo
     * @创建时间 2013-6-7  上午11:52:44
     */
    private static Map list2Map(List list){
        Map map=new HashMap();
         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;
    }
                                                                                                                                                                                                                                           
/**
 * 可选提取关键字方法
 * 调用extract方法获得关键字列表 并转为Map
 * 将map按照value进行排序,并返回想要钱几位的一个数组
 * @param article 需要获得关键字的文章
 * @param a 截取关键字在几个单词以上的数量
 * @param n 需要获得几位关键字的条件
 * @return 前位关键字
 * @throws IOException
 * @创建人 PengBo
 * @创建时间 2013-6-7  下午12:57:48
 */
    public static String[] getKeyWords(String article,Integer a,Integer n) throws IOException {
                                                                                                                                                                                                                                               
        List keyWordsList= extract(article,a);            //调用提取单词方法
        Map map=list2Map(keyWordsList);      //list转map并计次数
        //使用Collections的比较方法进行对map中value的排序
        ArrayList> list = new ArrayList>(map.entrySet());
        Collections.sort(list, new Comparator>() {
            public int compare(Map.Entry o1, Map.Entry o2) {
                return (o2.getValue() - o1.getValue());
            }
        });
        if (list.size()article 文章
     * @return 返回5个关键字,关键字为2个字以上的词语
     * @throws IOException
     * @创建人 PengBo
     * @创建时间 2013-6-8  下午4:20:47
     */
    public static String[] getKeyWords(String article) throws IOException{
        return getKeyWords(article,QUANTITY,NUM);
    }
}

OK 返回n个词语。


哦忘了 有可控制的xml配置 发过来IKAnalyzer.cfg.xml




    IK Analyzer 扩展配置
    
    
    stopword.dic;
                                                                                                                                                                                                                                                                                                                          


此为文件包自带的xml文件 没有修改,也懒的去改,测试了个停词的文档stopword.dic

1
2
3
4
5
6
常


测试了清楚1-6数字和汉字功能完全可以,只要将xml文件配置到src下即可,上课例子的图片记录下

在文章中获取关键字_第1张图片

齐活。