Lucene的Smart CN实现分词停用词扩展词

Posted 全民代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene的Smart CN实现分词停用词扩展词相关的知识,希望对你有一定的参考价值。

Lucene 中提供了 SmartCN 为中文提供分词功能,实际应用中还会涉及到停用词、扩展词(特殊词、专业词)等,因此本文将聚焦在 SmartCN 而暂时不考虑其他中文分词类库。

1 简介

analyzers-smartcn 是一个用于简体中文索引词的 Analyzer。但是需要注意的它提供的 API 是试验性的,后续版本中可能进行更改。

可以它包含了如下两部分:

org.apache.lucene.analysis.cn.smart 用于简体中文的分析器,用来建立索引。

org.apache.lucene.analysis.cn.smart.hhmm SmartChineseAnalyzer 隐藏了 Hidden Model 包。

analyzers-smartcn 中包含了 3 种分析器,它们用不同的方式来分析中文:

  • StandardAnalyzer 会单个汉字来作为标记。例如:“中台的作用”分析后成为:中-台-的-作-用

  • CJKAnalyzer 它在 analyzers/cjk 包中,使用相邻两个汉字作为标记。“我是中国人”分析后成为:中台-的作-用

  • SmartChineseAnalyzer 尝试使用中文文本分割成单词作为标记。“我是中国人”分析后成为:中台-的-作用

很显然 SmartChineseAnalyzer 更符合日常搜索的使用场景。

2 SmartChineseAnalyzer

上面的例子展示了 SmartChineseAnalyzer 对中文的处理,实际上 SmartChineseAnalyzer 同时还支持中英文混合排版。

SmartChineseAnalyzer 使用了概率知识来获取最佳的中文分词。文本会首先被分割成字句,再将字句分割成单词。分词基于 Hidden Markov Model。使用大型训练语料来计算中文单词频率概率。

SmartChineseAnalyzer 需要一个词典来提供统计数据。它自带了一个现成的词典。包含的词典数据来自 ICTCLAS1.0

SamrtChineseAnalyzer 提供了 3 种构造函数,通过构造函数能够控制是否使用 SmartChineseAnalyzer 自带的停用词,以及使用外部的停用词。

通过实际测试,我们可以了解分词结果,分词代码如下:

  
    
    
  
String text = "K8s 和 YARN 都不够好,全面解析 Facebook 自研流处理服务管理平台" ;
Analyzer analyzer
= new SmartChineseAnalyzer ( ) ;
TokenStream tokenStream
= analyzer . tokenStream ( "testField" , text ) ;
OffsetAttribute offsetAttribute
= tokenStream . addAttribute ( OffsetAttribute . class ) ;
tokenStream
. reset ( ) ;

List
< String > tokens = new ArrayList < > ( ) ; while ( tokenStream . incrementToken ( ) ) {
tokens
. add ( offsetAttribute . toString ( ) ) ; }
tokenStream
. end ( ) ;

String format
= String . format ( "tokens:%s" , tokens ) ;
System
. out . println ( format ) ;

以上是关于Lucene的Smart CN实现分词停用词扩展词的主要内容,如果未能解决你的问题,请参考以下文章

lucene的分词器宝典

ik分词器 能不能自己增加关键字 怎么操作

java 中文分词为啥用 ik

python使用jieba实现中文文档分词和去停用词

用python对单一微博文档进行分词——jieba分词(加保留词和停用词)

Lucene 的 StopFilter 中使用的默认停用词列表是啥?