自定义分词器Analyzer
Analyzer,或者说文本分析的过程,实质上是将输入文本转化为文本特征向量的过程。这里所说的文本特征,可以是词或者是短语。它主要包括以下四个步骤:
1、分词,将文本解析为单词或短语
2、归一化,将文本转化为小写
3、停用词处理,去除一些常用的、无意义的词
4、提取词干,解决单复数、时态语态等问题
Lucene Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以使TokenStream、Tokenizer,甚至是另一个TokenFilter。整个Lucene Analyzer的过程如下图所示:

上图中的一些名词的解释如下表所示:
| 类 | 说明 |
| Token | 表示文中出现的一个词,它包含了词在文本中的位置信息 |
| Analyzer | 将文本转化为TokenStream的工具 |
| TokenStream | 文本符号的流 |
| Tokenizer | 在字符级别处理输入符号流 |
| TokenFilter | 在字符级别处理输入符号流,其输入可以是TokenStream、Tokenizer或者TokenFilter |
lucene分词自定义
TokenStream继承关系图如下:

StopAnalyzer,StandardAnalyze,WhitespaceAnalyzer,SimpleAnalyzer,KeyWordAnalyzer都继承自父类Analyzer。
因此只要实现父类的虚方法tokenStream 就可以实现分析。
分词的切分算法由继承自父类Tokenizer的方法
public final boolean incrementToken() throws IOException 来实现。
因此自定义继承类Tokenizer并实现其incrementToken算法就可以实现自定义的分词。
- //自定义禁用分词器
- public class UserDefinedAnalyzer extends Analyzer{
- //定义禁用词集合
- private Set stops;
- //无参构造器使用默认的禁用词分词器
- public UserDefinedAnalyzer (){
- stops = StopAnalyzer.ENGLISH_STOP_WORDS_SET;
- }
- /**
- * 传一个禁用词数组
- * @param sws
- */
- public UserDefinedAnalyzer (String[] sws){
- //使用stopFilter创建禁用词集合
- stops=StopFilter.makeStopSet(Version.LUCENE_35,sws,true);
- //将默认的禁用词添加进集合
- stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
- }
- /**
- * 自定义分词器
- */
- @Override
- public TokenStream tokenStream(String str, Reader reader) {
- //读取原始Reader数据的一定是Tokenizer类,这里使用的是LetterTokenizer
- return new StopFilter(Version.LUCENE_35,
- new LowerCaseFilter(Version.LUCENE_35,
- new LetterTokenizer(Version.LUCENE_35, reader)),stops);
- }
- public static void displayToken(String str,Analyzer a) {
- try {
- TokenStream stream = a.tokenStream("content",new StringReader(str));
- //创建一个属性,这个属性会添加流中,随着这个TokenStream增加
- CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
- while(stream.incrementToken()) {
- System.out.print("["+cta+"]");
- }
- System.out.println();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
测试类
- public class Test {
- public static void main(String[] args) {
- Analyzer a1=new UserDefinedAnalyzer(new String[]{"my","name"});
- //Analyzer a1=new UserDefinedAnalyzer();
- String str="my name is paul";
- UserDefinedAnalyzer.displayToken(str, a1);
- }
- }
自定义分词器Analyzer的更多相关文章
- es的分词器analyzer
analyzer 分词器使用的两个情形: 1,Index time analysis. 创建或者更新文档时,会对文档进行分词2,Search time analysis. 查询时,对查询语句 ...
- Elasticsearch笔记六之中文分词器及自定义分词器
中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文"北京大学"来查询结果es将其分拆为"北","京","大" ...
- 【分词器及自定义】Elasticsearch中文分词器及自定义分词器
中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文”北京大学”来查询结果es将其分拆为”北”,”京”,”大”,”学”四个汉字,这显然不符合我的预期.这是因为Es默认的是英文分词器我需要为 ...
- ElasticSearch教程——自定义分词器(转学习使用)
一.分词器 Elasticsearch中,内置了很多分词器(analyzers),例如standard(标准分词器).english(英文分词)和chinese(中文分词),默认是standard. ...
- Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- Lucene.net(4.8.0) 学习问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- Elasticsearch修改分词器以及自定义分词器
Elasticsearch修改分词器以及自定义分词器 参考博客:https://blog.csdn.net/shuimofengyang/article/details/88973597
- ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer)
一.倒排索引 1. 构建倒排索引 例如说有下面两个句子doc1,doc2 doc1:I really liked my small dogs, and I think my mom also like ...
- Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
随机推荐
- 特殊集合 Stack Queue Hashtable
//Stack 干草堆集合 栈集合 先进后出 Stack st = new Stack(); //实例化 初始化 st.Push(2); //添加元素 st.Push(6); s ...
- php链接mysql数据库
php连接数据库有三种方法,刚刚发现通过mysql_connect,mysql_query连接已被废弃,而现在推荐的是通过“面向对象方法”和“PDO方法”连接数据库. 而我在使用面向对象的方法连接时, ...
- super()和this()的区别
1)调用super()必须写在子类构造方法的第一行,否则编译不通过.每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错. 2)supe ...
- NGUI事件监听之UIEventListener的使用
NGUI的事件绑定可以使用 UIButtonMessage 在一个游戏对象上添加Button Message组件: 在Button Message组件上添加要通知的游戏对象上所挂载的脚本的方法 Tar ...
- vue 一些开发姿势
.vue : <template></template><script></script> .js :import Vue from 'vue'
- 解决PHP下导出csv乱码小记
我们之前都是使用PHPexcel导出我们的一些数据的,由于Phpexcel对导出超出1万条数据会导至超时和内存暴涨,后来我们就改用数据导出成csv格式的. 相信很多朋友们在用PHP导出csv文件时都遇 ...
- Harris角点检测算法优化
Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...
- Graph | Eulerian path
In graph theory, a Eulerian trail (or Eulerian path) is a trail in a graph which visits every edge e ...
- ThinkPHP 3.2.3 简单后台模块开发(二)RBAC
RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ...
- UIWebView如何获取内容高度
iOS UIWebView如何获取到内容的高度呢?我们经常会遇到项目中需要使用UIWebView来加载H5页面,但是页面的高度并不确定,而我们前端需要根据内容的高度呈现出来,且不允许webview滚动 ...