Ansj是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型(可参考我之前写的文章):在Bigram分词的基础上,识别未登录词,以提高分词准确度。虽然基本分词原理与ICTLAS的一样,但是Ansj做了一些工程上的优化,比如:用DAT高效地实现检索词典、array + linked-list方式实现分词DAG、支持自定义词典与自定义消歧义规则等。
1. 前言
Ansj支持多种分词方式,其中ToAnalysis为店长推荐款:
它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡.如果你初次尝试Ansj如果你想开箱即用.那么就用这个分词方式是不会错的.
因此,本文将主要分析ToAnalysis的分词实现。以下代码分析基于ansj-5.1.0版本。
ToAnalysis
继承自抽象类org.ansj.splitWord.Analysis
,重写了抽象方法getResult
。其中,分词方法的依赖关系:ToAnalysis::parse -> Analysis::parseStr -> Analysis::analysisStr。analysisStr
方法就干了两件事:
- 按照消歧义规则分词;
- 在此基础上,按照核心词典分词;
analysisStr
方法的最后调用了抽象方法getResult
,用于对分词DAG的再处理;所有的分词类均重写这个方法。为了便于理解ToAnalysis分词,我用Scala 2.11重写了:
import java.util
import org.ansj.domain.{Result, Term}
import org.ansj.recognition.arrimpl.{AsianPersonRecognition, ForeignPersonRecognition, NumRecognition, UserDefineRecognition}
import org.ansj.splitWord.Analysis
import org.ansj.util.TermUtil.InsertTermType
import org.ansj.util.{Graph, NameF