5.Analyzer解析(Lucene6.0.0)
来源:互联网 发布:口语救生圈怎么样知乎 编辑:程序博客网 时间:2024/06/05 05:52
源码见:https://github.com/tangxing1993/lucene
什么是分词器
分词器,是将用户输入的一段文本,分析成符合逻辑的一种工具。
常用到分词器的类型
1. SimleAnalyzer
具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。
2. StopAnalyzer
能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。
3. WhitespaceAnalyzer
使用空格作为间隔符的词汇分割分词器。处理词汇单元的时候,以空格字符作为分割符号。分词器不做词汇过滤,也不进行小写字符转换。实际中可以用来支持特定环境下的西文符号的处理。由于不完成单词过滤和小写字符转换功能,也不需要过滤词库支持。词汇分割策略上简单使用非英文字符作为分割符,不需要分词词库支持。
4. StandardAnalyzer
根据空格和符号来完成分词,还可以完成数字、字母、E-mail地址、IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能。
5. IKAnalyzer
实现了以词典为基础的正反向全切分,以及正反向最大匹配切分两种方法。IKAnalyzer是第三方实现的分词器,继承自Lucene的Analyzer类,针对中文文本进行处理。
6. Paoding Analysis
Paoding Analysis中文分词具有极 高效率 和 高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。其效率比较高,在PIII 1G内存个人机器上,1秒可准确分词100万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析。
7. MMSeg4J
mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器(http://technology.chtsai.org/mmseg/ ),并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。
分词流程
Analyzer是所有分词器的抽象父类,里面有一个public final TokenStream tokenStream(final String fieldName,final Reader reader) ,改方法把读入到的字符流处理成TokenStream单元。TokenStream有两个实现类Tokenizer和TokenFilter,Tokenizer把文本处理为分词单元(控制怎么分词),TokenFilter把过滤分词单元(控制保留那些分词),最后通过TokenStream完成索引。
TokenStreamAPI的流程
初始化TokenStream,TokenStream增加属性到AttributeSource
消费者调用reset()
消费者从TokenStream找属性,并把想要的值存放在本地变量中
消费者调用incrementToken直到返回false,每次调用后,消费属性值
消费者调用end(),执行流结束操作
/*** Lucene分词器解析* 分词器就是把给定的文本按照某种规则分解成最小词汇* Analyzer是所有分词器的抽象父类* TokenSteam是抽象父类中一个final方法,该方法用于把文本内容分解成最小单元SteamToken* StreamToken是分解成的词汇单元,它有两个实现类Tokenizer和TokenFilter* Tokenizer用于分解词汇单元* TokenFilter用于过滤词汇单元* StreamToken.incrementToken 判断是否还有下个词汇单元,属于生产者* CharTermAttribute 词汇属性* PositionIncrementAttribute 位置增量属性* OffsetAttribute 偏移量属性* TypeAttribute 分词类型属性* @author tangx*/public class LuceneAnalyzer {public static void main(String[] args){ displayTokenInfo("我是一个来自农村的中国人!", new StandardAnalyzer()); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); displayTokenInfo("我是一个来自农村的中国人!", new MMSegAnalyzer()); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");}public static void displayTokenInfo(String text,Analyzer analyzer){ //获取词汇流 TokenStream stream = analyzer.tokenStream("", new StringReader(text)); //查看词汇属性 CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class); //位置偏移量属性 PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class); //偏移量属性 OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class); //查看分词类型属性 TypeAttribute ta = stream.addAttribute(TypeAttribute.class); try { //重置下streamToken对象 stream.reset(); //判断是否还有下一个token while(stream.incrementToken()){ System.out.println("TypeAttribute:"+ta+" | PositionIncrementAttribute:"+pia.getPositionIncrement() +" | OffsetAttribute:["+oa.startOffset()+"-"+oa.endOffset()+"] | CharTermAttribute:"+cta ); } } catch (IOException e) { e.printStackTrace(); }}}
- 5.Analyzer解析(Lucene6.0.0)
- 3.创建和维护索引库(Lucene6.0.0 CRUD)
- 4. Lucene各种查询操作(Lucene6.0.0)
- 2.lucene入门案例(lucene6.0)
- Lucene6入门教程(二)索引的创建
- Lucene6入门教程(三)搜索和查询
- Lucene6入门教程(四)索引文件格式
- Lucene6入门教程(五)版本改变
- Lucene6入门教程(六)搜索/查询方式
- Lucene6.0分析(一)——数据分析接口
- Lucene6入门教程(一)简介和学习流程
- Lucene6入门教程(七)多目录多线程索引/检索
- lucene6 IntPoint
- analyzer
- solr 入门介绍/solr 分析器(Analyzer) / solr富文本解析
- Lucene源码解析--Analyzer之Tokenizer
- Lucene6.1学习案例
- lucene6.3 简单例子
- 大数据:Android与IOS职位需求对比
- Android应用卸载广播监听
- 进阶8_多线程2_更多的线程方式
- 指定SQL文本导出CSV文件
- iOS 在Xcode中使用OpenSSL库
- 5.Analyzer解析(Lucene6.0.0)
- VUE完整的VM实例
- hjr教程-PHP(四):xampp与laravel框架
- 程序猿学习第六天,CSS
- C++中 export关键字的使用
- 对序列化的认识
- 关于DWR的使用方面
- Investment(POJ-2063 && HDU-1963)
- CentOS、Ubuntu、Debian三个linux比较异同