本文實例講述了Java編程實現提取文章中關鍵字的方法。分享給大家供大家參考,具體如下:
實現代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/** * 相關的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程序設計有所幫助。