《解密搜索引擎技术实战:Lucene&Java精华版》---第四章中文分词原理与实现学习笔记(一)

来源:互联网 发布:少儿趣味编程 下载 编辑:程序博客网 时间:2024/05/16 08:36
在中文分词过程中,我们不可避免的要用到词典,词典中最基本的格式是每行有一个词,而词典中的内容往往数据量很大,为了保证我们在分词过程中的切分速度,选择一个好的词典查找算法就显得尤为重要。

下面来介绍一下在分词过程中,查找词典的一种最常用的算法:Trie树的概念

数字搜索树(Trie树)采用了逐字散列的方法,可以看成是一种逐字的完美散列,在一个Trie树中,树中的每一个节点只保留一个字符。如果这个词比一个字符要长(当然构建词典中大部分词都要比一个字符要长),则包含第一个字符的节点所有指针指向纸箱下一个字符的节点。

废话也说了不老少,直接上图:
假设有以下的单词组成的词典:(as  at  be  by  he  in  is  it  of  on  or  to

则它生成的数字搜索树如下图:


说完了最简单的Trie树,我们再来说一下三叉搜索树:
在一个三叉搜索树中(Ternary Search Trie)中,与简单的Trie树相同,每个节点都包含一个字符,但是和数字搜索树不同,三叉搜索树只有三个指针:一个指向左边的树,一个指向右边的树,还有一个指针向下,指向该单词的下一个数据单元。

它是二叉搜索树和数字搜索树的组合体,它既有数字搜索树的搜索速度又和二叉搜索树一样不需要很大的内存空间。

在三叉搜索树的构建过程中,树是否平衡显得尤为重要,如果按照排序后的顺序插入,则生成方式是最不平衡的,所以单词的读入顺序对于三叉搜索树是否平衡就显得尤为重要。
这里作者采取的方法是:通过选择一个排序后词典中的中间值,把它作为一个开始节点,我们就可以构建一个平衡三叉搜索树。

举个例子。我们还是以有序的数据单元为例:(as  at  be  by  he  in  is  it  of  on  or  to)

首先我们把关键字"is"作为中间值并且构建一个包含字母"i"的根节点。它的直接后继节点包含字母"s"并且可以存储任何与"is"有关联的数据。对于"i"的左树,我们选择"be"作为中间值并且创建一个包含字母"b"的节点,字母"b"的直接后继节点包含"e"。该数据存储在"e"节点。对于"i"的右树,按照逻辑,选择"on"作为中间值,并且创建"o"节点以及它的直接后继节点"n"。
如图:
垂直的虚线代表一个父节点下面的直接后继节点。只有父节点可以和它的直接后继节点组合成词。
例如途中“ib”不能组合成词,那么节点i和节点b之间只能用一条斜线相连,不具有直接后继关系。
在图中,带有黑圈的节点都为终止节点,如果查找一个词以终止节点结束,则说明在三叉搜索树种包含这个词。

致辞感谢本书作者:传送门 写的很好很详细!

0 0
原创粉丝点击