如何用Python容错的前缀树实现中文纠错
发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,这篇"如何用Python容错的前缀树实现中文纠错"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来
千家信息网最后更新 2025年02月24日如何用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容错的前缀树实现中文纠错"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
中海
西园
前缀
容错
内容
最大
中文
字符
字符串
结果
中南
中南海
文章
知识
篇文章
查询
相同
三个
价值
大部分
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全监测风险评估等活动
湖南郴州安卓软件开发培训中心
数字化网络技术是什么
景东网络安全宣传
桂林软件开发者
数据库人民
专科专业计算机网络技术与应用
打守望为什么总是服务器断开
没备案的网站数据库
网上商店系统的数据库设计
app软件开发主要学习什么
服务器硬盘灯闪烁怎么回事
汕尾管理软件开发定制
潍城软件开发
服务器ping不高但延迟很高
网络安全员隐私心态
注册功能连接数据库
韶关网络安全技术
联行号mysql数据库
网络运营违反网络安全法
增大数据库用户权限 语句
什么是服务器SN号
什么是计算机网络技术的课程
titan 图形数据库
保山正规互联网科技
网络安全工程师简历证件照
上海磐泰网络技术有限公司
全国工会职工网络安全
数据库完全停止以后进行备份
重庆腾科互联网科技有限公司