【实例】用AI辅助epub词典的转换

坛友Sirabbas分享了一本epub词典,想找人转成mdx。这部小词典用Emeditor处理不难。我这里是拿来练手,让AI写程序帮忙实现。

操作步骤:

1、观察词典结构

epub 词典之间的标签结构千差万别,没有统一的标准,因此很难找到万能的程序一步到位。通常都要具体情况具体分析。

Webster's Essential 1000 Words Dictionary 下载 epub 附件。解压 epub,把需要处理的 html 源文件复制到一个子文件夹中备用。

用 Calibre 打开 epub 文件,在元素查看器中观察元素标签,以及它们之间的位置关系

更详细的步骤,点击展开
  • 用 Calibre e-book viewer 打开该词典的 epub 文档。
  • 翻到词典正文部分,用右键菜单唤出“元素查看器”
  • 激活元素选择按钮(或者用快捷键Ctrl + shift + C),用鼠标点选词典正文的单词词头。查看器会自动展开相应位置的文档源码。

有的词典冗余的东西比较多,适合针对特定标签提取。有的结构相对简单,可以直接切割。这里选用提取法(有点像网页爬虫),找到要提取的标签p.nonindentp.borderp.hang_9p.indent,发现它们都是<body>的一级子元素。顺便记下词头<b>所在位置,后面会用到。

2、描述处理过程

想象自己是一台机器,拿到上面待处理的源文件和标签名后,要怎么一步步处理?(具体要怎么读取输入文件,怎么写入输出文件?) 把整个过程用文字描述出来,发给AI:

AI(此处为必应)会根据描述自动生成相应代码,并附有详细注释:


# 导入必要的库
import os
import codecs
from bs4 import BeautifulSoup

# 定义一个函数,用于处理每个xhtml文件
def process_file(filename):
    # 用codecs打开文件,并用BeautifulSoup解析为html对象
    with codecs.open(filename, "r", "utf-8") as f:
        html = BeautifulSoup(f.read(), "html.parser")
    
    # 找到body标签的一级子元素,并遍历它们
    children = html.body.findChildren(recursive=False)
    for child in children:
        # 如果是p.nonindent标签,就把它里面的第一个b标签文本写入output.txt,换行,然后用html的link标签引入外部文件w.css,再将p.nonindent写在这个link后面
        if child.name == "p" and child.has_attr("class") and "nonindent" in child["class"]:
            b_text = child.b.get_text()
            output.write(b_text + "\n")
            link_tag = '<link rel="stylesheet" href="w.css">\n'
            output.write(link_tag)
            output.write(str(child) + "\n")
        
        # 如果是p.border,p.hang_9和p.indent标签,就将其写入output.txt
        elif child.name == "p" and child.has_attr("class") and any(x in child["class"] for x in ["border", "hang_9", "indent"]):
            output.write(str(child) + "\n")
        
        # 如果下一个元素是p.nonindent或者没有其它标签时,将文本</>写入(不要转义)
        next_sibling = child.find_next_sibling()
        if next_sibling is None or (next_sibling.name == "p" and next_sibling.has_attr("class") and "nonindent" in next_sibling["class"]):
            output.write("</>\n")

# 定义当前文件夹的子文件夹w的路径
subfolder_path = os.path.join(os.getcwd(), "w")

# 创建一个空的output.txt文件,并以追加模式打开
output = open("output.txt", "a")

# 遍历子文件夹w中的所有xhtml文件,并调用process_file函数处理每个文件
for file in os.listdir(subfolder_path):
    if file.endswith(".xhtml"):
        file_path = os.path.join(subfolder_path, file)
        process_file(file_path)

# 关闭output.txt文件
output.close()

3、执行代码并检查结果

把AI生成的代码复制另存为 xxx.py,放到与 html 源文件所在子文件夹同级的目录中。
打开终端执行:

python xxx.py

若程序执行无误,会按描述将结果保存到 output.txt,打开这个文本文件:

检查发现,这个处理结果基本符合预期。只要把第一行的</>删除即可

:warning:若处理结果不符合预期,需要检查文字描述是否准确。

最后将 output.txt 打包成 mdx,其他素材比如图片和字体打包成 mdd。*打包过程略,可搜索其他教程。

成品mdx及效果:

mdx&mdd.zip (197.9 KB)


个人经验和心得:

  • 同样的文字不是每次都能生成一样的代码,有的代码执行效率很高,有的却很慢。如果对生成的结果不满意,可以尝试刷新页面或重置话题。

  • 生成的代码执行出错时,可以改变部分用词,调整先后顺序再试。也可以请AI用它自己的话复述一遍问题,通过对比它复述的内容和你的原话之间的差别,会发现问题所在。理论上只要描述得足够清楚,就可以生成不错的代码。

  • 对处理结果,有时候手动编辑一两个细节比调整文字描述更快捷。并不是所有操作都一定要用AI完成。语言描述太简略会处理不到位,太详细又可能会扰乱整体的逻辑脉络。有点考验一个人的逻辑和表达能力。

这个方法门槛不高。只要大致梳理一下流程,就可以生成堪用的程序。比较适合对html和编程有基本了解,想入门但一直没能迈开实战第一步的人。

8 个赞

:goutou:想法不错,人做的话就是用正则加标签然后稍微处理下,再用bs4提取输出

让AI帮助编程说话会很累,调试也不方便。如果能说的那么清楚,自己就直接写了。
30分钟前刚试了,最后还是自己写了,哈哈。

有时候确实,绞尽脑汁说不清楚,自己写更快。但有的人想法多,又很会说,两分钟说的话能顶我一天的说话量,说不定他们会用的得心应手吧

1 个赞

嗯嗯,还得怪自己不会说,尤其是一些动态生成的情况。如果是静态的,直接给AI一个原始样本,然后再给一个结果样本,让它生成程序,估计能行。

楼上的词典我让谷歌翻译了一下,趁着你的AI程序,再转换一下吧?翻译用<span class="tran">标签,添加在了原<p>标签中。
chap01nn.7z (237.4 KB)

把span.tran加进去后,变成只在最后一个词条加</>。
看了下生成的代码,这几行缩进多了一层,逻辑变了

next_child = child.next_sibling
if next_child is None or (next_child.name == "p" and next_child["class"] == "nonindent"):
     # 如果是,则将文本</>写入output,并换行(不要转义)
     output += "</>\n"

换了几种描述方式都不行,最后作弊手动调了代码缩进 :joy:


更新:又出现新问题了

是不是比自己写还费劲? :joy:
刚看了老兄的表述,确实精细,值得学习 :+1:

Thank you very much for your interest…

Dear brother, I would like to ask you, as you translate it into Chinese, so can it be translated into Urdu too?

确实费劲。用来练手的题目太简单,以至于高估了AI的智能。没想到多加一个变数就失控了。

之前听说ChatGPT在训练时中文资料只占5%。刚才问了必应,它说没找到具体数据。也许可以期待以后的新版能用更多中文充分训练。到时候对中文的理解更好些

1 个赞

手动把翻译移到p标签后处理应该会简单些,当初不想费事,直接append了。

1 个赞

修改显示风格,附加css。

Webster’s Essential 1000 Words Dictionary.rar (192.5 KB)

3 个赞

来吧,一起把鉴赏词典补完, :rosedoge:

:+1:很贴心的改版,例句和一些特别的标题都有了自己的名字,方便自定义样式。有一点需要注意,这部词典的音标得用mdd内置的字体才能正常显示。

支持!oxford的鉴赏词典做的很精美

机器翻译会有很多错误,上面添加中文的尝试只是为了测试代码能否正常工作,我们并不会真的把大量机器翻译的内容添加到一部正规的词典中,除非能进行人工校对以保证质量。

1 个赞

GPT 4.0 号称能读图。
不知能不能用来进行图片辞典的切辞及提取辞头的工作。

1 个赞

人工智能正在改变世界!