1、语汇单元的组成:
1)经过分析产生的基本单元。在索引时,Lucene使用特定的分析器来处理需要被语汇单元化的指定域,并将每个语汇单元以项的形式写入索引。
2)起点偏移量是指语汇单元文本的起始字符在原广西中的位置,而终点的偏移量则表示语汇单元终止字符的下一个位置。
3)文本被语汇单元化后,相对于前一语汇单元的位置信息被保存为位置增量值。所有的内置语汇单元将位置增量的默认值设置为1,表示所有语汇单元是连续的,位置上是一个紧接一个的。
2、语汇单元转换为项
1)当文本在索引过程中经过分析后,每个语汇单元做为一个项被传递给索引。
2)位置增量是语汇单元携带到索引中的惟一的附加元数据。
3)起点和终点偏移量和语汇单元类型都被抛弃了-这些元数据仅在分析过程中使用。
4)位置增量使得当前语汇单元和前一个语汇单元 联系起来。位置增量为1,表示每个单词存于域中唯一且连接的位置。
5)位置增量大于1,允许单词之间有空隙。比如说这些空隙上的被分析器删除
6)位置增量为0的语汇单元,会将该语汇单元放置在前一个语汇单元的位置上。通常用于表示单词的同义词。
3、TokenStream(基类包括next()和close()方法 )
1)2个不同的子类
A)Tokenizer:将Reader对象中的数据切分为语汇单元。将String对象包装在StringReader中,进行语汇单元的切分。处理单个字符。
具体又有以下子类:
a)CharTokenizer:其他基于字符的Tokenizer类的父类,包含抽象方法isTokenChar()。当isTokenChar()==true时,输出连续的语汇单元块。该类能对字符规格化处理。Token对象限制的最大字符个数为255个
b)WhitespaceTokenizer:isTokenChar()值为true时的CharTokenizer子类,用于处理所有非空格的字符
c)LetterTokenizer:isTokenChar()值为true并且Character.isLetter()值为true时的CharTokenizer类
d)LowCaseTokenizer:将所有字符小写化的LetterTokenizer
e)StandardTokenier:复杂的基于语法的语汇单元切分器,用于输出高级类型的语汇单元,如E-MAIL地址等。每个输出的语汇单元标记为一个特殊类型,这些类型中的一部分需要使用StandardFilter类特殊处理。
B)TokenFilter:允许你将多个TokenStream对象连接在一起。一个TokenStream对象被传递给TokenFilter时,由TokenFilter对其进行增加、删除和更改等,用于处理单词。
a)LowerCaseFilter:将语汇单元文本转换为小写形式
b)StopFilter:移除指定集合中的信用词
c)PorterStemFilter:利用Poter词干提取算法将语汇单元还原为其词干。
d)StandardFilter:接收一个StandardTokenizer对象做为参数。
4、例子:关于TokenStream
public class AnanlyzerDemo{
private static final String[] examples={"aa adfadf fadfaf,","xxfdasf afadsf wer@qw.com"};
private static final Analyzer[] analyzers=new Analyzer[]{
newWhitespaceAnalyzer(),
newSimpleAnalyzer(),
new StopAnalyzer(),
new StanderdAnalyzer()
};
public static void main(String[] args)throws IOException{
String[]strings=examples;
if(args.length>0) strings=args;
for (inti=0;i<strings.length;i++) analyze(strings[i]);
}
private static void analze(String text) throws IOException{
System.out.println("Analyzing\""+text+"\"");
for (inti=0;i<anayzers.length;i++){
Analyzer analyzer=analyzers[i];
String name=analyzer.getClass().getName();
name=name.substring(name.lastIndexof(".")+1);
System.out.println(" "+name+":");
System.out.print("");
AnaylyzerUtils.displayTokens(analyzer,text);
System.out.println("\n");
}
}
public class AnalyzerUtils{
public class Token[]tokenFromAnalysis(Analyzer analyzer,String text ) throwsIOException{
TokenStream stream=analyzer.tokenStream("contents",newStringReader(text));
ArrayList tokenList=new ArrayList();
while (true){
Token token=stream.next();
if (token==null) break;
tokenList.add(token);
}
return(Token[]) tokenList.toArray(new Token[0]);
public static void displayTokens(Analyzer analyzer,String text)throws IOException{
Token[] tokens=tokensFromAnalysis(analyzerm,text);
for (int i=0;i<tokens.length;i+){
Token token=tokens[i];
System.out.print("["+token.termText()+"]");
}
}
//...............其他方法
}
}
}
深入分析Token对象
public static void displayTokensWithFullDetails(Analyzeranalyzer,String text) throws IOException{
Token[] tokens=tokensFromAnalysis(analyzer,text);
int position =0;
for (int i=0;i<tokens.length;i++){
Token token=tokens[i];
int increment=token.getPositionIncrement();
if (increment>0){
position=position+increment;
System.out.println();
System.out.print(position+":");
}
System.out.print("["+token.termText()+":"+token.startoffset()
+"- >"+token.endoffset()+":"+token.type()+"]");
}
}
publci static void main(String[] args) throws IOException{
displayTokensWithFullDetails(new SimpleAnalyzer(),"The quick brownfox....");
下面是这段程序的输出结果
1:[the:0->3:word]
2:[quick:4->9:word]
3:[brown:10-15:word]
4:[fox:16->19:word]
}
}
}
相关推荐
在Java语言中,词法分析器(也称为扫描器或lexer)的任务是识别源代码中的关键字、标识符、常量、运算符以及注释等元素。下面我们将深入探讨Java词法分析的相关知识点。 1. **词法规则**:Java的词法规则定义了源...
在编程语言处理领域,语法分析器和词法分析器是至关重要的组成部分,它们主要用于解析源代码,将其转化为计算机可以理解的形式。在这个项目中,我们关注的是一个基于Java实现的语法分析器和词法分析器。Java是一种...
在Java中,我们可以使用正则表达式或者自定义的解析逻辑来实现词法分析器。例如,`WordThink3.java`可能就是一个实现了词法分析功能的类,它能够识别关键字、标识符、常量、运算符等不同的Token类型。 语法分析,紧...
MySQL Connector/J是MySQL数据库的Java连接器,它允许Java应用程序通过JDBC(Java Database Connectivity)接口与MySQL数据库进行通信。在本案例中,"mysql-connector-java-5.1.37.jar" 是一个特定版本的MySQL JDBC...
在Java编程中,语法分析器扮演着至关重要的角色,确保输入的代码符合Java语言的语法规则。这个"语法分析器 Java"项目可能是为了帮助开发者在编写Java程序时检测语法错误,或者扩展到处理其他文件类型。 语法分析器...
Java语法分析器是编程语言处理领域的一个重要工具,主要用于解析Java源代码,将人类可读的语句转化为计算机可理解的形式。在这个过程中,语法分析器扮演着关键角色,它依据语法规则对输入的源代码进行结构分析,构建...
Java词法分析器是编程语言解析过程中的关键组件,它主要负责将源代码文本转换成一系列有意义的符号或记号,这些符号可以被后续的语法分析器(也称为解析器)理解和处理。在这个特定的“java词法分析器源代码”压缩包...
在这个项目中,我们将利用Java编写一个日志分析器,通过对日志数据的处理,获取诸如系统最繁忙时间段等有价值的信息。 首先,我们需要了解日志的基本结构和类型。日志通常包含时间戳、事件级别(如INFO、WARN、...
例如,Java的`javacc`(Java Compiler Compiler)是一个用于生成词法分析器和语法分析器的工具,而ANTLR是一个更通用的解析工具,支持多种语言的生成。使用Java实现语法分析器,可以利用其强大的面向对象特性,设计...
本词法分析器能分析出java中常见...另外,本词法分析器对java中的注释也进行了处理,解析过程中会跳过注释。总的来说,本词法分析器是一个比较完备的java词法分析器。本人对比了一下网上词法分析器,觉得本人的比较好。
本项目名为“CMM解释器java版语法分析器”,是国际软件学院的一次作业,目的是让学生掌握如何使用Java语言实现一个语法分析器。在这个过程中,学生将深入理解编程语言的内部工作原理,以及如何解析并执行代码。 ...
Java HttpParser是一个基于...通过以上分析,我们可以看出Java HttpParser是一个强大的工具,它将llhttp的高性能和多线程支持带入了Java世界,为Java开发者提供了高效解析HTTP数据的能力,有利于构建高性能的Web服务。
本项目专注于使用Java实现词法、语法和语义分析器,这些都是编译器设计与实现的核心部分。以下是关于这些知识点的详细说明: **词法分析器(Lexer或Tokenizer)** 词法分析器是编译器的第一步,它将源代码分解成一...
本资源“Java编程艺术-表达式解析器.rar”显然聚焦于如何使用Java语言来实现这一功能。这里我们将深入探讨Java编程中的表达式解析器相关知识。 首先,表达式解析器是计算机程序,它能够读取由操作符和操作数组成的...
JAVA版的JAVA词法分析器是一种用于解析JAVA源代码的工具,它主要负责将源代码文本转换成一系列有意义的标记,这一过程被称为词法分析或扫描。词法分析器是编译器或解释器的第一步,它将源代码分解成词汇单元,为后续...
语法分析器通常使用上下文无关文法(Context-Free Grammar,CFG)来进行解析,比如Java语言的文法。在Java实现中,可能会使用递归下降解析(Recursive Descent Parsing)或LR/LALR分析等技术。 在这个Java项目中,`...
描述中提到的"raml-java-parser.zip"是一个不推荐的RAML(RESTful API Modeling Language)解析器的Java实现,RAML是一种用于规范和文档化RESTful API的 YAML 格式。SnakeYAML是一个流行的开源库,用于解析和生成...
在实际应用中,解析DBC文件的JAVA程序可能会被集成到更复杂的系统中,如汽车诊断工具、数据记录器或仿真环境。这些系统通过读取DBC文件,可以理解CAN总线上的数据流,并根据需要进行响应或模拟发送数据。 总结来说...
词法分析器,又称为扫描器或词法规则解析器,其主要任务是从源代码中识别出一个个的单词 token(如关键字、标识符、常量、运算符等),这些token是构成程序的基本元素。在这个简易的Java词法分析器中,开发者可能...
本项目“grammerAny_Java实现-SNL语法分析器_formhxg_”聚焦于使用Java语言实现一个针对SNL(可能是特定编程语言或数据描述语言)的语法分析器。下面我们将深入探讨相关知识点。 首先,我们要了解什么是语法分析。...