文本挖掘中嵌套字典应用:匹配最长词尾获取ruleID
嘿,这个需求我之前做类似的词形分析时碰到过,核心就是要优先匹配最长的词尾对吧?给你分享个亲测可行的方案,用Python实现的话步骤超清晰:
核心思路
我们的目标是优先匹配最长的词尾,这样才能拿到最具限制性的ruleID。所以关键步骤就三个:
- 把所有词尾和对应的ruleID整理成一组配对
- 按词尾长度从长到短排序(长度相同的话顺序不影响,当然你也可以加额外规则)
- 对每个输入单词,挨个检查排序后的词尾,找到第一个能匹配的(也就是最长的那个),直接返回对应的ruleID
具体实现(Python示例)
先假设你的嵌套规则字典是类似这样的(如果实际结构不一样,只需要调整提取词尾和ruleID的部分就行):
# 示例规则字典:key是ruleID,value里包含对应的目标词尾 rules = { "v0": {"suffix": "acer"}, "v1": {"suffix": "er"}, "v2": {"suffix": "ir"}, "v3": {"suffix": "oir"} }
第一步:整理并排序规则
先把所有词尾和ruleID提取出来,然后按词尾长度降序排序,这样最长的词尾会被优先检查:
# 生成(词尾长度, 词尾, ruleID)的列表,再按长度从大到小排序 sorted_suffix_rules = sorted( [(len(rule["suffix"]), rule["suffix"], rule_id) for rule_id, rule in rules.items()], key=lambda x: -x[0] ) # 排序后结果大概是:[(4, 'acer', 'v0'), (3, 'oir', 'v3'), (2, 'er', 'v1'), (2, 'ir', 'v2')]
第二步:单个单词的匹配函数
写一个简单的函数,遍历排序后的规则,找到第一个匹配的词尾就返回对应的ruleID:
def get_most_restrictive_rule(word): for _, suffix, rule_id in sorted_suffix_rules: if word.endswith(suffix): return rule_id # 如果没有匹配到任何词尾,可以返回None或者你需要的默认值 return None
第三步:批量处理单词列表
直接用字典推导式就能批量处理输入的单词列表:
word_list = ["déplacer", "finir", "voir", "parler"] result = {word: get_most_restrictive_rule(word) for word in word_list} print(result) # 输出结果:{'déplacer': 'v0', 'finir': 'v2', 'voir': 'v3', 'parler': 'v1'}
关键细节说明
- 排序逻辑是核心:通过降序排序,确保最长的词尾被最先检查,一旦匹配就立刻返回,完美解决你说的「最具限制性」需求,比如
déplacer会先匹配acer拿到v0,而不会走到后面的er - 适配不同规则结构:如果你的规则字典是反过来的(比如词尾是key,ruleID是value),只需要调整生成
sorted_suffix_rules的代码,核心逻辑完全不变 - 边界情况处理:如果某个单词没有匹配到任何词尾,函数返回
None,你可以根据自己的需求改成返回默认规则、抛出提示或者其他处理方式
内容的提问来源于stack exchange,提问作者NTiberio
相关产品推荐
相关产品推荐

