Java編程實(shí)現(xiàn)提取文章中關(guān)鍵字的方法
本文實(shí)例講述了Java編程實(shí)現(xiàn)提取文章中關(guān)鍵字的方法。分享給大家供大家參考,具體如下:
實(shí)現(xiàn)代碼:
/**
* 相關(guān)的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
*
* 截取一片文章中頻繁出現(xiàn)的關(guān)鍵字,并給予分組排序(倒敘),以數(shù)組格式返回n個(gè)關(guān)鍵字
*
* 并該類內(nèi)部含有一個(gè)List2Map方法,可將重復(fù)<String>集合轉(zhuǎn)換為Map<String, Integer>格式
* 并算出該<String>重復(fù)次數(shù),放入相應(yīng)的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;
/**
* 獲取文章關(guān)鍵字
* @author anwj
*
*/
public class WordUtil {
/** 測(cè)試文章 */
static String keyWord = "笑星潘長(zhǎng)江當(dāng)上“男媒婆”了,但這回可不是演小品——由他自編自導(dǎo)自演的都市喜劇《男媒婆》將于1月13日在北" +
"京衛(wèi)視首播。劇中,潘長(zhǎng)江變身成為能說(shuō)會(huì)道、古道熱腸的“新時(shí)代男媒婆”丁二春,與“臺(tái)灣第一酒窩美女2”張庭上演了一出“屌絲逆襲”" +
"的浪漫追愛(ài)記。李明啟、李文啟、馮遠(yuǎn)征、任程偉、馬麗、徐等明星也齊齊上陣制造“笑料”《男媒婆》圍繞著丁二春和他所開(kāi)" +
"辦的“全成熱戀”婚介所展開(kāi)。人到中年的丁二春眼看來(lái)勢(shì)洶涌的“婚戀大潮”商機(jī)不斷,想憑借一張巧嘴開(kāi)創(chuàng)事業(yè)和人生" +
"“第二春”。婚介所開(kāi)張大吉,顧客盈門(mén),提出的要求卻也千奇百怪,拜金女、宅男、小老板粉墨登場(chǎng),展開(kāi)了一系列令人捧腹" +
"大笑又不失溫情的精彩故事。劇中的一大看點(diǎn)是美女搭配“丑男”的搭配,張庭與潘長(zhǎng)江成了一對(duì)歡喜冤家。張庭表示,劇中兩人“" +
"身高有差距、年齡有距離,相貌不對(duì)等”。而潘長(zhǎng)江談到這種主角設(shè)定時(shí)認(rèn)為:“張庭以往的角色都特別獨(dú)立、可愛(ài),而‘大女人'和‘" +
"小男人'正是我倆這對(duì)情侶的設(shè)定,所以張庭是非常合適的人選?!贝送?,該劇也是潘長(zhǎng)江繼《能人馮天貴》、《清凌凌的水藍(lán)瑩瑩的天》" +
"第一、第二部之后第四次自導(dǎo)自演的喜劇作品。潘長(zhǎng)江表示,全劇通過(guò)“媒婆”這個(gè)特殊職業(yè)的視角,展示著當(dāng)代社會(huì)種種婚戀價(jià)值觀,涵蓋了" +
"黃昏戀、拜金女、鳳凰男等諸多引發(fā)熱議的時(shí)代話題。(記者 尹春芳)免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與環(huán)球網(wǎng)無(wú)關(guān)。其原創(chuàng)性以及文中" +
"陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考," +
"并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。";
/** 獲取關(guān)鍵字個(gè)數(shù) */
private final static Integer NUM=5;
/** 截取關(guān)鍵字在幾個(gè)單詞以上的數(shù)量 */
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>(); //定義一個(gè)list來(lái)接收將要截取出來(lái)單詞
IKAnalyzer analyzer = new IKAnalyzer(); //初始化IKAnalyzer
analyzer.setUseSmart(true); //將IKAnalyzer設(shè)置成智能截取
TokenStream tokenStream= //調(diào)用tokenStream方法(讀取文章的字符流)
analyzer.tokenStream("", new StringReader(article));
while (tokenStream.incrementToken()) { //循環(huán)獲得截取出來(lái)的單詞
CharTermAttribute charTermAttribute = //轉(zhuǎn)換為char類型
tokenStream.getAttribute(CharTermAttribute.class);
String keWord= charTermAttribute.toString(); //轉(zhuǎn)換為String類型
if (keWord.length()>a) { //判斷截取關(guān)鍵字在幾個(gè)單詞以上的數(shù)量(默認(rèn)為2個(gè)單詞以上)
list.add(keWord); //將最終獲得的單詞放入list集合中
}
}
return list;
}
/**
* 將list中的集合轉(zhuǎn)換成Map中的key,value為數(shù)量默認(rèn)為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){ //循環(huán)獲得的List集合
if (list.contains(key)) { //判斷這個(gè)集合中是否存在該字符串
map.put(key, map.get(key) == null ? 1 : map.get(key)+1);
} //將集中獲得的字符串放在map的key鍵上
} //并計(jì)算其value是否有值,如有則+1操作
return map;
}
/**
* 提取關(guān)鍵字方法
* @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); //調(diào)用提取單詞方法
Map<String, Integer> map=list2Map(keyWordsList); //list轉(zhuǎn)map并計(jì)次數(shù)
//使用Collections的比較方法進(jìn)行對(duì)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(); //排序后的長(zhǎng)度,以免獲得到null的字符
String[] keyWords=new String[n]; //設(shè)置將要輸出的關(guān)鍵字?jǐn)?shù)組空間
for(int i=0; i< list.size(); i++) { //循環(huán)排序后的數(shù)組
if (i<n) { //判斷個(gè)數(shù)
keyWords[i]=list.get(i).getKey(); //設(shè)置關(guān)鍵字進(jìn)入數(shù)組
}
}
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();
}
}
}
希望本文所述對(duì)大家Java程序設(shè)計(jì)有所幫助。
- Java正則表達(dá)式提取字符的方法實(shí)例
- java 字浮串提取方法匯集
- Java實(shí)現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類實(shí)例
- Java中判斷字符串是中文或者英文的工具類分享
- Java 區(qū)分文本中的中英文字符函數(shù)
- java中判斷字段真實(shí)長(zhǎng)度的實(shí)例(中文2個(gè)字符,英文1個(gè)字符)
- Java統(tǒng)計(jì)輸入字符的英文字母、空格、數(shù)字和其它
- Java簡(jiǎn)單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法
- java識(shí)別一篇文章中某單詞出現(xiàn)個(gè)數(shù)的方法
- 利用java實(shí)現(xiàn)單詞倒序排列
- java統(tǒng)計(jì)字符串單詞個(gè)數(shù)的方法解析
- Java實(shí)現(xiàn)對(duì)一行英文進(jìn)行單詞提取功能示例
相關(guān)文章
Java判斷IP地址為內(nèi)網(wǎng)IP還是公網(wǎng)IP的方法
這篇文章主要介紹了Java判斷IP地址為內(nèi)網(wǎng)IP還是公網(wǎng)IP的方法,針對(duì)tcp/ip協(xié)議中保留的三個(gè)私有地址進(jìn)行判斷分析,是比較實(shí)用的技巧,需要的朋友可以參考下2015-01-01
idea中mapper如何快速跳轉(zhuǎn)到xml插件
這篇文章主要介紹了idea中mapper如何快速跳轉(zhuǎn)到xml插件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Java如何發(fā)起http請(qǐng)求的實(shí)現(xiàn)(GET/POST)
這篇文章主要介紹了Java如何發(fā)起http請(qǐng)求的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Netty + ZooKeeper 實(shí)現(xiàn)簡(jiǎn)單的服務(wù)注冊(cè)與發(fā)現(xiàn)
服務(wù)注冊(cè)和發(fā)現(xiàn)一直是分布式的核心組件。本文介紹了借助 ZooKeeper 做注冊(cè)中心,如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)注冊(cè)和發(fā)現(xiàn)。,需要的朋友可以參考下2019-06-06
RabbitMQ實(shí)現(xiàn)延時(shí)消息的兩種方法實(shí)戰(zhàn)教程
這篇文章主要介紹了RabbitMQ實(shí)現(xiàn)延時(shí)消息的兩種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
詳解Java中字符串緩沖區(qū)StringBuffer類的使用
StringBuffer與String類似,只不過(guò)StringBuffer在進(jìn)行字符串處理時(shí)不生成新的對(duì)象,下面我們就來(lái)詳解Java中字符串緩沖區(qū)StringBuffer類的使用:2016-06-06

