garypang 发表于 2018-5-3 00:01:37

MDX词组提取 - 从正则进阶到头发护理

本帖最后由 garypang 于 2018-5-8 18:56 编辑

阅读本帖前建议对正则表达式有一定的了解,本帖不做基础知识普及,只讲解关键点和思路

在我出了两个词组提取资源帖后,不少小伙伴都留言表示希望我出教程帖,也有希望我提取某某词典的词组,秉着授之于鱼不如授之以渔,造福论坛和广大网友的想法,分享下我提取朗文5++词组的全过程,只要跟着我一步一步来,哪怕不懂代码的小白,也能提取出朗文5++,但是要扩展到自己提取其他词典,则需要看懂各个步骤,并举一反三啦.

所用工具:
文本编辑器 notepad++https://notepad-plus-plus.org/download/ (其他编辑器无法保证本帖提供的正则正常运行)

tidy-html5https://github.com/htacg/tidy-html5
已编译好版本,直接下载
**** Hidden Message *****

mdx解压软件MdxExport   mdx打包软件 MdxBuilder   论坛有提供下载,

具体步骤

第一步 使用MdxExport 将mdx文件解压成txt文本文件

第二步
用notepad++打开解压后的txt文件,ctrl+H打开替换窗口

替换目标:.*?(<a name="\w+?"></a><span class="(newline ){0,1}Sense( LDOCEVERSION_new){0,1}" id="\w+?">(<span class="LDOCE5pp_sensefold){0,1}.{0,400}?<span class="REFHWD merge_sense.*?)<!-- End of DIV dictionary-->.*?


替换为:\1\r\n查找模式:正则表达式   勾选匹配新行保存替换后的文件为hb.txt

讲解:

观察朗文5++词组部分的数据结构



词组部分起始位置标签是类似<span class="newline Sense " id="go__phr__1">,用正则很容易就匹配到,但是末尾闭合标签全是</span> 无法匹配,暂且先匹配至词组所处单词的释义的最末尾 即<!-- End of DIV dictionary-->,做为第一步的筛选,可以去掉很大一部分无用的内容

替换后结果是这样的


第三步
打开 hb.txt
替换目标:<span( class="(newline ){0,1}Sense( LDOCEVERSION_new){0,1}" id="\w+?">(<span class="LDOCE5pp_sensefold){0,1}.{0,400}?<)span( class="REFHWD merge_sense)

替换为:<jia\1hwd\5   查找模式:正则表达式

讲解:
这一步的目的是将词组的起始标签比如<span class="newline Sense " id="go__phr__1">改为自定义标签<jia class="newline Sense " id="go__phr__1">,将词组名的起始标签 <span class="REFHWD merge_sense>改为<hwd class="REFHWD merge_sense> 为下一步格式化html做准备

第四步
**** Hidden Message *****
等待过程中的窗口


讲解
tidy是个大杀器,能将html格式化的同时自动修复html里的错误,比如我们前面改的自定义标签<jia>和<hwd>,tidy会自动配对这两个标签的闭合标签,发现是</span>而非</jia></hwd>,则会自动将闭合标签改为独一无二的</jia>和</hwd>
这样我们就能轻松通过正则匹配到每个词组的结尾标签位置以及词组名结尾标签位置

第五步
打开 output.txt
替换目标:.*?(<a name="\w+?"></a>\r\n\s+?<jia class="(newline ){0,1}Sense( LDOCEVERSION_new){0,1}" id="(\w+?)">.+?<hwd class="REFHWD merge_sense[\w\s]*?">(.{1,280}?)</hwd>.*?</jia>).*?

替换为:\5\r\n<link href="LM5style_vanilla.css" rel="stylesheet" type="text/css" /><link href="LM5style.css" rel="stylesheet" type="text/css" /><link href="LM5style_switch.css" rel="stylesheet" type="text/css" /><link href="LM5style_show.css" rel="stylesheet" type="text/css" /><script src="jquery-3.2.1.min.js" charset="utf-8" type="text/javascript"></script><script src="LM5Switch.js" charset="utf-8" type="text/javascript"></script><span class="lm5ppbody"><div class="entry_content"><div class="dictionary"><span class="dictentry"><a name="\4__a"></a><span class="ldoceEntry Entry" id="\4"><span class="frequent Head"><span class="HWD">\5</span></span>\1</span></span></div></div></span>\r\n</>\r\n
查找模式:正则表达式   勾选匹配新行

讲解
既然我们能确定所有词组的起始和结束位置,以及词组名的起始和结束位置,那就可以彻底干掉所有没用的内容,只留下有用的词组相关的内容,并将其格式化为mdx要求的格式

替换后效果


到这一步,一部词典的词组提取已经完成了

接下来步骤是针对朗文5++词组的调整和优化,不同词典可能不同.

第一步:
上一步完成后,提取出来的词组名有些是这样的


需要改为abide by something   

(^</>\r\n.+)\r\n\s*?<span class="OBJECT">(.+?)</span>

\1 \2
查找模式:正则表达式   需要替换两次,因为有些是两个<span class="OBJECT">(.+?)</span>比如 take somebody up on something

第二步
去掉词组名里的双空格 三空格
替换目标:^(.+?)(|   )(.+?)\r\n<link
替换为 \1 \3\r\n<link查找模式:正则表达式    需要替换两次 因为有些词组名中多空格不止出现一次

第三步
愿词典词组中 比如somebody's 使用的是 ’ 而非标准的单引号 ' 作为上标 需要改过来,否则会造成一些词组查不到
替换目标:’
替换为:' 查找模式:普通

第四步
去除词组前面的数字序号
替换目标 \r\n\s*?<span class="sensenum span"( newline="yes"){0,1}>+</span>
替换为 空

还有进阶的针对查词的灵活性优化,合并原词典后的去重,这些就不说了,每部词典不同,没有通用性,

最后将完成后的文件内容复制到原mdx解压的txt中顶部, 用MdxBuilder   打包即可

只要严格按照我的步骤来,就一定可以完成提取,我是一遍码帖,一遍操作完成了一次提取的.

希望大家踊跃行动起来,提取出自己的词组词典,造福大家!

有问题请私信,正则,mdx等的基础知识普及不回哦.




jonah_w 发表于 2019-1-8 17:21:09

编译了一个Mac版tidy html
不知道可以用不… 反正按官方步骤编译的。
Mac用户有需要的时候 可以试试。

lastman 发表于 2019-3-11 18:57:37

把mdx导进sqlite3里面(网上能找到一个readmdict.py,稍微修改一下就能干这个),然后逐条处理,会不会比直接处理一个大txt要省劲一点儿?

我是用node.js来做正则处理的。当然用python也一样。

nidetou 发表于 2018-5-4 17:02:13

本帖最后由 nidetou 于 2018-5-4 17:13 编辑

链接:https://pan.baidu.com/s/1LbaCNOIHVV-tND9Dg48QgQ 密码:omwb

我提取Laad3词典例句音频(coca5000),按字母顺序分割为51个文件.最头痛的是每个单词下的例句没有排序。所以应按照theaurus, phrase,collocation, spoken和意项五个部分分别提取(如有可能把usage也单独提取),即使顺序不对,也没有什么大碍。

nidetou 发表于 2018-5-4 16:08:09

本帖最后由 nidetou 于 2018-5-4 17:14 编辑

这个一定要收藏,我想把coca5000从LAAD3提取音频例句,让大家听。由于不熟悉计算机语言,找到anki一款插件提取mdd文件中的音频,我是一个一个手工提取(大家别笑我,人笨没办法),合并文件有50多小时,没有放在出来的原因是例句排序很很麻烦。我感觉应分五个部分提取,theaurus, phrase,collocation, spoken和意项(如有可能usage也单独提取)。学外语大量听优先。如果有可能再把coca5000-10000提取,这样可建立输入词汇在大脑里形成bank.

QQending2 发表于 2018-5-3 00:44:36

非常好的东西,这么晚了还在码,辛苦了。明天我也要好好学学怎么替换……
比较好奇的是,为什么有些词典,例如简明必应 https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=20726 这份词典里
一些比如say等基础词汇,会出现前缀,后缀的,-等符号,导致如果将该词典作为首词典查询单词的时候,由于搜索机制的问题,输入say,会直接被导向-say之类的,然后……一个say搜出很多个同样的解释。
不知道制作这样带有符号的同一个单词,是批量生成过程中产生的问题,还是为了作为词组存在留下的。
研究好以后,看看能不能正则把这部分切了。

kyletruman 发表于 2018-5-3 00:47:22

QQending2 发表于 2018-5-3 00:44
非常好的东西,这么晚了还在码,辛苦了。明天我也要好好学学怎么替换……
比较好奇的是,为什么有些词典, ...

出现前缀,后缀的,-等符号词典中本来有这些词条,不奇怪{:4_97:}

gohome 发表于 2018-5-3 14:23:25

非常感谢楼主的分享!!!

孤影 发表于 2018-5-3 19:32:29

不管东西咋样 还是先谢谢了

donald909111487 发表于 2018-5-3 20:50:11

很喜欢关于词典技术的讨论

落霞与孤鹜齐飞 发表于 2018-5-3 23:49:13

给楼主点赞,这份工作需要一些创造力

RickVincent 发表于 2018-5-4 00:34:27

Thanks for sharing...

Yyang. 发表于 2018-5-4 11:40:55

千呼万唤始出来啊{:11_379:}

Saxons 发表于 2018-5-4 12:11:30

还是要对正则熟悉。

nidetou 发表于 2018-5-4 16:11:01

本帖最后由 nidetou 于 2018-5-4 16:34 编辑

朗文现代不好的原因是例句英美音混杂。

zongyyc 发表于 2018-5-4 22:55:18

谢谢,下来看看

weare1 发表于 2018-6-7 22:44:39

感谢楼主的分享!学习下。

drdic 发表于 2018-6-7 23:15:15

谢谢楼主的介绍,很想学习制作,先从基础开始

cixiplc66 发表于 2018-6-8 16:17:06

学习来了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

houbible 发表于 2018-6-14 17:35:07

感谢楼主分享制作经验,学习了!

Bouroz 发表于 2018-6-15 17:20:23

好贴!讲的很详细!可惜我看到的太晚了,浪费了好多时间

weird 发表于 2018-6-15 18:17:14

学习了。虽然会一丁点的正则,但一直没有太怎么敢用在这种大型处理上。

liuhanyou88 发表于 2018-6-15 22:24:34

非常感谢garypang精心整理,无私分享,授人以渔!

邱海波 发表于 2018-6-16 18:47:15

过来学习一下

kapan000 发表于 2018-6-16 19:24:52

这个要好好学习下
正则看不懂,哎。。。。。。。。。。

kylinsure 发表于 2018-6-20 19:56:03

看看啊。这个应该是非常好的。XUEXIB LA

yaknow 发表于 2018-6-25 16:42:23

谢谢garypang 实在是太感谢了 谢谢 对我帮助很大 可以自己diy了
页: [1] 2 3 4 5 6 7 8
查看完整版本: MDX词组提取 - 从正则进阶到头发护理