Java编程实现提取⽂章中关键字的⽅法
本⽂实例讲述了Java编程实现提取⽂章中关键字的⽅法。分享给⼤家供⼤家参考,具体如下:
实现代码:
/**
* 相关的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.kenattributes.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⽅法(读取⽂章的字符流)
while (tokenStream.incrementToken()) { //循环获得截取出来的单词
CharTermAttribute charTermAttribute = //转换为char类型
String keWord= String(); //转换为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 (ains(key)) { //判断这个集合中是否存在该字符串
map.put(key, (key) == null ? 1 : (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>>(Set()); 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]=(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程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论