You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用etree.ElementTree提取JMDict XML时多keb标签匹配问题

问题场景

使用Django与xml.etree.ElementTree处理JMDict词典的XML数据时,原有校验逻辑存在漏判问题:仅取每个条目最后一个<keb>标签的文本和指定汉字变量literal做匹配,包含多写法的条目(如「古い」同时有古い、故い、旧い三种写法)即使某一<keb>包含目标汉字也会被排除。

优化实现

核心逻辑修改点

  • 遍历当前条目下所有<keb>标签做匹配校验,只要任意一个<keb>文本包含literal就判定符合条件
  • 原有假名提取、西班牙语释义提取逻辑完全保留

代码示例

原有错误逻辑参考:

# 原有错误逻辑
for entry in root.findall('entry'):
    # 仅保存最后一个keb文本,导致漏判
    current_keb = ""
    for keb in entry.findall("k_ele/keb"):
        current_keb = keb.text
    if literal in current_keb:
        # 提取假名、西语释义
        ...
        words.append(...)

优化后的可运行代码:

import xml.etree.ElementTree as ET

# 假设已完成XML加载,root为XML根节点,literal为目标汉字变量
words = []
NS = {"xml": "http://www.w3.org/XML/1998/namespace"} # 处理XML命名空间

for entry in root.findall("entry"):
    # 校验是否有任意keb包含目标汉字
    match_flag = False
    kebs = [keb.text for keb in entry.findall("k_ele/keb") if keb.text]
    for k in kebs:
        if literal in k:
            match_flag = True
            break
    
    # 未匹配直接跳过后续提取逻辑,提升性能
    if not match_flag:
        continue

    # 原有假名提取逻辑原样保留
    readings = [reb.text for reb in entry.findall("r_ele/reb") if reb.text]

    # 原有西班牙语释义提取逻辑原样保留
    es_meanings = []
    for gloss in entry.findall("sense/gloss"):
        if gloss.attrib.get(f"{{{NS['xml']}}}lang") == "es" and gloss.text:
            es_meanings.append(gloss.text)
    
    words.append({
        "kanji_list": kebs,
        "kana": readings,
        "es_def": es_meanings
    })

优化说明

  • 增加提前匹配校验逻辑,遍历所有<keb>判断,完全解决多写法条目漏判问题
  • 匹配到目标汉字后立即终止遍历,不会额外增加过多性能开销
  • 原有业务逻辑完全复用,不需要调整假名、释义的提取规则

内容的提问来源于stack exchange,提问作者Juan Camilo Orjuela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:48:03