Python容错的前缀树怎么实现中文纠错
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍了Python容错的前缀树怎么实现中文纠错的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python容错的前缀树怎么实现中文纠错文章都会有所收获,下面我们
千家信息网最后更新 2025年01月23日Python容错的前缀树怎么实现中文纠错介绍
实现
这篇文章主要介绍了Python容错的前缀树怎么实现中文纠错的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python容错的前缀树怎么实现中文纠错文章都会有所收获,下面我们一起来看看吧。
介绍
本文使用 Python 实现了前缀树,并且支持编辑距离容错的查询。文中的前缀树只存储了三个分词,格式为 (分词字符串,频率) ,如:("中海晋西园", 2)、("中海西园", 24)、("中南海", 4),可以换成自己的文件进行数据的替换。在查询的时候要指定一个字符串和最大的容错编辑距离。
实现
class Word: def __init__(self, word, freq): self.word = word self.freq = freqclass Trie: def __init__(self): self.root = LetterNode("") self.START = 3 def insert(self, word, freq): self.root.insert(word, freq, 0) def findAll(self, query, maxDistance): suggestions = self.root.recommend(query, maxDistance, self.START) return sorted(set(suggestions), key=lambda x: x.freq)class LetterNode: def __init__(self, char): self.REMOVE = -1 self.ADD = 1 self.SAME = 0 self.CHANGE = 2 self.START = 3 self.pointers = [] self.char = char self.word = None def charIs(self, c): return self.char == c def insert(self, word, freq, depth): if " " in word: word = [i for i in word.split(" ")] if depth < len(word): c = word[depth].lower() for next in self.pointers: if next.charIs(c): return next.insert(word, freq, depth + 1) nextNode = LetterNode(c) self.pointers.append(nextNode) return nextNode.insert(word, freq, depth + 1) else: self.word = Word(word, freq) def recommend(self, query, movesLeft, lastAction): suggestions = [] length = len(query) if length >= 0 and movesLeft - length >= 0 and self.word: suggestions.append(self.word) if movesLeft == 0 and length > 0: for next in self.pointers: if next.charIs(query[0]): suggestions += next.recommend(query[1:], movesLeft, self.SAME) break elif movesLeft > 0: for next in self.pointers: if length > 0: if next.charIs(query[0]): suggestions += next.recommend(query[1:], movesLeft, self.SAME) else: suggestions += next.recommend(query[1:], movesLeft - 1, self.CHANGE) if lastAction != self.CHANGE and lastAction != self.REMOVE: suggestions += next.recommend(query, movesLeft - 1, self.ADD) if lastAction != self.ADD and lastAction != self.CHANGE: if length > 1 and next.charIs(query[1]): suggestions += next.recommend(query[2:], movesLeft - 1, self.REMOVE) elif length > 2 and next.charIs(query[2]) and movesLeft == 2: suggestions += next.recommend(query[3:], movesLeft - 2, self.REMOVE) else: if lastAction != self.CHANGE and lastAction != self.REMOVE: suggestions += next.recommend(query, movesLeft - 1, self.ADD) return suggestionsdef buildTrieFromFile(): trie = Trie() rows = [("中海晋西园", 2),("中海西园", 24),("中南海", 4)] for row in rows: trie.insert(row[0], int(row[1])) return triedef suggestor(trie, s, maxDistance): if " " in s: s = [x for x in s.split(" ")] suggestions = trie.findAll(s, maxDistance) return [str(x.word) for x in suggestions]if __name__ == "__main__": trie = buildTrieFromFile() r = suggestor(trie, "中海晋西园", 1) print(r)
分析
结果打印:
["中海晋西园", "中海西园"]
可以看出"中海晋西园"是和输入完全相同的字符串,编辑距离为 0 ,所以符合最大编辑距离为 1 的要求,直接返回。
"中海西园"是"中海晋西园"去掉"晋"字之后的结果,编辑距离为 1, 所以符合最大编辑距离为 1 的要求,直接返回。
另外,"中南海"和"中海晋西园"的编辑距离为 4 ,不符合最大编辑距离为 1 的要求,所以结果中没有出现。
关于"Python容错的前缀树怎么实现中文纠错"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Python容错的前缀树怎么实现中文纠错"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
中海
西园
前缀
容错
中文
最大
字符
字符串
知识
结果
中南
中南海
内容
篇文章
查询
相同
三个
价值
操作简单
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
德国网络安全有什么用
数据库的切割
网络安全整改
泰州蓝思软件开发工程师待遇
网络中控主机是属于服务器吗
通化市网络安全知识
无限分类数据库
未转变者修改器服务器
网络安全问题会带来人
开发管理系统服务器
全省教育系统网络安全
计算机应用与网络技术学哪个好
南京时光铭刻网络技术有限公司
srm软件开发公司
联合国术语数据库
如何纠治网络安全隐患
2021国家网络安全宣传周南阳
web绑定服务器实例
青浦区参考网络技术创新服务
阿里云清除服务器数据
软件开发趋势详解
网络安全工程师是什么时候考试
数据库的三大架构视频
对象数据库技术流视频
管家婆安装数据库左右
你画我猜为啥一直连接不上服务器
java 数据库安装
国际货币基金组织数据库技术
ktv网络技术员是做什么的
数据库防止查询重复