一、基本知识
字典树(TrieTree),又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
它有3个基本性质:
根节点不包含字符,除根节点外每一个节点都只包含一个字符。
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
每个节点的所有子节点包含的字符都不相同。
二、构建TrieTree
给定多个字符串,如 {banana,band,apple,apt,bbc,app,ba},那么所构建的一棵TrieTree形状如下:
其中,黄色的节点代表从根节点通往该节点的路径上所经过的节点的字符构成的一个字符串出现在原来的输入文本中,如以d为例,路径上的字符为:b-a-n-d,对应输入的字符串集合中的”band”。TrieTree可以很方便的扩展,当来了新的字符串时,只要把新的字符串按照原本的规则插入到原来的树中,便可以得到新的树。如需要加入新的单词”bat”,那么树的结构只需简单的拓展成如下的形式:
可以看出,TrieTree充分利用字符串与字符串间拥有公共前缀的特性,而这种特性在字符串的检索与词频统计中会发挥重要的作用。
三、利用TrieTree进行字符串检索
利用上一节中构造的TrieTree,我们可以很方便的检索一个单词是否出现在原来的字符串集合中。例如,我们检索单词”banana”,那么我们从根节点开始,逐层深入,由路径b-a-n-a-n-a最终到达节点a,可以看出此时的节点a是黄色的,意味着“从根节点到该节点的路径形成的字符串出现在原来的字符串集合中”,因此单词”banana”的检索是成功的。又如,检索单词”application”,从根节点沿路径a-p-p,到达节点p后,由于节点p的后代并没有’l’,这也意味着检索失败。再举一个例子,检索单词”ban”,沿着路径b-a-n到达节点n,然而,当前的节点n并不是黄色的,说明了“从根节点到该节点的路径形成的字符串“ban”没有出现在原来的字符串集合中,但该字符串是原字符串集合中某个(些)单词的前缀”。
可以看出,利用TrieTree进行文本串的单词统计十分方便,当我们要检索一个单词的词频时,不用再去遍历原来的文本串,从而实现高效的检索。这在搜索引擎中统计高频的词汇是十分有效的。
四、TrieTree的代码实现
以下为以C++语言实现的TrieTree数据结构。
四、TrieTree的应用
定义一个类FileReader用来读取文本文件:
测试1:统计某些单词或前缀出现次数
主函数入口如下:
程序输出如下:
测试2:统计所有出现过的单词词频
代码结果如下:
以上就是TrieTree结构在文本中统计单词词频的应用。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/5979.html