`
jyjsjd
  • 浏览: 19812 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

WVTool和分词程序相结合

 
阅读更多

 

实现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#编程语言、文本处理和分词算法上。C#是Microsoft开发的一种面向对象的编程语言,广泛应用于Windows平台上的软件开发,包括桌面应用、Web应用以及游戏开发...

    C语言编写的中文分词程序

    C语言,作为一种基础且高效的语言,常被用于编写各种底层算法和工具,包括中文分词程序。 分词是中文信息处理的基石,因为中文没有像英文那样的空格来自然地分隔单词。因此,为了对中文文本进行分析、检索、翻译等...

    分词程序java源码

    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版本,提供了对外接口,使得其他开发者能方便地集成和调用分词服务,实现自然语言处理的模块化开发。 通过学习和理解这个分词程序的源码,...

    php 中文分词程序

    描述中提到的"包含中文分词程序与中文分词库",意味着这个压缩包可能包含了分词程序的源代码和一个词库。词库是分词系统的核心,它存储了大量的词汇及其相关信息,如词性、频率等。有了词库,分词程序可以根据词汇表...

    分词程序代码

    在这个分词程序中,开发者可能利用了C++的指针操作和内存管理能力,以及STL(标准模板库)中的容器和算法,以实现快速而精准的分词功能。 1. **基础数据结构**:为了存储和处理词汇,程序可能会使用数组、链表、...

    JAVA实现的中文分词程序

    在实际应用中,Java实现的分词程序往往与Eclipse这样的集成开发环境(IDE)结合使用,方便开发和调试。Eclipse提供了丰富的插件支持,可以方便地运行和测试分词程序,同时提供调试工具帮助定位和解决问题。 总的来...

    python分词程序

    Python分词程序通常会结合这两种方法,以提高分词的准确性和效率。为了实现这一目标,开发者可能会使用正则表达式、字典匹配、统计模型(如N-gram模型)等技术。字典匹配是最基础的方法,通过一个包含大量词汇的词库...

    C#写的分词程序(含词典)

    虽然标题中提到asp.net,但根据提供的信息,这个分词程序可能并未直接与asp.net相关联,更多的是作为独立的C#程序存在。 5. **文件名"Ccdodo.WordSpliter"**: 这可能是分词程序的主执行文件或库文件,由"Ccdodo"这...

    中文分词算法程序

    此外,他们可能还进行了实验对比,以证明自己算法相对于其他常见分词工具(如jieba分词库)的性能优势或特点。 总的来说,中文分词算法对于理解和处理中文文本至关重要,它在信息检索、机器翻译、情感分析等多个NLP...

Global site tag (gtag.js) - Google Analytics