Havenask 分词器开发
内容介绍:
一、分词器插件简介
二、内置分词器介绍
三、分词器开发实战
本次分享的主题是 Heavenask 的分词器开发,由阿里云智能引擎工程师江半分享。
由以下三点展开,第一介绍分词器插件,第二介绍内置分词器,第三从实战角度看分词器开发的运作。
一、分词器插件简介
Tokenizer 是一个工作在 Analyzer 内部的组件,Analyzer 一般将处理后文本交给 Tokenizer 组件进行切词,比如归一化之后的文本。Tokenizer 的输入是一段文本,输出是一段 Token 序列,其中 Token 是倒排检索最小粒度。
二、内置分词器介绍
Heavenask 常用的内置分词器,对于文本的切词需求,不同应用之间各不相同,引擎通过默认支持内置通用 Tokenizer 来支持常见的切词需求。当前内置支持的Tokenizer类型包括:simple、aliwS、 multilevel_aliws和singlews等。
simple 是一个简单的分词器,它通过配置一个分隔符,将一段文本按照配置的分隔符进行分词,默认的分隔符是\t.
aliws 分词器基本支持检索粒度,也可以通过配置获得扩展检索单元默认 tokenizer_id 为INTERNET_ CHN, use_extend_retrieve 默认不开启,开启后会打开AliWS的ws::SEG_TOKEN_RETRIEVE_BASICI
WS::SEG_TOKEN_RETRIEVE_EXTEND
选项。
singlews是简单的单词分词器,会把英文的单词以及数字组合按照空格等字符分割,中文被切成单字,如果有特定字需分子的需求,就需要用到分词器开发,multilevel_aliws 相对 aliws 增加了检索粒度和语义粒度的分词功能,需要 parameters 配置。
三、分词器开发实战
Tokenizer可以让用户根据自己的搜索需求去定制特定的分词逻辑,本节将通过一个按照特定分隔符切词的 TestTokenizer 插件,介绍编写分词器插件的一般流程。比如用户配置分隔符为“:”,如果分词器开发实战中有两个“:”,对于分词器“:”开发“:”实战的一段文本切词结果是分词器“:”加开发“:”,然后再加实战,一共是5个token,其中包含两个分隔符。
系统在创建 Tokenizer 对象首先调用 init 接口的时候 TestTokenizer 可以读取 analyzer.jason 中的配置的参数。如果 init 接口返回失败,Tokenize r就创建失败,在分词时,analyzer会循环调用tokenizer的next接口,把需要分词的文本传给 tokenizer,next 接口会依次返回token 序列中的下一个token。
系统在创建 analyzer 对象时,调用 tokenizer 的 clone 接口,克隆出一个 tokenizer 对象传给 analyzer, analyzer 在析构的过程中负责释放克隆的 tokenizer。
最后是 TestTokenizer 在init接口中读取 separator 参数获取分割符的配置。第一点是先实现 testtognide 类。
第二点实现 Tokenizer Module Factory 类,Togonizer 对象是由 Tokenizer Manage r对象生成。testTokenizerModuleManager 是TokenizerModuleFactory 的子类。在使用过程中,Tokenizer 对象主要向 TokenizerManager 对象获取。TokenizerManager 根据配置内容生成,在生成 TokenizerManager 过程中涉及到 Tokenizer 插件的加载以及 Tokenize 对象被 TokenizerModuleFactory 生成的过程。整个过程首先去初始化 Tokenizer 工厂,里面的 KeyValueMap& 是配置文件中去传入的参数列表,根据 Tokenizer 类型会创建指定的 Tokenizer,根据传入的 tokenat typ e创建具体的 Tokenizer 对象,引擎根据 SO 内部定义 creatFactory 方法创建具体的TestTokenizerFactory 对象,factory 使用完成之后,调用 SO 内部的 destroy Factory 销毁 factory 对象。
以上是本次分享的全部内容。