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算法就可以实现自定义的分词。

  1. //自定义禁用分词器
  2. public class UserDefinedAnalyzer extends Analyzer{
  3. //定义禁用词集合
  4. private Set stops;
  5. //无参构造器使用默认的禁用词分词器
  6. public UserDefinedAnalyzer (){
  7. stops = StopAnalyzer.ENGLISH_STOP_WORDS_SET;
  8. }
  9. /**
  10. * 传一个禁用词数组
  11. * @param sws
  12. */
  13. public UserDefinedAnalyzer (String[] sws){
  14. //使用stopFilter创建禁用词集合
  15. stops=StopFilter.makeStopSet(Version.LUCENE_35,sws,true);
  16. //将默认的禁用词添加进集合
  17. stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
  18. }
  19. /**
  20. * 自定义分词器
  21. */
  22. @Override
  23. public TokenStream tokenStream(String str, Reader reader) {
  24. //读取原始Reader数据的一定是Tokenizer类,这里使用的是LetterTokenizer
  25. return new StopFilter(Version.LUCENE_35,
  26. new LowerCaseFilter(Version.LUCENE_35,
  27. new LetterTokenizer(Version.LUCENE_35, reader)),stops);
  28. }
  29. public static void displayToken(String str,Analyzer a) {
  30. try {
  31. TokenStream stream = a.tokenStream("content",new StringReader(str));
  32. //创建一个属性,这个属性会添加流中,随着这个TokenStream增加
  33. CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
  34. while(stream.incrementToken()) {
  35. System.out.print("["+cta+"]");
  36. }
  37. System.out.println();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }

测试类

  1. public class Test {
  2. public static void main(String[] args) {
  3. Analyzer a1=new UserDefinedAnalyzer(new String[]{"my","name"});
  4. //Analyzer a1=new UserDefinedAnalyzer();
  5. String str="my name is paul";
  6. UserDefinedAnalyzer.displayToken(str, a1);
  7. }
  8. }

自定义分词器Analyzer的更多相关文章

  1. es的分词器analyzer

    analyzer   分词器使用的两个情形:  1,Index time analysis.  创建或者更新文档时,会对文档进行分词2,Search time analysis.  查询时,对查询语句 ...

  2. Elasticsearch笔记六之中文分词器及自定义分词器

    中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文"北京大学"来查询结果es将其分拆为"北","京","大" ...

  3. 【分词器及自定义】Elasticsearch中文分词器及自定义分词器

    中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文”北京大学”来查询结果es将其分拆为”北”,”京”,”大”,”学”四个汉字,这显然不符合我的预期.这是因为Es默认的是英文分词器我需要为 ...

  4. ElasticSearch教程——自定义分词器(转学习使用)

    一.分词器 Elasticsearch中,内置了很多分词器(analyzers),例如standard(标准分词器).english(英文分词)和chinese(中文分词),默认是standard. ...

  5. Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  6. Lucene.net(4.8.0) 学习问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  7. Elasticsearch修改分词器以及自定义分词器

    Elasticsearch修改分词器以及自定义分词器 参考博客:https://blog.csdn.net/shuimofengyang/article/details/88973597

  8. ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer)

    一.倒排索引 1. 构建倒排索引 例如说有下面两个句子doc1,doc2 doc1:I really liked my small dogs, and I think my mom also like ...

  9. Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

随机推荐

  1. Centos 6.5 挂载硬盘 4K对齐 (笔记 实测)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.17.1.el6.x86_64(Centos-6.5-x86_ ...

  2. Centos Odoo Service Config

    #!/bin/sh ### BEGIN INIT INFO # Provides: openerp-server # Required-Start: $remote_fs $syslog # Requ ...

  3. intellij idea 插件 ideaVim

    像Eclipse一样,idea这个公认最好的javaIDE也有Vim插件. 安装方法 File>Settings>Plugins>Install JetBrains plugin.. ...

  4. JS(javascript) 将网站加入收藏夹

    | 浏览:688 | 更新:2014-09-20 19:39 1 2 3 分步阅读 将网站网址加入收藏夹,方便下次访问! 工具/原料 网址: 电脑. 方法/步骤   //创建加入收藏夹JS函数 < ...

  5. 微信公众号内H5调用微信支付国内服务商模式

    最近在折微信公众号内H5用JSAPI调用微信支付,境内服务商版支付,微信支付给出的官方文档以及SDK不够详细,导至我们走了一些弯路,把他分享出来,我这边主要是用PHP开发,所以未加说的话示例都是PHP ...

  6. iPhone6手機產品提交了進網申請

    近期,海外投資蘋果公司為iPhone6手機產品提交了進網申請,經電信設備進網檢測機構測試和我部審查,相關產品滿足進網管理要求.根據<電信條例>有關規定,我部依法定程式在法定時限內為蘋果公司 ...

  7. Xcode 添加类前缀

    按照如下图所示操作后,接下来创建的类就会带有MN的前缀;如果想更换前缀,则替换MN即可!

  8. heroku空间部署步骤

    一,下载安装heroku toolbelt 二,在dos窗口运行 heroku login 进行身份验证 三,heroku create appName --buildpack heroku/php ...

  9. JavaDate类

    在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用. ...

  10. Cookie 知识点再整理

    1. Cookie  是存储在客户端 内存 或者 硬盘(例如火狐把 Cookie 存储在 C:\Documents and Settings\用户名\Application Data\Mozilla\ ...