文档章节

生成关键字

Candy520
 Candy520
发布于 2016/04/29 09:10
字数 718
阅读 43
收藏 0

需要这5个jar

IKAnalyzer2012_u6.jar

lucene-analyzers-3.6.2.jar

lucene-core-3.6.2.jar

lucene-highlighter-3.6.2.jar

lucene-memory-3.6.2.jar

关键字的显示


package com.zte.common.util;


import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.io.StringReader;

import java.util.ArrayList;

import java.util.Arrays;

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 javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;


import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

import org.wltea.analyzer.lucene.IKAnalyzer;


/**

 * 获取文章关键字

 * @author anwj

 *

 */

public class WordUtil {


/** 获取关键字个数 */

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) {

final JTextArea articleTextArea = new JTextArea(40, 20);

JScrollPane articleScroll = new JScrollPane(articleTextArea); 

articleScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

articleScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

final JTextArea keyTextArea = new JTextArea(10, 10);

JScrollPane keyScroll = new JScrollPane(keyTextArea); 

keyScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

keyScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

JButton getKeyBtn = new JButton("生成关键字");

getKeyBtn.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

String articleText = articleTextArea.getText();

try {

String[] keywords = getKeyWords(articleText);

keyTextArea.setText(Arrays.toString(keywords));

} catch (IOException e1) {

e1.printStackTrace();

}

}

});

JPanel mainPanel = new JPanel();

mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

mainPanel.add(articleScroll);

mainPanel.add(getKeyBtn);

mainPanel.add(keyScroll);

JFrame frame = new JFrame("提取文章关键字");

frame.add(mainPanel);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(600, 300);

frame.setVisible(true);

}

}


© 著作权归作者所有

Candy520
粉丝 49
博文 51
码字总数 63811
作品 0
深圳
私信 提问
OFBiz + Opentaps 目录管理 十三. 配置产品搜索

十三. 配置产品搜索 (一) 设置 产品搜索是基于“关键字”的。 查找一个产品,在产品目录管理中点击[关键字],这时可以看到与这个关键字相关的产品的名单以及他们相对搜索权重。系统允许增加一...

Jason
2012/04/01
652
0
OC语言@property @synthesize和id

OC语言@property @synthesize 和id 一、@property @synthesize 关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明和实现。 (一)@property 关键字 @propert...

法斗斗
2016/02/24
20
0
使用 gperf 实现高效的 C/C++ 命令行处理

一 简介 GNU 的 gperf 工具是一种 “完美的” 散列函数,可以为用户提供的一组特定字符串生成散列表、散列函数和查找函数的 C/C++ 代码。通过本文学习如何使用 gperf 实现 C/C++ 代码中高效的...

面码
2014/06/23
210
0
markdown 写 api 系统

空气越来越越糟糕,不得不上路了 在我还是个实习生的时候,我就困扰,这个世界上难道没有写完api文档之后,这个api文档自动帮你生成mock的测试数据,造福前后端的吗? 知道2年后,我看到了这...

莫欺少年穷
2018/12/01
0
0
Scala学习之类和属性篇(五):getter和setter方法

Scala会根据你定义属性时候使用的关键字:var,val,private来选择是否自动生成getter和setter方法。并且不允许你重写Scala的setter和getter方法。如果你要重写这两个方法你会看到如下编译错...

阿拉德大陆的魔法师
2016/12/10
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币

原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos CKB 脚本编程简介[3]:自定义代币 CKB 的 Cell 模型和 VM 支持许多新的用...

NervosCommunity
51分钟前
4
0
通过OAuth2.0 获取授权访问SF 用户数据

通过OAuth2.0 获取授权访问SF 用户数据 OAuth2.0 相关知识 深入了解 Salesforce 中的 OAuth 2.0(SF官方) OAuth 2.0 的一个简单解释(阮一峰大神) OAuth 2.0 的四种方式(阮一峰大神) GitHub OA...

在山的那边
57分钟前
7
0
编写程序:从键盘上接受一个三位数(首先要确保是三位数),计算出各位之和输出。

#include<stdio.h> int main() { int a,sum=0; printf("请输入一个三位数:\n"); scanf("%d",&a); sum=a/100+a%100/10+a%10; printf("这三个数的和:%d",sum); return 0; }......

201905021729吴建森
今天
7
0
如何离开/退出/停用Python virtualenv

我正在使用virtualenv和virtualenvwrapper。 我可以使用workon命令在virtualenv之间切换。 me@mymachine:~$ workon env1(env1)me@mymachine:~$ workon env2(env2)me@mymachine:~$ workon e......

技术盛宴
今天
7
0
成长之路 万事坚持难

任何事情开了头,想要更好的发展下去,不忘初心,就一定要坚持下去。 以前自己坚持了一些事情,比如早睡不吃东西,由于中途断了,没有及时止损,导致又接着恶习断了几天。所以 及时的反省和调...

T型人才追梦者
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部