实现wvtool中文功能要implement WVTTokenizer, TokenEnumeration接口
写道
package ICTCLAS.vsm;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import ICTCLAS.util.ICTCLASUtil;
import edu.udo.cs.wvtool.generic.tokenizer.WVTTokenizer;
import edu.udo.cs.wvtool.main.WVTDocumentInfo;
import edu.udo.cs.wvtool.util.TokenEnumeration;
import edu.udo.cs.wvtool.util.WVToolException;
/**
*@date 2011-3-21
*
*@author Jing Yang
*
*/
public class ChineseTokenizer implements WVTTokenizer, TokenEnumeration {
private final List<String> currentTokens;
private TokenEnumeration input;
private final WVTTokenizer tokenizer;
public ChineseTokenizer(WVTTokenizer tokenizer) {
super();
this.currentTokens = new ArrayList<String>();
this.input = null;
this.tokenizer = tokenizer;
}
public TokenEnumeration tokenize(Reader source, WVTDocumentInfo d)
throws WVToolException {
if (source != null) {
input = tokenizer.tokenize(source, d);
readNextToken();
return this;
} else
return null;
}
// 分词
public void readNextToken() throws WVToolException {
if (input.hasMoreTokens()) {
String token = input.nextToken();
//System.out.println(token);
if (token.length() > 0) {
currentTokens.addAll(ICTCLASUtil.ContentProcess(token));// 这是我根据ictclas编写的分词程序
System.out.println(currentTokens);
}
}
}
public boolean hasMoreTokens() {
if (input != null)
return (currentTokens.size() > 0);
else
return false;
}
public String nextToken() throws WVToolException {
String result = null;
// If unequal null, return the current token and read another one from
// the stream
if (currentTokens.size() > 0) {
result = (String) currentTokens.get(0);
currentTokens.remove(0);
if (currentTokens.size() == 0) {
readNextToken();
}
} else {
result = null;
}
return result;
}
}
我在来贴一下别人的代码做个对比
写道
package com.xh;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.wltea.analyzer.IKSegmentation;
import org.wltea.analyzer.Lexeme;
import edu.udo.cs.wvtool.generic.tokenizer.SimpleTokenizer;
import edu.udo.cs.wvtool.generic.tokenizer.WVTTokenizer;
import edu.udo.cs.wvtool.main.WVTDocumentInfo;
import edu.udo.cs.wvtool.util.TokenEnumeration;
import edu.udo.cs.wvtool.util.WVToolException;
/*
* 这个程序是wvtool结合IKAnalyzer的分词而写成的分词代码,
* 程序执行的速度有些慢,由于我也是初学,对于其中的原理也
* 不甚明了,仅供大家做个参考而已
* */
public class IKAnalyzerTokenizer implements WVTTokenizer,TokenEnumeration{
/*
* 一般用Wvtool进行分词的时候,我们都习惯传入SimpleTokentizer,而SimpleTokenizer
* 好像只是提取出了一行文本,根本就没有分词,
* 而这里面,应该是对文本:一行一行的进行分词
* 而且真正实现分词功能的代码在readTokenizer()方法中,这个方法也是这个类里
* 唯一的私有方法
* */
private final List<String> currentToken;
private TokenEnumeration enumeration;
private final WVTTokenizer tokenizer;
public IKAnalyzerTokenizer(WVTTokenizer tokenizer){
this.tokenizer=tokenizer;
currentToken=new ArrayList<String>();
enumeration=null;
}
@Override
public TokenEnumeration tokenize(Reader source, WVTDocumentInfo info)
throws WVToolException {
if(source!=null){
//刚开始看到这段代码,我以为是递归,后来发现跟本不是的,这里它调用的是通过构造函数
//传过来的对象的方法,而不是本方法
enumeration=tokenizer.tokenize(source, info);
readNextTokenizer();
return this;
}else{
return null;
}
}
@Override
public boolean hasMoreTokens() {
if (enumeration != null)
return (currentToken.size() > 0);
else
return false;
}
@Override
public String nextToken() throws WVToolException {
String result = null;
// If unequal null, return the current token and read another one from
// the stream
if (currentToken.size() > 0) {
result = (String) currentToken.get(0);
currentToken.remove(0);
if (currentToken.size() == 0)
readNextTokenizer();
} else
result = null;
return result;
}
private void readNextTokenizer() throws WVToolException{
//我想吧:真正影响程序性能的代码在这里……但怎么优化呢?唉! 我也不知道啦……
if(enumeration.hasMoreTokens()){
//其实吧:就是读入一行文本
String string=enumeration.nextToken();
//包装一下吧
StringReader reader=new StringReader(string);
//好了,分词在这里完成
IKSegmentation seg=new IKSegmentation(reader);
Lexeme lex=new Lexeme(0, 0, 0, 0);
try {
while((lex=seg.next())!=null)
{
currentToken.add(lex.getLexemeText());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//最后测试一下吧
public static void main(String[] args) throws WVToolException {
IKAnalyzerTokenizer toker=new IKAnalyzerTokenizer(new SimpleTokenizer());
String string="雅虎新闻雅虎新闻并校十年难言成败\n雅虎新闻雅虎新闻并校十年难言成败";
StringReader reader=new StringReader(string);
WVTDocumentInfo info=new WVTDocumentInfo("text.html", "html", "utf-8", "chinese");
TokenEnumeration enumeration=toker.tokenize(reader, info);
while(enumeration.hasMoreTokens()){
System.out.print(enumeration.nextToken()+"|");
}
//结果:雅虎|新闻|雅虎|新闻|并|校|十年|十|年|难言|成败|雅虎|新闻|雅虎|新闻|并|校|十年|十|年|难言|成败|
}
}
几乎一样啊,呵呵。
分享到:
相关推荐
标题 "简单的中文分词程序(练习)" 指向的是一个个人开发的、用于学习和实践的简单中文分词工具。在这个项目中,开发者可能使用了 Python 语言,因为 Python 是处理自然语言处理任务(NLP,Natural Language ...
结合十五万词容量的词库,意味着程序具备大量的词汇资源,这对于处理常见词汇和专有名词的识别至关重要,因为词库越大,分词的覆盖率和准确性越高。 标签“中文分词”明确了主题,强调这是针对中文文本的处理;...
标题 "C#分词程序源代码实例" 涉及的核心知识点主要集中在C#编程语言、文本处理和分词算法上。C#是Microsoft开发的一种面向对象的编程语言,广泛应用于Windows平台上的软件开发,包括桌面应用、Web应用以及游戏开发...
C语言,作为一种基础且高效的语言,常被用于编写各种底层算法和工具,包括中文分词程序。 分词是中文信息处理的基石,因为中文没有像英文那样的空格来自然地分隔单词。因此,为了对中文文本进行分析、检索、翻译等...
5. **双向最大匹配法(Bi-directional Maximum Matching, BDM)**:结合FMM和BMM的优点,既考虑了开始也考虑了结束,提高了分词的准确性。 6. **N-gram模型**:基于统计学的分词方法,通过分析词语的前后关联性来...
总的来说,一个简单的英文分词程序需要结合词典、匹配算法和特殊情况处理,而高级的系统则可能利用机器学习技术,如条件随机场,以适应更复杂的文本结构和语言变化。了解和掌握这些知识对于进行高效的英文文本处理和...
在IT行业中,中文分词是自然语言处理(NLP)中的关键步骤,它涉及到将连续的汉字序列分割成有意义的词汇单元,以便计算机能够理解和分析文本。本话题将聚焦于如何使用C#语言来编写一个简单的中文分词程序。C#是一种...
在这个场景中,我们有一个名为“中文分词程序”的工具,它能对输入的中文文本进行分词处理,并且能够将分词结果保存到文件中,方便后续的分析和应用。 分词技术在很多应用中都至关重要,例如搜索引擎、信息检索、...
在标签中,我们看到“分词”、“测试”、“程序”和“系统”四个关键词,这进一步强调了这个程序的主要功能和应用场景。分词是程序的核心任务,测试是其主要目的,程序则是一个实现这些功能的应用,而系统可能指的是...
3. 结合规则与统计的方法:实际应用中,往往结合两种方法的优点,利用规则处理常见情况,用统计模型处理复杂和未知的情况,以提高整体的分词准确性。 在北邮计算机院的研究中,可能涉及到对这些方法的深入研究和...
总的来说,"中文信息处理分词程序"为中文文本处理提供了一个便捷的工具,其背后蕴含了丰富的自然语言处理理论和技术,包括但不限于词典匹配、统计模型和深度学习模型。通过这个程序,用户可以高效地完成对大量中文...
10. **API设计与服务化**:ltp-cloud-sdk-1.1.1可能是哈工大分词程序的SDK版本,提供了对外接口,使得其他开发者能方便地集成和调用分词服务,实现自然语言处理的模块化开发。 通过学习和理解这个分词程序的源码,...
描述中提到的"包含中文分词程序与中文分词库",意味着这个压缩包可能包含了分词程序的源代码和一个词库。词库是分词系统的核心,它存储了大量的词汇及其相关信息,如词性、频率等。有了词库,分词程序可以根据词汇表...
在这个分词程序中,开发者可能利用了C++的指针操作和内存管理能力,以及STL(标准模板库)中的容器和算法,以实现快速而精准的分词功能。 1. **基础数据结构**:为了存储和处理词汇,程序可能会使用数组、链表、...
在实际应用中,Java实现的分词程序往往与Eclipse这样的集成开发环境(IDE)结合使用,方便开发和调试。Eclipse提供了丰富的插件支持,可以方便地运行和测试分词程序,同时提供调试工具帮助定位和解决问题。 总的来...
Python分词程序通常会结合这两种方法,以提高分词的准确性和效率。为了实现这一目标,开发者可能会使用正则表达式、字典匹配、统计模型(如N-gram模型)等技术。字典匹配是最基础的方法,通过一个包含大量词汇的词库...
虽然标题中提到asp.net,但根据提供的信息,这个分词程序可能并未直接与asp.net相关联,更多的是作为独立的C#程序存在。 5. **文件名"Ccdodo.WordSpliter"**: 这可能是分词程序的主执行文件或库文件,由"Ccdodo"这...
此外,他们可能还进行了实验对比,以证明自己算法相对于其他常见分词工具(如jieba分词库)的性能优势或特点。 总的来说,中文分词算法对于理解和处理中文文本至关重要,它在信息检索、机器翻译、情感分析等多个NLP...