文本挖掘

根据输入的一段文字,分析词语,按照出现的次数,频率返回到页面。

下面将代码贴出

import java.io.IOException;
import java.io.StringReader;
import java.text.DecimalFormat;
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 javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class WordServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    static String keyWord = "笑星潘长江当上“男媒婆”了,但这回可不是演小品——由他自编自导自演的都市喜剧《男媒婆》将于1月13日在北"
            + "京卫视首播。剧中,潘长江变身成为能说会道、古道热肠的“新时代男媒婆”丁二春,与“台湾第一酒窝美女2”张庭上演了一出“屌丝逆袭”"
            + "的浪漫追爱记。李明启、李文启、冯远征、任程伟、马丽、徐等明星也齐齐上阵制造“笑料”《男媒婆》围绕着丁二春和他所开"
            + "办的“全成热恋”婚介所展开。人到中年的丁二春眼看来势汹涌的“婚恋大潮”商机不断,想凭借一张巧嘴开创事业和人生"
            + "“第二春”。婚介所开张大吉,顾客盈门,提出的要求却也千奇百怪,拜金女、宅男、小老板粉墨登场,展开了一系列令人捧腹"
            + "大笑又不失温情的精彩故事。剧中的一大看点是美女搭配“丑男”的搭配,张庭与潘长江成了一对欢喜冤家。张庭表示,剧中两人“"
            + "身高有差距、年龄有距离,相貌不对等”。而潘长江谈到这种主角设定时认为:“张庭以往的角色都特别独立、可爱,而‘大女人'和‘"
            + "小男人'正是我俩这对情侣的设定,所以张庭是非常合适的人选。”此外,该剧也是潘长江继《能人冯天贵》、《清凌凌的水蓝莹莹的天》"
            + "第一、第二部之后第四次自导自演的喜剧作品。潘长江表示,全剧通过“媒婆”这个特殊职业的视角,展示着当代社会种种婚恋价值观,涵盖了"
            + "黄昏恋、拜金女、凤凰男等诸多引发热议的时代话题。(记者 尹春芳)免责声明:本文仅代表作者个人观点,与环球网无关。其原创性以及文中"
            + "陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,"
            + "并请自行核实相关内容。";

    /** 获取关键字个数 */
    private static Integer NUM = 10;
    /** 截取关键字在几个单词以上的数量 */
    private final static Integer QUANTITY = 1;

    private static List<String> extract(String article, Integer a)
            throws IOException {
        List<String> list = new ArrayList<String>(); // 定义一个list来接收将要截取出来单词
        @SuppressWarnings("resource")
        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;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        List<String> keyWordsList = extract(keyWord, QUANTITY); // 调用提取单词方法
        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());
            }
        });
        List<Word> listD = null;
        listD = new ArrayList<Word>();
        for(Object data :list){  
            System.out.println(list);
            String listData = data.toString();
            String[] array = listData.split("=");
            String persent = new DecimalFormat("#0.00").format(Double.valueOf(array[1])/list.size()*100)+"%";
            listD.add(new Word(array[0],array[1],persent));
        } 
        if (list.size() < 10)
            NUM = list.size(); // 排序后的长度,以免获得到null的字符
        String[] keyWords = new String[NUM]; // 设置将要输出的关键字数组空间
        for (int i = 0; i < list.size(); i++) { // 循环排序后的数组
            if (i < NUM) { // 判断个数
                keyWords[i] = list.get(i).getKey(); // 设置关键字进入数组
            }
        }
        request.setAttribute("listD", listD);
        request.getRequestDispatcher("./index.jsp").forward(request, response);
    }
}
public class Word {

    String times;  //次数
    String keyword;//关键字
    String frequency; //频率

    public Word(String keyword,String times, String frequency) {
        this.times = times;
        this.keyword = keyword;
        this.frequency = frequency;
    }

    public String getTimes() {
        return times;
    }

    public void setTimes(String times) {
        this.times = times;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getFrequency() {
        return frequency;
    }

    public void setFrequency(String frequency) {
        this.frequency = frequency;
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>接收数据</title>
    </head>
    <body>
        <table border="1px" width="400px" height="100px;"style="border:1px solid #4d90fe" cellspacing="0px">
            <caption>关键字表</caption>
            <tr>
                <th>序号</th><th>关键字</th><th>次数</th><th>频率</th>
            </tr>
            <c:forEach var="keyword" items= "${listD}" varStatus="status">
                <tr>
                    <td>${status.index+1}</td>
                    <td>${keyword.keyword}</td>
                    <td>${keyword.times}</td>
                    <td>${keyword.frequency}</td>
                </tr>
            </c:forEach>
        </table>
    </body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值