文章目录

  • python实现字典树
    • 前言
    • 实现
    • 附言

python实现字典树

前言

下文实现的字典树的目的其实并非用于存储字符,而是存储每个词语(虽然原理一致),并且支持获取某个词语序列的前后缀及其频率。当然,还缺少一些方法没写。(哎,主要是懒~~)

实现

直接上代码好了,有注释应该不是那么难以理解。结点的结构可以进行任意变更用以满足特殊需求。
  
  有一点不算是缺陷的缺陷,就是下文的search方法是用来查找完整句子的序列的,如果存在某个句子是其他句子的前缀,查询的时候将会返回false,这部分烦请根据实际情况进行修改。

# -*- coding:utf-8 -*-
"""
Description:大变双向字典树
迭代次数默认最大999,可以增加但是没必要。其实能深到999层,那这个序列还是选择另外的处理方式吧。@author: WangLeAi
@date: 2018/8/15
"""class TrieNode(object):def __init__(self, value=None, count=0, parent=None):# 值self.value = value# 频数统计self.count = count# 父结点self.parent = parent# 子节点,{value:TrieNode}self.children = {}class Trie(object):def __init__(self):# 创建空的根节点self.root = TrieNode()def insert(self, sequence):"""基操,插入一个序列:param sequence: 列表:return:"""cur_node = self.rootfor item in sequence:if item not in cur_node.children:# 插入结点child = TrieNode(value=item, count=1, parent=cur_node)cur_node.children[item] = childcur_node = childelse:# 更新结点cur_node = cur_node.children[item]cur_node.count += 1def search(self, sequence):"""基操,查询是否存在完整序列:param sequence: 列表:return:"""cur_node = self.rootmark = Truefor item in sequence:if item not in cur_node.children:mark = Falsebreakelse:cur_node = cur_node.children[item]# 如果还有子结点,说明序列并非完整if cur_node.children:mark = Falsereturn markdef delete(self, sequence):"""基操,删除序列,准确来说是减少计数:param sequence: 列表:return:"""mark = Falseif self.search(sequence):mark = Truecur_node = self.rootfor item in sequence:cur_node.children[item].count -= 1if cur_node.children[item].count == 0:cur_node.children.pop(item)breakelse:cur_node = cur_node.children[item]return markdef search_part(self, sequence, prefix, suffix, start_node=None):"""递归查找子序列,返回前缀和后缀结点此处简化操作,仅返回一位前后缀的内容与频数:param sequence: 列表:param prefix: 前缀字典,初始传入空字典:param suffix: 后缀字典,初始传入空字典:param start_node: 起始结点,用于子树的查询:return:"""if start_node:cur_node = start_nodeprefix_node = start_node.parentelse:cur_node = self.rootprefix_node = self.rootmark = True# 必须从第一个结点开始对比for i in range(len(sequence)):if i == 0:if sequence[i] != cur_node.value:for child_node in cur_node.children.values():self.search_part(sequence, prefix, suffix, child_node)mark = Falsebreakelse:if sequence[i] not in cur_node.children:for child_node in cur_node.children.values():self.search_part(sequence, prefix, suffix, child_node)mark = Falsebreakelse:cur_node = cur_node.children[sequence[i]]if mark:if prefix_node.value:# 前缀数量取序列词中最后一词的频数if prefix_node.value in prefix:prefix[prefix_node.value] += cur_node.countelse:prefix[prefix_node.value] = cur_node.countfor suffix_node in cur_node.children.values():if suffix_node.value in suffix:suffix[suffix_node.value] += suffix_node.countelse:suffix[suffix_node.value] = suffix_node.count# 即使找到一部分还需继续查找子结点for child_node in cur_node.children.values():self.search_part(sequence, prefix, suffix, child_node)if __name__ == "__main__":trie = Trie()texts = [["葬爱", "少年", "葬爱", "少年", "慕周力", "哈哈"], ["葬爱", "少年", "阿西吧"], ["烈", "烈", "风", "中"], ["忘记", "了", "爱"],["埋葬", "了", "爱"]]for text in texts:trie.insert(text)markx = trie.search(["忘记", "了", "爱"])print(markx)markx = trie.search(["忘记", "了"])print(markx)markx = trie.search(["忘记", "爱"])print(markx)markx = trie.delete(["葬爱", "少年", "王周力"])print(markx)prefixx = {}suffixx = {}trie.search_part(["葬爱", "少年"], prefixx, suffixx)print(prefixx)print(suffixx)

附言

好了,没其他什么特别的内容了。若有人问这个字典树有什么用呢?我的回答是目前用于存储词序列的数据结构,依赖这个结构可以进行词频统计、计算左右信息熵、计算点互信息等操作。

Python实现字典树相关推荐

  1. 用Python实现字典树(Trie)与双数组字典树(DATrie)

    1. 字典树(Trie) 假如我们把字典中的词以记录的形式(无序)存入数据库中.现给定一串字符,要查找该字符串是否为字典中的词.因为数据库中的记录是无序的,所以,最朴素的方法就逐记录匹配.此方法简单, ...

  2. python 实现字典树_Python实现简单字典树的方法

    本文实例讲述了Python实现简单字典树的方法.分享给大家供大家参考,具体如下: #coding=utf8 """代码实现了最简单的字典树,只支持由小写字母组成的字符串. ...

  3. python实现字典树 时间复杂度_Python实现字典树

    字典树,又称单词查找树,Trie 树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...

  4. python 实现字典树_python字典树(Trie)的实现

    class TrieNode: def __init__(self): self.nodes = dict() self.cnt = 0 self.length = 0 self.is_leaf = ...

  5. def python语言对照表_如何用python,华丽实现字典树?

    文/IT可达鸭 图/IT可达鸭.网络 前言 上篇文章,我们用自定义数据结构实现了有序集合set.本文在此基础上,进一步加深,设计一个新的数据结构--字典树.有过参加过算法竞赛或做过数据检索的小伙伴,应 ...

  6. 实体知识+字典树辅助jieba的分词(并对三国演义进行简单分析)

    在做中文NLP的时候,分词可谓是基础中的基础.然而这个基础部分的内容直到今天还是让人不省心,在实际应用中[尤其是在人名等实体的识别上]总是显得漏洞百出.下面以python上比较流行的一个中文分词库ji ...

  7. 词频分析--字典树的应用

    词频分析–字典树的应用 字典树又称单词查找树,Trie树,前缀树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串所以经常被搜索引擎系统用于文本词频统计. 它的优点是: ...

  8. python树的实现_Python实现简单字典树的方法

    本文实例讲述了Python实现简单字典树的方法.分享给大家供大家参考,具体如下: #coding=utf8 """代码实现了最简单的字典树,只支持由小写字母组成的字符串. ...

  9. dfa算法c语言,DFA跟trie字典树实现敏感词过滤(python和c语言)

    DFA和trie字典树实现敏感词过滤(python和c语言) 现在做的项目都是用python开发,需要用做关键词检查,过滤关键词,之前用c语言做过这样的事情,用字典树,蛮高效的,内存小,检查快. 到了 ...

最新文章

  1. HTML4.0标准语法--字体
  2. linux软中断的实现
  3. 【原】让H5页面适配移动设备全家 - 设计师篇 - PPT
  4. k8s安装Prometheus
  5. P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和
  6. 动态规划——最长公共子序列长度
  7. 查询自己OpenGL的版本信息
  8. LeetCode 531. 孤独像素 I
  9. 2018年云栖社区值得订阅的11个精选技术期刊!
  10. python print与input
  11. oracle 生成随机姓名_Oracle 生成随机数,随机字符串
  12. k8s 拉取镜像失败_k8s 拉取私有仓库失败
  13. 蓝桥杯 ADV-205 算法提高 拿糖果 java版
  14. 开课吧:人工智能技术会如何影响青年就业
  15. Vue CLI 3 中文文档
  16. C# Xamarin For Android移动开发基础实战演练
  17. Java 集合练习题
  18. Bipolar Junction Transistor特性曲线
  19. 你不是输给了物联网,是输给了不信物联网
  20. play框架2.5.6教程——使用play控制台

热门文章

  1. 在线计算机网页打不开了,网络正常网页打不开怎么办
  2. 暗网截图截肢少女_面向全球截肢者的低成本机械手
  3. facebook人脸照片_如何处理Facebook上的不良照片
  4. java毕业设计儿童教育系统Mybatis+系统+数据库+调试部署
  5. 基于mediapipe和KNN算法的深蹲/引体向上计数检测【mediapipe】【BlazePose】【KNN邻接算法】
  6. Android 如何使Tablayout内容和下划线长度相同?
  7. Mysql的MVCC机制
  8. DLP客户端显示脱机的问题处理方法
  9. 益阳职业学校那些有计算机,益阳科达职业技术学校有哪些专业
  10. 【linux】Makefile编写