- 句子切分:
- 系统读取带分词的字符串。输入的是一个句子或者一篇文章。如果是篇章则系统会首先进行句子切分,然后调用多线程,对每个切分的句子再进行分词。
- 导入词典:
- 根据输入的配置信息,导入相应的词典。
- 进入粗分阶段:
- 首先,对句子进行字符级切分,即将输入的句子切分为单个UTF-8编码的字符数组
- 然后,一元切分。查询核心词典,将字符切分的结果与词典最大匹配,匹配结果,包括词形、词性、词频等信息形成一元词网,之后对一元词网进行原子切分,即按照模式合并英文和数字的字符构成原子词
- 二元切分:用一元切分的结果(二维数组)查询二元词典,与二元词典进行最大匹配,匹配的结果为一个Graph,形成一个词图。
- NShort算法计算。将查处的没个结果按平滑算法计算二元分词的词频数得到词图中每个节点的权值(概率的倒数),应用NShort算法 累加词图中每个节点构成的所有路径,权值最小(概率最大)的那条路径对应的词图节点就是初分的结果。
- 对粗分结果执行后处理应用规则,识别时间类专有名词。
- 进入未登录词识别阶段,使用HMM(隐马尔可夫链)语言模型。
- 根据人名识别词典,将粗分结果与之匹配,Viterbi算法识别外国的人名
- 根据地名识别词典,将粗分结果与之匹配,Viterbi算法识别 地名
- 根据组织机构名词典,将粗分结果与之匹配,Dijkstra算法识别组织机构名称
- 将命名实体识别后的分词结果加入词图中,对词图再次进行分词(Dijkstra最短路径)。该阶段为细分阶段。
- 使用词性标注模型,Viterbi算法,对分词结果进行词性标注
- 转换路径为分词结果,并输出分词结果。
Java中文分词hanlp使用https://blog.csdn.net/nima1994/article/details/72819973