java根据标点英文分词

最近学习java字符串部分,用正则表达式做了一个简单的统计单词出现次数的小程序,目前只能统计英文。

整个程序包括三个包,分别为output,run,wordcount

wordCount包

执行单词统计逻辑的工具包,使用HashMap存储某个字符串出现的次数。

setPattern用来在类外部设置不同的正则表达式,从而使用不同的分词规则(策略模式的一个变种吧),默认使用[a-zA-Z]+

getMap返回存储统计结果的map,map用来给输出器(outputProcesser)将结果输出到控制台或文件。

源代码:

package wordCount;

import java.util.*;

import java.util.Map.*;

import java.util.regex.*;

public class WordCount{

private String pattern = new String("([a-zA-Z]+)");

private HashMap map;

public void setPatterm(String p){

this.pattern = p;

}

public Map getMap(){

return this.map;

}

public void count(String str){

this.map = new HashMap();

Matcher matcher = Pattern.compile(this.pattern).matcher(str);

String key;

while ( matcher.find() ){

key = matcher.group();

if ( this.map.containsKey(key) ){

this.map.put(key, this.map.get(key) + 1);

}else {

this.map.put(key, 1);

}

}

}

}

output包

这个包包括了三个类,OutputProcesser,ConsoleOutput,FileOutput,其中OutputProcesser作为基类

OutputProcesser.java

构造器接收一个来自wordCount返回的map

processInternal()申明为抽象方法,不同的子类实现不同输出方式

output()作为外部调用的接口,接口会循环map,给processInternal提供entry,processInternal会根据提供的entry进行自己的输出

beforeOutput()在输出循环开始前调用

afterOutput()在输出循环结束后调用,这两个方法使用了模板设计模式,用于子类进行输出准备和结束操作,如输出到文件时,在循环开始前打开文件,循环结束之后关闭文件

package output;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

public abstract class OutputProcesser {

private Map map;

public OutputProcesser(Map map){

this.map = map;

}

public void output(){

if ( this.beforeOutput(this.map) ){

Iterator> iterator = this.map.entrySet().iterator();

while ( iterator.hasNext() ){

this.processInternal(iterator.next());

}

this.afterOutput(this.map);

}

}

protected boolean beforeOutput(Map map){

return true;

}

protected void afterOutput(Map map){

}

abstract protected void processInternal(Entry entry);

}

ConsoleOutput.java

package output;

import java.util.Map.Entry;

import java.util.*;

public class ConsoleOutput extends OutputProcesser{

public ConsoleOutput(Map map) {

super(map);

}

protected void processInternal(Entry entry){

System.out.println(this.logString(entry));

}

protected String logString(Entry entry){

return entry.getKey()+" : "+entry.getValue()+" times";

}

}

FileOutput.java

package output;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Map;

import java.util.Map.Entry;

public class FileOutput extends ConsoleOutput{

private String filePath = "result.txt";

private FileWriter fw;

private PrintWriter pw;

public FileOutput(Map map) {

super(map);

}

protected boolean beforeOutput(Map map){

try {

this.fw = new FileWriter(this.filePath);

this.pw = new PrintWriter(this.fw);

} catch (IOException e) {

System.out.println("IOException before process output");

}

return true;

}

protected void afterOutput(Map map){

try {

this.pw.close();

this.fw.close();

} catch (IOException e) {

System.out.println("IOException after process output");

}

}

protected void processInternal(Entry entry){

this.pw.println(this.logString(entry));

}

}

run包

该包对wordCount进行测试,并调用输出类,同时进行简单的性能测试(使用内存和耗时)。

首先会打开一个文本,并读入内存,将文本交给wordCount进行处理

package run;

import java.io.File;

import java.io.FileInputStream;

import java.util.logging.ConsoleHandler;

import org.omg.SendingContext.RunTime;

import wordCount.WordCount;

import output.*;

public class Run {

private long totalMemory = 0,time1 = 0,time2 = 0,memoryUsage = 0;

public void beginProfile(){

this.totalMemory = Runtime.getRuntime().totalMemory();

this.time1 = this.time2 = System.currentTimeMillis();

}

public void endProfile(){

this.memoryUsage = this.totalMemory -
Runtime.getRuntime().freeMemory();

this.time2 = System.currentTimeMillis();

System.out.println("memory usage:"+this.memoryUsage+" B");

System.out.println("time usage:"+(this.time2 - this.time1)+"ms");

}

public String readFromFile(String filePath){

File file = new File(filePath);

Long fLength = file.length();

byte[] content = new byte[fLength.intValue()];

try {

FileInputStream input = new FileInputStream(file);

input.read(content);

input.close();

} catch (Exception e) {

}

return new String(content);

}

public static void main(String[] args) {

Run run = new Run();

WordCount wordCount = new WordCount();

run.beginProfile();

wordCount.count(run.readFromFile("messages.txt"));

run.endProfile();

OutputProcesser out = new FileOutput(wordCount.getMap());

out.output();

}

}

下面是简单的性能测试结果

java根据标点英文分词,码迷,mamicode.com

时间: 2024-08-03 19:28:51

java根据标点英文分词的相关文章

英文分词的算法和原理

英文分词的算法和原理 根据文档相关性计算公式 TF-IDF:http://lutaf.com/210.htm BM25:http://lutaf.com/211.htm 分词质量对于基于词频的相关性计算是无比重要的 英文(西方语言)语言的基本单位就是单词,所以分词特别容易做,只需要3步: 根据空格/符号/段落 分隔,得到单词组 过滤,排除掉stop word 提取词干 第一步:按空格/符号分词 用正则表达式很容易 pattern = r'''(?x)    # set flag to allow

ZH奶酪:Java调用NLPIR汉语分词系统

NLPIR工具 支持自定义词表: 可以离线使用: 下载地址:http://ictclas.nlpir.org/newsdownloads?DocId=389 在线演示:http://ictclas.nlpir.org/nlpir/ 自然语言处理与信息检索共享平台:(nlpir相关的一些软件.文档.论文.语料库等资源)http://www.nlpir.org/ 上边这个地址写的信息比较详细丰富,但是万事开头难,很多同学不知道怎么具体应该调用?下边我就把几个步骤简单介绍一下: Step1.下载 我下

基于JAVA的IKAnalyzer中文分词运用

一.前提 IKAnalyzer分词器常应用于大数据开发的数据准备阶段,它能对任意长的文字进行关键字提取.文字重组.数据清洗等二次处理,并将处理好的关键数据通过某种分割符重新拼接起来,形成一个可用于进行机器学习的数据集. 二.准备阶段 使用eclipse创建一个Maven工程,通过配置pom.xml文件来导入IKAnalyzer的jar包,我这用导入的是ikanalyzer-2012_u6.jar,然后在src目录下分别创建IKAnalyzer.cfg.xml.extend.dic.stopwor

Java实验--关于英文短语词语接龙

在课堂上经过实验之后,重新在宿舍里面从0开始编写大概30分钟左右能够完成这个实验,不是原来的思路. 该实验的表述为:从两个文本input1.txt和input2.txt中读取英文单词,若前面的英文单词的尾字母和后面的英文单词的未字母相同的话,则构成一个英文词语接龙,直到文章结尾,求出整篇文章中词语接龙最长的词语接龙词组,并将其输出到output1.txt和output2.txt文件夹中. 实验代码: package ctn; import java.io.BufferedReader; impo

用java实现输出英文小说飘中出现次数最多的前N个单词(附:使用文件读写)

本文参考于:https://blog.csdn.net/u014204432/article/details/40348839 一.题目 输出单个文件(<飘> 英文版)中的前 N 个最常出现的英语单词,并将结果输入到文本文件中. 二.程序设计思路 1.首先将英文小说飘文件内容用文件读写方式读入StringBuffer中,然后一行一行读取并去掉句子和单词 间空格然后将StringBuffer转换成String,然后再将所有字符转化成小写字符,然后再将句子分割成单词并 存入字符数组. 2.随后遍历

【文本挖掘】模拟退火英文分词

大概原理是找到文本中重复项最多的文本作为词典,代价函数为词典的累计词长和文本分词数之和,迭代找到代价函数最小值所对应的词典和分词结果.方法简单,跑出来的结果也挺有意思. 1 from random import randint 2 3 4 def segment(text,segs): 5 words=[] 6 last=0 7 for i in range(len(segs)): 8 if segs[i]=='1': 9 words.append(text[last:i+1]) 10 last

Atitit.java expression fsm 表达式分词fsm引擎

C:\0workspace\AtiPlatf_cms\src\com\attilax\fsm\JavaExpFsm.java String code = "new(com.attilax.util.connReduceDync).set_resfile(uc_js.txt).joinNout() " .trim(); $code=new(com.attilax.user.AgentService).login(admin,admin) [ "new", "

Java读本地英文txt文本,显示行数、字数、单词出现频率

参考网上的代码,自己再略微修改,纯作记录 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class readFile { public static void mai

关于邮箱怎么验证是不是真实的企业邮箱(java汉字和英文呼唤)

企业邮箱的域名一般都是[email protected]公司域名,或者[email protected]公司域名这种形式.这里我只列举[email protected]公司域名这种形式. 公司要我做一个企业邮箱的模糊匹配和验证,刚接到以为很难.结果网上一查,发现有类似Api.瞬间小case了. 引入jar包:pinyin4j-2.5.0.jar 一下代码是我自己随便写的,应该还可以优化,用了两个循环,因为我们汉子中包含了很多多音字啦. /**  * 单个汉子检查  * @param chines