本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
这一章也不算是什么新的内容了,前面我已经写过两篇关于 Analyzer 的内容了。它们分别是《深入理解 Lucene 的 Analyzer》、《详解 org.apache.lucene.analysis.Analyzer 使用教程》。这篇文章,我们在对七个常用的 Analyzer 做个介绍吧!
为什么要有 Analyzer 呢?
对于 Lucene 而言,不管是索引还是检索,都是针对纯文本而言,对于纯文本的来源可以是 PDF,Word,Excel,PPT,HTML等,Lucene 对此并不关心,只要保证传递给 Lucene 的是纯文本即可。
以我们使用谷歌和百度为例,我们在搜索框里输入内容后,搜索引擎会根据我们输入的内容扯分出关键字。这个过程对 Lucene 来说,就是 Analyzer 分词器的应用场景里。Analyzer 主要是用来构建 TokenStreams。TokenStream 是一个分词后的 Token 结果组成的流,通过流能够不断的得到下一个 Token。这个前面也有介绍,后面还会再来写,本文先略过。
下面我们一起来看看常用的 7 个 Analyzer 吧。
分析器 | 说明 |
---|---|
WhitespaceAnalyzer | 根据空格拆分语汇单元 |
SimpleAnalyzer | 根据非字母拆分文本,并将其转换为小写形式 |
StopAnalyzer | 根据非字母拆分文本,然后小写化,再移除停用词 |
KeywordAnalyzer | 将整个文本作为一个单一语汇单元处理 |
StandardAnalyzer | 根据Unicode文本分割算法,具体算法参考Unicode Standard Annex #29,然后将文本转化为小写,并移除英文停用词 |
SmartChineseAnalyzer | SmartChineseAnalyzer 是一个智能中文分词模块,能够利用概率对汉语句子进行最优切分,并内嵌英文 tokenizer,能有效处理中英文混合的文本内容。它的原理基于自然语言处理领域的隐马尔科夫模型(HMM),利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分。因为智能分词需要词典来保存词汇的统计值,SmartChineseAnalyzer 的运行需要指定词典位置,如何指定词典位置请参考org.apache.lucene.analysis.cn.smart.AnalyzerProfile。SmartChineseAnalyzer 的算法和语料库词典来自于ICTCLAS |
CJKAnalyzer | CJK表示中日韩,目的是要把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字(主要为汉字,但也有仿汉字如日本国字、韩国独有汉字、越南的喃字)在ISO 10646 及 Unicode 标准内赋予相同编码。对于中文是交叉双字分割,二元分词法 |
Analyzer 主要是用来构建 TokenStreams。下面我们来看看 WhitespaceAnalyzer,SimpleAnalyzer,StopAnalyzer,StandardAnalyzer,CJKAnalyzer,SmartChineseAnalyzer 这 6 大常用分词器的简单用法。它们分别具有对英文、中文、特殊符号及邮箱等的切分效果。
public class AnalyzerDemo { private static final String[] examples = { "The quick brown 1234 fox jumped over the lazy dog!", "XY&Z 15.6 Corporation - xttblog@xttblog.com", "北京市北京大学" }; private static final Analyzer[] ANALYZERS = new Analyzer[]{ new WhitespaceAnalyzer(), new SimpleAnalyzer(), new StopAnalyzer(), new StandardAnalyzer(), new CJKAnalyzer(), new SmartChineseAnalyzer() }; @Test public void testAnalyzer() throws IOException { for (int i = 0; i < ANALYZERS.length; i++) { String simpleName = ANALYZERS[i].getClass().getSimpleName(); for (int j = 0; j < examples.length; j++) { TokenStream contents = ANALYZERS[i].tokenStream("contents", examples[j]); //TokenStream contents = ANALYZERS[i].tokenStream("contents", new StringReader(examples[j])); OffsetAttribute offsetAttribute = contents.addAttribute(OffsetAttribute.class); TypeAttribute typeAttribute = contents.addAttribute(TypeAttribute.class); contents.reset(); System.out.println(simpleName + " analyzing : " + examples[j]); while (contents.incrementToken()) { String s1 = offsetAttribute.toString(); int i1 = offsetAttribute.startOffset();//起始偏移量 int i2 = offsetAttribute.endOffset();//结束偏移量 System.out.print(s1 + "[" + i1 + "," + i2 + ":" + typeAttribute.type() + "]" + " "); } contents.end(); contents.close(); System.out.println(); } } } }
运行效果我就不贴了,大家自己去看!
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Lucene 实战教程第七章七大分词器 Analyzer 介绍和使用