如何用Python容错的前缀树实现中文纠错
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇"如何用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容错的前缀树实现中文纠错"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
中海
西园
前缀
容错
内容
最大
中文
字符
字符串
结果
中南
中南海
文章
知识
篇文章
查询
相同
三个
价值
大部分
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库范式的案例
有关网络安全的ppt图片
支付宝安康码登录连接服务器失败
软件开发类公司面试问题
软件开发服务分词
如何进入容器数据库
深圳爱酷游网络技术有限公司
浙江软件开发学习网址哪个好
办公软件开发就选臻动传媒
2020年网络安全执法案例
优财互联网信息科技
程序设计流程图软件开发
网络安全技术信息安全系统的组成
oem管理软件开发
西城区网络技术服务成本价
使用大数据库理论分析网易云
网络安全执法平台
数据库管理员报名
山西洋一网络技术
数据库补考心得体会
sis 服务器
健康血样数据库
河北麻将软件开发哪家强
定制化服务器供应商
iphone数据库不见了
pyqt软件开发
软件开发是一类还是二类
数据库创建补表
软件开发经费测算 辽宁省
如何在数据库中设置视图