zoukankan      html  css  js  c++  java
  • 自定义分词器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算法就可以实现自定义的分词。

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

    测试类

    Java代码  收藏代码
    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. }  
  • 相关阅读:
    mybatisplus-分页配置
    mybatisplus-逻辑删除配置
    python-字符串r、b、u、f
    python-pydantic-一个解析库
    python-class-一个type实例对象
    python-函数式编程&面向对象编程
    python-实例访问类属性的一个问题
    jmeter-取样器
    PSP总结报告
    20181204-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/zzt-lovelinlin/p/5593926.html
Copyright © 2011-2022 走看看