首先需要的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方法,可将重复<String>集合转换为Map<String, Integer>格式 * 并算出该<String>重复次数,放入相应的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<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 返回一个key不可重复的map * @创建人 PengBo * @创建时间 2013-6-7 上午11:52:44 */ 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; } /** * 可选提取关键字方法 * 调用extract方法获得关键字列表 并转为Map<Stting,Integer> * 将map按照value进行排序,并返回想要钱几位的一个数组 * @param <String>article 需要获得关键字的文章 * @param <Integer>a 截取关键字在几个单词以上的数量 * @param <Integer>n 需要获得几位关键字的条件 * @return 前<n>位关键字 * @throws IOException * @创建人 PengBo * @创建时间 2013-6-7 下午12:57:48 */ 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 <String>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
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 <entry key="ext_dict">ext.dic;</entry> --> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
此为文件包自带的xml文件 没有修改,也懒的去改,测试了个停词的文档stopword.dic
1 2 3 4 5 6 常
测试了清楚1-6数字和汉字功能完全可以,只要将xml文件配置到src下即可,上课例子的图片记录下
齐活。