擷取文章中的關鍵字,擷取文章關鍵字
最近在做關於搜尋方面的程式,查閱了許多資料,寫下了下面的代碼,已做後備
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(); //初始化IKAnalyzeranalyzer.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 blocke.printStackTrace();}}}