字典数据结构 FST(Finite State Transducer)
概述
有限状态自动机(Finite State Transducer,FST)是一种常见的字典数据结构,常用于 NLP 中。它可以表示一组字符串集合,并提供一种有效的方法来在这些字符串上执行查询操作。
FST 可以用于多种不同的任务,包括词形变化、拼写纠正、文本匹配和词义消歧等。
对比与实现
由于中文文本自身的特殊性,如何对文本进行正确的分词尤为重要,就牵扯到如何构建字典,常用的字典数据结构如下:
针对 ArrayList、Map 这两个基本数据结构,不做过多介绍,直接跳过。
针对Trie这个数据结构,他更适合于英文,并不适合应用于中文环境。
中文文本中的字符集非常大,超过了 ASCII 字符集。Trie 数据结构在处理大字符集时,需要存储大量的节点,这会导致空间消耗变得非常大。
中文文本中的词汇组合非常灵活。中文中的词汇不像英文那样明确定义,并且同一个词可以有多种不同的组合方式。
Trie 数据结构在中文文本中,由于其空间和时间效率的限制以及中文文本的复杂性,可能不是最佳选择。
双数组Trie树是一种基于 Trie 树的数据结构
DAT 的静态构建是通过将 Trie 树转换为两个数组实现的。其中一个数组存储 Trie 树中的节点信息,另一个数组则存储节点的孩子节点信息。这种实现方式具有很好的压缩性和查找效率。
当需要删除 Trie 树中的一个节点时,需要将该节点从 Trie 树中删除,并且可能需要对其祖先节点进行修改,以确保删除后的 Trie 树仍然是一棵有效的树。因为 DAT 中的数组是静态分配的,因此删除节点和修改数组可能会破坏原始数据结构的完整性,导致无法保证查找的正确性。
在实际的应用中,存储大辞典的话,会出现溢出情况,并且在 issues 中也有他人出现这种问题。
本文重点实现 FST 数据机构,详见代码
使用语料库分别加入 AhoCorasickDoubleArrayTrie 和 FST,前者出现溢出情况(400w 数据量左右),后者正常使用。
可以动态增删关键词;
代码
版权声明: 本文为 InfoQ 作者【alexgaoyh】的原创文章。
原文链接:【http://xie.infoq.cn/article/5ebcdd1c7cf955f9513618a09】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论