java词频统计——web版支持
需求概要:
1.把程序迁移到web平台,通过用户上传TXT的方式接收文件。
2.用户直接输入要统计的文本,服务器返回结果
3.在页面上给出链接 (如果有封皮、作者、字数、页数等信息更佳)或表格,展示经典英文小说词频统计结果;
4.支持用户自定义单词分隔符;
5.词汇范围对比(额外项)。
分析和设计:
1.创建web工程,利用servlet上传文件的技术实现用户向服务器上传文件。页面设置表单类型为enctype="multipart/form-data",创建文件上传文本框<input type="file" id="upfilename" name="upfilename" value="" />,服务器端使用Part p = request.getPart("upfilename");获取上传的文件,然后写入到指定地址即可。
2.直接分析用户post到服务器的内容,为了使用原有的api,可以将输入内容写到文件中,再进行分析。
3.页面展示统计结果
4.用户可以输入自定义的分隔符和设置显示统计结果前10行(可修改)。需要修改原词频统计的有效字符函数。
5.暂时不考虑
部分代码实现:
表单实现
<div align="center" id="txtform">
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" id="upfilename" name="upfilename" value="" /> 自定义分隔符<input
type="text" id="splitter" name="splitter"> <input
type="submit" id="submit" value="上传" />
</form>
</div>
<div align="center" id="txtform">
<form action="wordcount" method="post">
<div align="center">待统计内容</div>
<textarea name="content" id="content"
style="width: 700px; height: 200px;"></textarea>
<br> 统计前<select id="num" name="num">
<option value="10">10</option>
<option value="20">20</option>
<option value="0">所有</option>
</select>项 <br>自定义分隔符<input type="text" id="splitter" name="splitter"> <input
type="submit" value="提交" /> <input type="button"
onclick="if(confirm('确认重置?')){reset()}" value="重置">
</form>
</div>
文件上传:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
byte b[] = new byte[2048];
@SuppressWarnings("unused")
int len = 0;
Part p = request.getPart("upfilename");
if(p==null){
System.out.println("p == null");
}
String splitter = request.getParameter("splitter");
InputStream in = p.getInputStream();
String name = ""+System.currentTimeMillis();
FileWriter fr = new FileWriter("D:\\upload\\" + name+".txt");
while ((len = in.read(b)) > 0) {
fr.write(new String(b));
}
fr.close();
out.println("uploaded");
response.sendRedirect("wordcount?id="+name+"&splitter"+splitter);
out.flush();
out.close();
servlet处理:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
int num = 10;
String filename = "D:\\upload\\" + id + ".txt";
WordUtil wu = WordUtilFactory.getWordUtil();
long start = System.currentTimeMillis();
String splitter = request.getParameter("splitter");
wu.setSplitter(splitter);
List<String[]> result = wu.getSortedWordGroupCountBuffered(filename, splitter);
int size = result.size();
for (int i = 0; i < (size > num ? num == 0 ? size : num : size); i++) {
String[] strs = result.get(i);
out.println(strs[1] + " : " + strs[0] + "<br>");
}
long end = System.currentTimeMillis();
out.println("execution time :" + (end - start) + "ms");
out.flush();
out.close();
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String content = request.getParameter("content");
String numStr = request.getParameter("num");
int num = 10;
if (numStr != null) {
num = Integer.parseInt(numStr);
}
WordUtil wu = WordUtilFactory.getWordUtil(); long start = System.currentTimeMillis();
String filename = "D://tmp.txt"; FileWriter fr = new FileWriter(filename);
fr.write(content);
fr.close();
String splitter = request.getParameter("splitter");
wu.setSplitter(splitter);
List<String[]> result = wu.getSortedWordGroupCountBuffered(filename, splitter);
int size = result.size();
for (int i = 0; i < (size > num ? num == 0 ? size : num : size); i++) {
String[] strs = result.get(i);
out.println(strs[1] + " : " + strs[0] + "<br>");
}
long end = System.currentTimeMillis();
out.println("execution time :" + (end - start) + "ms");
out.flush();
out.close();
}
有效字符判定(即自定义分隔符)
public void setSplitter(String splitter) {
char[] tmp = splitter.toCharArray();
ArrayList<Character> deleted = new ArrayList<>();
for(int i=0;i<tmp.length-1;i++){
if(tmp[i]=='\\'){
char c = tmp[i+1];
if(c=='n'){
deleted.add('\n');
}
if(c=='r'){
deleted.add('\n');
}
if(c=='t'){
deleted.add('\n');
}
char[] copy = new char[tmp.length-2];
for(int j = 0;j <i;j++){
copy[j]=tmp[j];
}
for(int j=i;j<tmp.length-2;j++){
copy[j]=tmp[j+2];
}
i++;
}
}
split = new char[tmp.length+deleted.size()];
for(int i = 0;i<tmp.length;i++){
split[i]=tmp[i];
}
for(int i=tmp.length;i<split.length;i++){
split[i]=deleted.get(split.length-tmp.length-1);
}
}
private int isCharacter(char ch, String splitter) {
if (split == null) {
if ((ch >= 'a' && ch <= 'z'))
return 1;
if ((ch >= 'A' && ch <= 'Z'))
return 1;
if (ch >= '0' && ch <= '9')
return 2;
return 0;
}
if (split.equals("")) {
if ((ch >= 'a' && ch <= 'z'))
return 1;
if ((ch >= 'A' && ch <= 'Z'))
return 1;
if (ch >= '0' && ch <= '9')
return 2;
return 0;
}
for (int i = 0; i < split.length; i++) {
if (ch == split[i]) {
return 0;
}
}
if ((ch >= 'a' && ch <= 'z'))
return 1;
if ((ch >= 'A' && ch <= 'Z'))
return 1;
if (ch >= '0' && ch <= '9')
return 2;
return 1;
}
运行截图:




web版工程地址:https://git.coding.net/jx8zjs/wordcount-web.git
ssh: git@git.coding.net:jx8zjs/wordcount-web.git
console版工程地址:https://coding.net/u/jx8zjs/p/wordCount/git
ssh: git@git.coding.net:jx8zjs/wordCount.git
java词频统计——web版支持的更多相关文章
- C语言实现词频统计——第二版
原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命 ...
- Java实现的词频统计——Web迁移
本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...
- 个人项目----词频统计WEB(部分功能)
需求分析 1.使用web上传txt文件,对上传的txt进行词频统计. 2.将统计后的结果输出到web页面,力求界面优美. 3.在界面上展示所给url的文章词频统计,力求界面优美. 3.将每个单词同四. ...
- java词频统计——改进后的单元测试
测试项目 博客文章地址:[http://www.cnblogs.com/jx8zjs/p/5862269.html] 工程地址:https://coding.net/u/jx8zjs/p/wordCo ...
- 词频统计Web工程
本次将原本控制台工程迁移到了web工程上.. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经典英 ...
- 词频统计-------------web版本
要求:把程序迁移到web平台,通过用户上传TXT的方式接收文件.建议(但不强制要求)保留并维护Console版本,有利于测试. 在页面上设置上传的控件,然后在servlet中接受,得到的是一个字节流, ...
- Java课程设计---web版斗地主
一. 团队课程设计博客链接 二.个人负责模块和任务说明 负责前后端数据传输 JSP界面的设计 根据后台传来的数据进行页面动态更新 负责Servlet设计 三.自己的代码提交记录截图 四.自己负责模块或 ...
- java 词频统计代码
package hello; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.F ...
- 词频统计web
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
随机推荐
- java 计算百分数方法
俗话说好记性不如烂笔头,故记之. DecimalFormat decimalFormat = new DecimalFormat("##.00%"); System.out.pri ...
- (mac系统下)mysql 入门
1.安装好mysql之后并且服务启动,系统偏好设置里有启动mysql服务的按钮 看到running表示可用 2.通过终端访问mysql 先到mysql的路径下(默认安装没有配置环境变量):cd /us ...
- [转]numpy中的np.max 与 np.maximum区别
转自:https://blog.csdn.net/lanchunhui/article/details/52700895
- python利用smtplib和MIMETYPE发送邮件
# -*- coding:utf- -*- import smtplib from email.mime.text import MIMEText sender = '你的发送邮件' my_pass= ...
- (转载)c++引用
引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价 语法:类型 &引用名=目标变量名: 特别注意: 1.&不是求地址运算符,而是起标志作用 2. ...
- MySQL(六)创建用户与授权
转载自:MySQL创建用户与授权 目录 一.创建用户 二.授权 三.设置和更改用户密码 四.撤销用户权限 五.删除用户 一.创建用户 命令: CREATE USER 'username'@'host' ...
- Ubuntu双系统无法挂载Windows10 硬盘的解决方法
我的电脑是在Windows 10下安装的Ubuntu 14.04双系统,今天进入Ubuntu系统访问Windows 10 磁盘,出现如下错误: Error mounting /dev/sda1 at ...
- C#中public与private与static
现在静下心来想要重新细致的过一遍C#,因为自己做C#没有底气,, 闲话少说 先来一句话 public(共有的) 声明的方法和属性,可以被外部调用. private(私有的) 声明的方法和属性,只能在本 ...
- golang 文件服务器
在go语言中可以用一句代码做一个文件服务器.如果有很多文件需要通过网页来供其他人下载,可以使用这个方法. package main import ( "log" "net ...
- cf244D. Match & Catch 字符串hash (模板)或 后缀数组。。。
D. Match & Catch 能够用各种方法做.字符串hash.后缀数组,dp.拓展kmp,字典树.. . 字符串hash(模板) http://blog.csdn.net/gdujian ...