HanLP最短路径分词最新全面评测:2025年中文分词工具精选排行榜与对比分析

2026-06-09阅读 0热度 0
其他

最短路径分词——一个看似简单,但在工程实现上充满技巧的算法。恰逢我在搭建开发环境,顺便把这项基础技术重新梳理了一遍。下面直接进入核心思路。

先说基本思想。首先根据词典,从待切分字串中枚举出所有可能的词,这一步称为“全切分”。接着,用这些词构建一个有向无环图(DAG),也就是一个粗糙的分词图。在该图中,每个词对应一条有向边,每条边可以携带一个权值,这个权值可以是固定常数,也可以是词语本身的属性(如词性、词频)。然后,在从起点到终点的所有路径中,找到一条总权值最小的路径,这条路径上的词序列即为最终切分结果。如果每个节点不止保留一条最短路径,而是保留N条候选,就演变为N-最短路径算法。

为了提升切分的准确率,可以在词典中为每个词附加属性,即权重。这样一来,不同词在字串中的权重不再相同——有向图的边不再是等长的。最直接的权重点可以使用词频:高频词的权重大,低频词的权重小。具体的权重数值可以通过大规模语料库统计得出。

有一点需要注意:虽然HanLP也提供了Dijkstra算法的实现,但当前版本的最短路径分词采用的是Viterbi算法。我们以“他说的确实在理”为例进行演示。

_1

下面是详细的计算步骤以及回溯路径。

_2

先理清几个关键列的含义:

(1)node列与to列
node列存放粗分词网中的所有词条,to列表示当当前node确定后,后续可能接续的所有词。第一个词之前有一个虚拟的“始”,最后一个词之后有一个虚拟的“末”。

(2)begin2node_w的计算
该值代表从虚拟“始”到当前node词的最短路径权值。计算方式:找到待计算值所在行的node词,然后从该行向上查找第一次出现这个词的行,取那行中begin2to_w列对应的值。第一个词对“始-他”对应的begin2node_w值为0,因为起点本身就是0。

(3)node2to_w的计算
该值由node和to构成的2-gram串的概率决定,即转移概率。计算公式如下:

_3

HanLP中对应的实现位于MathUtility.javacalculateWeight(Vertex from, Vertex to)方法。值得说明的是,“始”的频次取值为MAX_FREQUENCY,“始-他”的共现频次就是“他”作为句首的频次,“理-末”的共现频次则对应“理”作为句末的频次。

(4)begin2to_w_n的计算
该值表示从“始”到to词的最短路径权值。计算公式简单:begin2to_w_n = begin2node_w + node2to_w

(5)begin2to_w_o
这个词记录的是在to词的路径中,当前已找到的最短路径权值。初始值为0,后续由begin2to_w逐步更新。

(6)from
这个词表示to词的前驱词,即在这条最短路径上,to的上一站是哪个词。

_4

在表格中,(7,9)、(8,10)、(11,13)、(12,14)、(15,16)、(17,18)这几组成对行可用于验证公式,其中只有(17,18)满足了第三个式子。

(6)和(7)的HanLP实现代码位于Vertex.javaupdateFrom(Vertex from)方法中。

最后一步是回溯确定分词路径。从“末”开始向前回溯:末→理→在→确实→的→说→他。表格中的黄色单元格验证了这一结果。

经过第(6)和第(7)步的处理,粗分词网中任意词的前驱词都可以确保位于最短路径上。整个遍历和回溯过程的HanLP实现,在ViterbiSegment.javaviterbi(WordNet wordNet)方法里。

_5

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策