CharTokenizer是一个抽象类,它主要是对西文字符进行分词处理的。常见的英文中,是以空格、标点为分隔符号的,在分词的时候,就是以这些分隔符作为分词的间隔符的。
package org.apache.lucene.analysis;
import java.io.IOException;
import java.io.Reader;
// CharTokenizer 是一个抽象类
public abstract class CharTokenizer extends Tokenizer {
public CharTokenizer(Reader input) {
super(input);
}
private int offset = 0, bufferIndex = 0, dataLen = 0;
private static final int MAX_WORD_LEN = 255;
private static final int IO_BUFFER_SIZE = 1024;
private final char[] buffer = new char[MAX_WORD_LEN];
private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
protected abstract boolean isTokenChar(char c);
// 对字符进行处理,可以在CharTokenizer 的子类中实现
protected char normalize(char c) {
return c;
}
// 这个是核心部分,返回分词后的词条
public final Token next() throws IOException {
int length = 0;
int start = offset;
while (true) {
final char c;
offset++;
if (bufferIndex >= dataLen) {
dataLen = input.read(ioBuffer);
bufferIndex = 0;
}
;
if (dataLen == -1) {
if (length > 0)
break;
else
return null;
} else
c = ioBuffer[bufferIndex++];
if (isTokenChar(c)) { // if it's a token char
if (length == 0) // start of token
start = offset - 1;
buffer[length++] = normalize(c); // buffer it, normalized
if (length == MAX_WORD_LEN) // buffer overflow!
break;
} else if (length > 0) // at non-Letter w/ chars
break; // return 'em
}
return new Token(new String(buffer, 0, length), start, start + length);
}
}
实现CharTokenizer的具体类有3个,分别为:LetterTokenizer、RussianLetterTokenizer、WhitespaceTokenizer。
先看看LetterTokenizer类,其它的2个都是基于CharTokenizer的,而核心又是next() 方法:
package org.apache.lucene.analysis;
import java.io.Reader;
// 只要读取到非字符的符号,就分词
public class LetterTokenizer extends CharTokenizer {
public LetterTokenizer(Reader in) {
super(in);
}
protected boolean isTokenChar(char c) {
return Character.isLetter(c);
}
}
做个测试就可以看到:
package org.shirdrn.lucene;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import org.apache.lucene.analysis.LetterTokenizer;
public class LetterTokenizerTest {
public static void main(String[] args) {
Reader reader = new StringReader("That's a world,I wonder why.");
LetterTokenizer ct = new LetterTokenizer(reader);
try {
System.out.println(ct.next());
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下:
(That,0,4)
在分词过程中,遇到了单引号,就把单引号之前的作为一个词条返回。
可以验证一下,把构造的Reader改成下面的形式:
Reader reader = new StringReader("ThatisaworldIwonderwhy.");
输出结果为:
(ThatisaworldIwonderwhy,0,22)
没有非字符的英文字母串就可以作为一个词条,一个词条长度的限制为255个字符,可以在CharTokenizer抽象类中看到定义:
private static final int MAX_WORD_LEN = 255;
相关推荐
美国标准信息交换码(American Standard Code for Information Interchange)是一种常用的字符编码标准,使用 7 个二进位对字符进行编码(叫做标准 ASCII 码),称为 ISO-646 标准。基本的 ASCII 字符集共有 128 个...
在计算机应用中,西文字符编码对计算机的影响非常大。西文字符编码可以影响计算机的性能、存储空间和信息安全。因此,理解西文字符编码的原理和应用非常重要。 此外,西文字符编码也可以应用于其他领域,例如数据...
### 对全角半角字符串的处理 在计算机编程与数据处理领域中,全角和半角字符的区别及其转换是一项常见的需求。特别是在东亚语言环境中(如中文、日文、韩文等),这种转换对于文本处理至关重要。 #### 全角与半角...
UTF-8编码的核心思想是对Unicode字符进行分段编码,具体规则如下: - 对于Unicode值在00000000-0000007F之间的字符,直接使用单个字节表示,与ASCII完全兼容; - Unicode值在00000080-000007FF之间的字符,使用两个...
在IT行业中,字符样本是用于测试、验证和分析文本处理算法的重要工具。在这个特定的案例中,我们有一个名为"字符样本字符样本字符...通过深入理解和应用这些样本,我们可以提升我们的程序在处理字符时的准确性和效率。
批量西文字符写入 (320 * 240 = 40x8 * 30x8) ;================================================================================================ ;文本属性方式:批量西文写入(共30行,每行40个字符) ;======...
`HyphenJS`是一个JavaScript库,专门用于处理西文(如英文)的自动断行和连字符插入,以达到齐头尾的对齐效果。本文将详细讲解`HyphenJS`的工作原理、安装使用方法以及相关的编程技巧。 `HyphenJS`的核心功能是为...
中文分词是自然语言处理技术中的一部分,许多西文处理方法对中文不能直接采用,因为中文必须有分词这道工序。中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音...
在Java编程方面,这个工具可能使用了Java的基础类库,如`java.util.Scanner`进行输入读取,`java.io`包进行文件操作,以及`java.lang.String`和`java.util.ArrayList`等处理文本和存储数据。可能还涉及到了字符串...
1. **全面的字符集**:Source Sans Pro覆盖了拉丁字母、希腊字母和西里尔字母等广泛的语言字符,确保了对多种语言的支持。 2. **字重多样**:提供了从极细到粗的各种字重,适合不同的设计需求和视觉层次感的构建。 ...
全能字符替换工具带编码转换是一款强大的软件,专为IT专业人士设计,用于处理各种文本编码问题并执行复杂的字符替换任务。在开发过程中,我们经常会遇到需要批量替换文本中的特定字符或字符串,或者需要在不同编码...
因此,在实际应用中,要确保对可能的异常情况进行充分的测试和处理。 此外,尽管这种方法在大数据量下效率相对较高,但仍然可能会消耗一定的系统资源。在处理大量数据时,可能需要考虑分批处理或者使用并行查询来...
计算机原理中的字符数据的机器表示是一个关键的概念,它涉及到如何在计算机系统中存储和处理文本信息,特别是西文字符和汉字。在这个主题中,我们主要关注两种不同的字符集:西文字符和汉字,以及它们各自的编码方式...
GBK字符集不仅包含了GB2312的所有汉字和符号,还增加了大量的汉字,并对一些常用但未被GB2312收录的汉字进行了补充,使得GBK成为了更加全面的汉字编码方案。 #### 二、GBK与GB2312的关系 1. **兼容性**: GBK兼容GB...
通过对分词结果的具体示例进行分析,可以看出所实现的分词策略在大多数情况下都能获得较好的效果。此外,通过性能测试也证明了哈希表查找算法的有效性,尤其是在处理大量数据时。 #### 有待解决的问题 尽管实验...
标题中的“造字小软件”指的是一个专门用于创建和编辑特殊字符字模的工具,尤其适合处理非标准的西文字母和数字。这样的工具在设计字体、编程或排版等领域非常有用,允许用户自定义字符的形状和表现形式。描述中提到...
字符编码涉及西文字符和中文字符,这两种类型的字符都需要经过特定的二进制编码以便计算机能够识别和处理。 首先,我们来看西文字符的编码。西文字符包括字母、数字以及各种符号,这些字符在计算机中是通过ASCII码...
- 是最早的西文字符编码标准之一。 #### 2. UTF-8(8-bit Unicode Transformation Format) - **定义**:UTF-8是一种可变长度的字符编码,属于Unicode标准的一部分,由Ken Thompson提出。 - **特点**: - 兼容...