Java编程实现提取文章中关键字的方法
作者:awj3584 发布时间:2022-10-10 22:08:42
标签: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.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程序设计有所帮助。
0
投稿
猜你喜欢
- 环境搭建创建Maven项目。pom.xml文件中引入RocketMQ依赖。<dependencies>  
- HttpClient模拟浏览器登录后发起请求浏览器实现这个效果需要如下几个步骤: 1请求一个需要登录的页
- 目录前言Hello World1.可以在 Spring Initializr上面添加,也可以手动在 pom.xml中添加如下代码∶2. 编写
- 本文实例讲述了Android TextView中文字通过SpannableString设置属性的方法。分享给大家供大家参考,具体如下:在An
- 利用链如下其中LazyMap.get()->ChainedTransformer.transform()-InvokerTransfo
- 一、百度百科Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防
- 一、项目简述(+需求文档+PPT)功能:卡管理,卡消费,卡充值,图书借阅,消费,记录,注销等等功能。二、项目运行环境配置:Jdk1.8 +
- excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项选项较少(一般少于5个):private static Dat
- java 指定某个jdk版本方法指定某个jdk版本方法背景:当我们在同一台机器上运行多个Java程序,但是所需的java版本不同,此时就需要
- 前言先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁
- 方法的覆盖在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列
- 有时候数据库文档需要整理,可是只能手动的复制粘贴,心中一万只草泥马奔腾而过。。。screw简洁好用的数据库表结构文档生成工具。1. 创建项目
- 实例如下所示:package test;import java.util.ArrayList;import java.util.Collec
- 前言:什么是JDBCJava 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户
- 1.阻塞I/O模型阻塞IO模型是常见的IO模型,在读写数据时客户端会发生阻塞。阻塞IO模型的工作流程为:1.1在用户线程发出IO请求之后,内
- 重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在
- 一、什么是并查集对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?并查集是一种树型的数据结构,用于处理一些不相交
- 项目完整代码链接:代码链接跨服务上传文件示意图一、创建项目springboot:2.2.6JDK:1.8由于资源有限,就用不同端口表示不同服
- 实现效果:注意:using system.io; 往Form1上添加控件picturebox,再添加imagelist,并设置imageli
- 目录前言一、Spring Boot对Redis的支持二、实战1、添加依赖2、redis配置3、实现序列化4、创建Redis连接工厂,同时注册