掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 14293|回复: 190

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

    [复制链接]
  • TA的每日心情
    慵懒
    2018-8-25 12:29
  • 签到天数: 91 天

    [LV.6]常住居民II

    发表于 2018-5-3 00:01:37 | 显示全部楼层 |阅读模式
    本帖最后由 garypang 于 2018-5-8 18:56 编辑
    & ^  L! a: B4 ~, O$ v$ @* x. Z" k; L  l7 N5 o  H( @
    阅读本帖前建议对正则表达式有一定的了解,本帖不做基础知识普及,只讲解关键点和思路
    + q. Z/ {1 t+ _- q7 B3 R6 L  l7 v/ _; s* n
    在我出了两个词组提取资源帖后,不少小伙伴都留言表示希望我出教程帖,也有希望我提取某某词典的词组,秉着授之于鱼不如授之以渔,造福论坛和广大网友的想法,分享下我提取朗文5++词组的全过程,只要跟着我一步一步来,哪怕不懂代码的小白,也能提取出朗文5++,但是要扩展到自己提取其他词典,则需要看懂各个步骤,并举一反三啦.( d& n2 O2 A' N7 s/ e3 R  P
    / X+ K8 M# Z8 V4 ]% q
    所用工具:
    0 v5 ]2 D7 F6 g* f9 h9 I文本编辑器 notepad++  https://notepad-plus-plus.org/download/ (其他编辑器无法保证本帖提供的正则正常运行)
    . B: p" O. f4 }3 d9 |3 h
    : `; ?: O) Q8 i  Y" _tidy-html5  https://github.com/htacg/tidy-html5
    % b3 L+ F3 d; o: l6 Y: u, R) {2 h已编译好版本,直接下载9 c2 y( E5 o* M4 p" d& m6 t
    游客,如果您要查看本帖隐藏内容请回复
    / J. v; B, \- i3 `- D

    ; Z$ A! U6 P4 I1 X' {mdx解压软件MdxExport   mdx打包软件 MdxBuilder   论坛有提供下载,
    * }" k! I7 z% x% q1 g; Y4 G- Z2 k; q) g6 y+ z3 s+ X* Q6 T0 N
    具体步骤
    , |. u6 b# Z1 B* M+ K6 E2 U) _7 }2 q8 u. G
    第一步 使用MdxExport 将mdx文件解压成txt文本文件% [% x! ?: `3 w1 [) f

    7 p+ P7 A6 l+ C( o4 I' C第二步
    : i' x7 P2 x' @& C4 q用notepad++打开解压后的txt文件,ctrl+H打开替换窗口2 m# S0 t1 h" c: O! B* B

    3 @! C& V. H% K( \% `5 e替换目标:
    1. .*?(<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-->.*?+ v, U8 J$ z$ l: H
    复制代码
    : B$ c" c( x- j, @
    & Q& V) O) a' j6 Y
    替换为:
    1. \1\r\n
    复制代码
    查找模式:正则表达式   勾选匹配新行  保存替换后的文件为hb.txt
    + C0 T% y$ A9 e  z6 H. `
    / A" C: @+ v2 X' P, x7 J+ o( E7 `2 K讲解:" @* k2 a& X0 u0 N

    # ^+ J; u) i. }: @' v2 R6 q观察朗文5++词组部分的数据结构
    / s0 ]$ L/ a7 v( V  L7 V8 E# D% p# J- l
    - L. M0 n9 k" L
    / ^8 z: \2 n3 K0 j1 Y) Q. b
    词组部分起始位置标签是类似<span class="newline Sense " id="go__phr__1">,用正则很容易就匹配到,但是末尾闭合标签全是</span> 无法匹配,暂且先匹配至词组所处单词的释义的最末尾 即<!-- End of DIV dictionary-->,做为第一步的筛选,可以去掉很大一部分无用的内容5 R( O: _, m& {: a  v

    6 q9 b2 X1 D' p; \: y/ _1 J替换后结果是这样的. w3 v4 Y* b) b" T$ z
    1 A* Q  h: U6 h  Z3 h& ]
    " ~$ @0 L) R. \0 t0 V% u8 G- t
    第三步
    9 T% \+ ]7 g) a- U) L打开 hb.txt
    , U* x1 a; ]1 r5 V- D3 t. I4 l替换目标:
    1. <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)) |# i/ H: b% M) ~( }; j' E
    复制代码

    . m( Q0 x. p, |1 a6 F" O替换为:
    1. <jia\1hwd\5
    复制代码
      查找模式:正则表达式  
    $ x; ~5 m2 @2 i- D) M0 V
    . R) S: A. }( Q" j% s$ ^9 t  j5 N讲解:3 b3 x, E) C, U+ D
    这一步的目的是将词组的起始标签比如<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做准备4 I0 I: h( x/ w. r( X" {# w
    / [8 H" J- @; O) i5 S" O) u6 R/ v
    第四步
    : h- I3 x2 l3 m0 T4 w  A: H, s
    游客,如果您要查看本帖隐藏内容请回复

    " c- Z6 C0 G. J) v( h/ {等待过程中的窗口. B+ @* J5 ?9 E9 [: g
    2 M2 }# W5 e, y* C' M5 F9 y

    & Q# X+ i! u' H+ i# ]5 ?讲解
    6 r0 f- [& q! }; etidy是个大杀器,能将html格式化的同时自动修复html里的错误,比如我们前面改的自定义标签<jia>和<hwd>,tidy会自动配对这两个标签的闭合标签,发现是</span>而非</jia></hwd>,则会自动将闭合标签改为独一无二的</jia>和</hwd>8 j# E  D2 L9 m; _- x7 O
    这样我们就能轻松通过正则匹配到每个词组的结尾标签位置以及词组名结尾标签位置
    9 _% e, G8 m3 ^: B1 C& @( E  k6 A3 \! \
    第五步
    ' S8 r* B- U6 K  x' B/ E* n打开 output.txt
    , W' J" n3 n; D/ t3 s/ _- Y替换目标:
    1. .*?(<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>).*?  I9 m0 G; ?* @0 x; O
    复制代码

    6 ?5 J1 y: B& C( h. N; Q& d* f: E替换为:
    1. \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\n7 }  ^' @  p$ y6 u
    复制代码
    查找模式:正则表达式   勾选匹配新行
    * J5 I, {. {! ?" l" e8 d1 u3 H; h3 u( Z& r* P. J9 K
    讲解* L# l" r9 u2 O
    既然我们能确定所有词组的起始和结束位置,以及词组名的起始和结束位置,那就可以彻底干掉所有没用的内容,只留下有用的词组相关的内容,并将其格式化为mdx要求的格式
    ; O, q, P# R5 y+ H5 r, a- a4 J; n# r
    替换后效果
    5 L! A% @9 j$ p2 `7 p& s3 t2 u( M% B2 n6 c

    % k* W& r) |9 [  O' F到这一步,一部词典的词组提取已经完成了. M, s0 W9 ?5 R# k! {4 y  @

    5 M9 \7 |. }1 ^) l接下来步骤是针对朗文5++词组的调整和优化,不同词典可能不同.
    / X' I% {3 J2 L. |" d' x8 o' S/ p1 ~
    第一步:# J& O; V! Y( u! h6 y+ k' n
    上一步完成后,提取出来的词组名有些是这样的
    ' Y% q5 A0 h! s# ^. a9 c9 y: S& m7 A- m% k$ n5 h  D

    8 Q' K3 M& B/ P# r2 V# A需要改为abide by something   ; F/ Y) c3 M1 N/ d+ d% D0 c! H! P! j

    ( v/ Z1 k* T. I/ b/ ?! d* @
    1. (^</>\r\n.+)\r\n\s*?<span class="OBJECT">(.+?)</span>
      6 G9 a5 [9 z3 i) e9 q# e) P6 B6 e7 k
    复制代码
    1. \1 \2. F: N9 |: A9 R7 C! v% y" a
    复制代码
    查找模式:正则表达式   需要替换两次,因为有些是两个<span class="OBJECT">(.+?)</span>  比如 take somebody up on something
      |/ k0 K5 g. P5 ]9 Y
    - v# i7 x, t2 q. q4 b) H# j( g; ~第二步. d# Y  }9 U4 j
    去掉词组名里的双空格 三空格# g' u: z5 M) ^" h5 V9 \& t0 s
    替换目标:
    1. ^(.+?)(  |   )(.+?)\r\n<link
    复制代码
    # u3 h# G* h: N3 f7 v: c$ l& C  a
    替换为
    1. \1 \3\r\n<link
    复制代码
    查找模式:正则表达式    需要替换两次 因为有些词组名中多空格不止出现一次
    0 E& b/ d0 o2 V* A. A) V) R' @2 H% w% n% G4 @3 c* Z  X
    第三步
    1 V/ ?3 G9 v* g* Y" f! h# W1 z愿词典词组中 比如somebody's 使用的是 ’ 而非标准的单引号 ' 作为上标 需要改过来,否则会造成一些词组查不到0 W1 h# Z0 F' V$ G
    替换目标:
    复制代码
    3 P4 D2 s* g& R1 J) r0 o
    替换为:
    1. '
    复制代码
    查找模式:普通
    $ {  v  ^! K. C! E
    9 n6 ^0 t! |  s/ h0 g' |  p7 G4 d第四步
    . Y9 g+ [2 O3 ?& ~" `去除词组前面的数字序号
    # ?& `9 j9 x2 I0 j0 C# }替换目标
    1. \r\n\s*?<span class="sensenum span"( newline="yes"){0,1}>[0-9]+</span>
    复制代码
    , X* r' l$ ~6 I
    替换为 空% U! ]. u1 f$ _6 o
    ' I0 S5 c1 m% j( e9 W: \. g
    还有进阶的针对查词的灵活性优化,合并原词典后的去重,这些就不说了,每部词典不同,没有通用性,
    9 _' v& E3 r& c1 N- O8 u7 ~
    : G, b7 j4 K$ m+ w) E, V最后将完成后的文件内容复制到原mdx解压的txt中顶部, 用MdxBuilder   打包即可
    4 P4 T6 Q' m  [+ g( \% f/ Q
      y( U4 S! g' J+ v6 D  _' `/ S8 A只要严格按照我的步骤来,就一定可以完成提取,我是一遍码帖,一遍操作完成了一次提取的.
    4 b6 K! c% w3 Q, J' D
    ( U$ o3 ]' T$ ?& I希望大家踊跃行动起来,提取出自己的词组词典,造福大家!& v4 o" c- s" i6 F
    % p  M4 G1 g$ A5 ~4 n/ \
    有问题请私信,正则,mdx等的基础知识普及不回哦.# O8 ~* g1 k- a5 L5 R3 n# z! I0 A. c  }
    2 V- o- U7 |2 E
    1 ?  b& ~* b2 A' B" v; }" O

    & a  V$ q+ V$ V$ L8 m' v1 d
    ! t# Z3 u3 z& a2 u2 N: P+ ^4 o

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x

    评分

    8

    查看全部评分

    本帖被以下淘专辑推荐:

    • · 工具|主题: 61, 订阅: 28
    • · 中医|主题: 7, 订阅: 0
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    发表于 2019-1-8 17:21:09 | 显示全部楼层
    编译了一个Mac版tidy html 2 I* Z" \8 l- }! Y0 {& P/ p
    不知道可以用不… 反正按官方步骤编译的。* O( l. [  t8 s$ t
    Mac用户有需要的时候 可以试试。
    * b( V" G. y) ~( Q

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2019-2-14 21:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-3-11 18:57:37 | 显示全部楼层
    把mdx导进sqlite3里面(网上能找到一个readmdict.py,稍微修改一下就能干这个),然后逐条处理,会不会比直接处理一个大txt要省劲一点儿?8 d5 G; H. s( N' f; V- G
    6 N( @" ]9 x, b
    我是用node.js来做正则处理的。当然用python也一样。
  • TA的每日心情
    开心
    2018-5-27 05:26
  • 签到天数: 55 天

    [LV.5]常住居民I

    发表于 2018-5-4 17:02:13 | 显示全部楼层
    本帖最后由 nidetou 于 2018-5-4 17:13 编辑 - I) I  g$ v8 F* ]2 Y$ Y: n
    / Q4 }% ~- V. r) R
    链接:https://pan.baidu.com/s/1LbaCNOIHVV-tND9Dg48QgQ 密码:omwb
    3 n) b& H+ Q6 x" I, r9 f. a$ L( P0 J. |6 `/ |
    我提取Laad3词典例句音频(coca5000),按字母顺序分割为51个文件.最头痛的是每个单词下的例句没有排序。所以应按照theaurus, phrase,collocation, spoken和意项五个部分分别提取(如有可能把usage也单独提取),即使顺序不对,也没有什么大碍。
  • TA的每日心情
    开心
    2018-5-27 05:26
  • 签到天数: 55 天

    [LV.5]常住居民I

    发表于 2018-5-4 16:08:09 | 显示全部楼层
    本帖最后由 nidetou 于 2018-5-4 17:14 编辑 ' u. o/ \$ J7 P! I$ G3 C" s9 {# S$ X

    ) J. N& {) Q) \2 I0 v1 |0 I. P这个一定要收藏,我想把coca5000从LAAD3提取音频例句,让大家听。由于不熟悉计算机语言,找到anki一款插件提取mdd文件中的音频,我是一个一个手工提取(大家别笑我,人笨没办法),合并文件有50多小时,没有放在出来的原因是例句排序很很麻烦。我感觉应分五个部分提取,theaurus, phrase,collocation, spoken和意项(如有可能usage也单独提取)。学外语大量听优先。如果有可能再把coca5000-10000提取,这样可建立输入词汇在大脑里形成bank.
  • TA的每日心情
    开心
    2020-5-23 22:47
  • 签到天数: 128 天

    [LV.7]常住居民III

    发表于 2018-5-3 00:44:36 | 显示全部楼层
    非常好的东西,这么晚了还在码,辛苦了。明天我也要好好学学怎么替换……/ R2 W) A; ^7 T5 p' N+ o; e* S
    比较好奇的是,为什么有些词典,例如简明必应 https://www.pdawiki.com/forum/fo ... hread&tid=20726 这份词典里
    ( s/ [, N4 v1 q一些比如say等基础词汇,会出现前缀,后缀的,-等符号,导致如果将该词典作为首词典查询单词的时候,由于搜索机制的问题,输入say,会直接被导向-say之类的,然后……一个say搜出很多个同样的解释。
    7 D  \3 ~, h2 D2 c! l$ w不知道制作这样带有符号的同一个单词,是批量生成过程中产生的问题,还是为了作为词组存在留下的。& h0 U8 x" p  e7 m
    研究好以后,看看能不能正则把这部分切了。
  • TA的每日心情
    开心
    2023-1-18 23:24
  • 签到天数: 211 天

    [LV.7]常住居民III

    发表于 2018-5-3 00:47:22 | 显示全部楼层
    QQending2 发表于 2018-5-3 00:44
    " b* s: s+ w, S5 m3 B7 C非常好的东西,这么晚了还在码,辛苦了。明天我也要好好学学怎么替换……+ u4 a2 q+ H, a. Z* W
    比较好奇的是,为什么有些词典, ...
    出现前缀,后缀的,-等符号
    词典中本来有这些词条,不奇怪
  • TA的每日心情
    开心
    2020-4-2 14:11
  • 签到天数: 464 天

    [LV.9]以坛为家II

    发表于 2018-5-3 14:23:25 | 显示全部楼层
    非常感谢楼主的分享!!!
  • TA的每日心情
    开心
    昨天 18:48
  • 签到天数: 759 天

    [LV.10]以坛为家III

    发表于 2018-5-3 19:32:29 | 显示全部楼层
    不管东西咋样 还是先谢谢了" g5 F" B- ~1 a, u% q
  • TA的每日心情
    擦汗
    昨天 06:46
  • 签到天数: 2283 天

    [LV.Master]伴坛终老

    发表于 2018-5-3 20:50:11 | 显示全部楼层
    很喜欢关于词典技术的讨论
  • TA的每日心情
    开心
    2018-4-10 07:58
  • 签到天数: 60 天

    [LV.6]常住居民II

    发表于 2018-5-3 23:49:13 | 显示全部楼层
    给楼主点赞,这份工作需要一些创造力
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 2220 天

    [LV.Master]伴坛终老

    发表于 2018-5-4 00:34:27 | 显示全部楼层
    Thanks for sharing...
  • TA的每日心情

    2018-6-16 18:13
  • 签到天数: 158 天

    [LV.7]常住居民III

    发表于 2018-5-4 11:40:55 | 显示全部楼层
    千呼万唤始出来啊
  • TA的每日心情
    慵懒
    2018-9-28 00:22
  • 签到天数: 273 天

    [LV.8]以坛为家I

    发表于 2018-5-4 12:11:30 | 显示全部楼层
    还是要对正则熟悉。
  • TA的每日心情
    开心
    2018-5-27 05:26
  • 签到天数: 55 天

    [LV.5]常住居民I

    发表于 2018-5-4 16:11:01 | 显示全部楼层
    本帖最后由 nidetou 于 2018-5-4 16:34 编辑
    , k. X# L! H  H) s0 d8 K
    - T9 s  @) d# v% Z朗文现代不好的原因是例句英美音混杂。
  • TA的每日心情
    开心
    昨天 09:46
  • 签到天数: 1610 天

    [LV.Master]伴坛终老

    发表于 2018-5-4 22:55:18 | 显示全部楼层
    谢谢,下来看看
  • TA的每日心情
    开心
    2019-10-25 14:29
  • 签到天数: 32 天

    [LV.5]常住居民I

    发表于 2018-6-7 22:44:39 | 显示全部楼层
    感谢楼主的分享!学习下。
  • TA的每日心情
    开心
    2023-1-13 01:10
  • 签到天数: 1469 天

    [LV.10]以坛为家III

    发表于 2018-6-7 23:15:15 | 显示全部楼层
    谢谢楼主的介绍,很想学习制作,先从基础开始

    该用户从未签到

    发表于 2018-6-14 17:35:07 | 显示全部楼层
    感谢楼主分享制作经验,学习了!
  • TA的每日心情
    擦汗
    2020-2-7 12:22
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2018-6-15 17:20:23 | 显示全部楼层
    好贴!讲的很详细!可惜我看到的太晚了,浪费了好多时间
  • TA的每日心情
    开心
    2018-6-18 09:03
  • 签到天数: 110 天

    [LV.6]常住居民II

    发表于 2018-6-15 18:17:14 | 显示全部楼层
    学习了。虽然会一丁点的正则,但一直没有太怎么敢用在这种大型处理上。
  • TA的每日心情
    开心
    2019-7-11 11:21
  • 签到天数: 313 天

    [LV.8]以坛为家I

    发表于 2018-6-15 22:24:34 | 显示全部楼层
    非常感谢garypang精心整理,无私分享,授人以渔!
  • TA的每日心情

    2018-6-15 14:54
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-6-16 18:47:15 | 显示全部楼层
    过来学习一下
  • TA的每日心情
    慵懒
    2021-11-14 17:58
  • 签到天数: 999 天

    [LV.10]以坛为家III

    发表于 2018-6-16 19:24:52 | 显示全部楼层
    这个要好好学习下
    " g! }$ b9 ~1 R6 a2 O正则看不懂,哎。。。。。。。。。。
  • TA的每日心情
    开心
    2018-6-20 16:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2018-6-20 19:56:03 | 显示全部楼层
    看看啊。这个应该是非常好的。XUEXIB LA
  • TA的每日心情
    奋斗
    2020-7-12 05:59
  • 签到天数: 97 天

    [LV.6]常住居民II

    发表于 2018-6-25 16:42:23 | 显示全部楼层
    谢谢garypang 实在是太感谢了 谢谢 对我帮助很大 可以自己diy了
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-27 02:00 , Processed in 0.079751 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

    快速回复 返回顶部 返回列表