掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1164|回复: 24

[求助] 如何根据词头列表,来过滤mdx的文本?

[复制链接]

该用户从未签到

发表于 2019-5-5 15:33:41 | 显示全部楼层 |阅读模式
本帖最后由 kandict 于 2019-5-5 18:28 编辑
% \8 I4 {- P. M6 |& B, o$ X! [+ F, L' O
目的:想把手里的某些词典过滤出个子集来使用。
* \( h; x9 c5 M- p+ d3 [5 ]方法:已生成了词头列表文件,根据它来提取mdx文本的相关词条。, @& k- c0 N& {0 j. s6 K
步骤:本来想的很简单,用emeditor的宏来实现:
( j9 N$ g, f# N' J; F0 [( p
  1. editor.ExecuteCommandByID(4548);                                               // 切换到词头列表文件$ q  w) x: q0 l/ t
  2. nLegalHead = document.selection.Find( sSearchData ,eeFindNext,0); // 查找是否需要这个词
    7 }" c, c: f1 Q
  3. editor.ExecuteCommandByID(4547);                                               // 切换回mdx文本( f( n/ z) I) `4 w" P+ @! l/ r. |2 z* [

  4. 9 Y7 x9 T9 N1 x( d
  5. if( nLegalHead != 0 ).......
复制代码

5 i# O7 l$ w" r但尝试了多次,发现emeditor总是在执行了一段时间后卡死 (假如注释掉切换文件的语句则不会卡死)。
8 j5 D6 M% Q" s" u8 l3 q. j2 _; y% [
置顶的现成编辑工具中有两个有这个功能,其中一个总是执行出错,作者也不来论坛了。另一个Dict Source Editor还没有尝试。
0 b* d1 V4 [/ _5 K( w2 m$ j7 {$ Z4 x& j: Z
6 k. c3 T8 M& F" x  e8 k
想请各位说说自己的经验,在windows下,这类文字处理都用什么工具;或者说说我emeditor使用方法哪里有错误。谢谢* {' x# x. \  y* Q% x: m
" V6 u7 X# a7 Y  ?

  n  I/ K1 h4 k/ b" t5 G追加:emeditor其实没卡死,只是这种方式的速度慢的严重超出我想像,即使三千词的例子也让我误以为其卡死。
" Z% V7 X0 H5 i+ }$ G. W

本帖被以下淘专辑推荐:

  • TA的每日心情
    开心
    2019-7-5 07:32
  • 签到天数: 57 天

    [LV.5]常住居民I

    发表于 2019-5-6 07:07:03 | 显示全部楼层
    ogrishman 发表于 2019-5-6 06:562 J5 a2 Q1 {. Z, H2 s+ \* A- M
    用Access怎么操作呀,是用SQL查询么?

    ' N1 ~$ c# l, X: d+ O0 [& m貌似用emeditor更简单,我写了个帖子
    6 b% x8 l: s% A5 i: y! O) }https://www.pdawiki.com/forum/thread-34351-1-1.html

    点评

    具体到我的这个需求,你用emeditor合并csv的方法是最合逻辑最方便的,而且速度很快。感谢。  发表于 2019-5-6 14:41

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 1852 天

    [LV.Master]伴坛终老

    发表于 2019-5-5 18:03:00 | 显示全部楼层
    不需要使用宏,可以直接使用筛选功能
    - t8 i8 ~( O5 {( N3 u/ [1 i1 Y
    # T: X( h  m% g5 b; o  w% fmdx 文本文件里的词条格式示例:7 g. l9 p/ t% ?3 N* m) k  K5 M
    abandon
    ' ~7 w( `# T8 {4 i* O' L! o- [<link ... ><div ... > ... </div>, f7 B- y  b# q8 D% s8 k8 }* s, T
    </>* w. s' B+ a3 w
    better4 w2 v) O8 g, u& v, E
    <link ... ><div ... > ... </div>- X  H2 p* s, T
    </>
    , h! E+ Q& w% c5 Nzero
    1 D1 j/ x! g% _! p; A) H<link ... ><div ... > ... </div>
    ; o3 n8 T* e. c! r1 L8 B0 i</>
    * p! |2 `$ x0 h+ t' S% ?4 }+ p5 _$ t: q- K* l
    一、使用正则将词头文本文件替换为以下 TSV 格式(分隔符为制表符),用于导入高级筛选
    & x# d; J- E2 W1 {7 B2 ron        ^abandon$        -1        RO        0        -19 ~2 o8 w1 ^: C% i! T
    on        ^better$        -1        RO        0        -1
    $ n% w- Z$ N8 z; Q: s% }on        ^zero$        -1        RO        0        -1! d! d7 W: F  g7 g$ C. R+ I

    0 p$ Z$ X# E, M8 _6 F' w二、使用高级筛选
    ! |) D; n0 @! l" A5 k. g1. 打开 mdx 文本文件  \/ O9 D5 D7 v7 T2 a6 Y
    2. 打开筛选工具栏,并在“匹配行以下的额外的可见行数”中选择 2
    ! Q1 {# ?3 l) m3. 点击“高级筛选”按钮,打开“高级筛选”工具栏。点击“导入...”并导入制作好的 TSV 文件,然后点击“筛选”,会列出所有词头及其词头以下的 2 行的内容; m, s5 C9 \8 e* f, D
    4. 点击“提取全部”按钮,会提取全部筛选出的内容到一个新建的文本文件
    . q. R4 f3 K: n& S- L2 x- S6 [$ u" k

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2019-3-26 21:36
  • 签到天数: 178 天

    [LV.7]常住居民III

    发表于 2019-5-5 21:21:50 | 显示全部楼层
    kandict 发表于 2019-5-5 20:521 {3 @9 W, W1 n- y# ~( `3 _3 D
    如果通用工具能用,暂时就不试dict source editor了,看它说明里是有这个功能。0 g6 A7 h4 b. b: o0 o
    那个py脚本帖子里说 "约  ...

    0 T3 B+ I) [2 s5 P  bdict source editor目前提取词条最快(5000个词,印象当中用不了20s),并且缺了哪个词,提取完毕之后会有一个文档提示,不明白为什么不尝试用这款软件。而且只需要一个txt词表就可以提取了,傻瓜化点击几下鼠标就可以操作了,也无需修改mdx的源数据。

    该用户从未签到

     楼主| 发表于 2019-5-5 20:55:27 | 显示全部楼层
    leescott 发表于 2019-5-5 20:09
    & h" M( T  z! W& q- K) AEMEDITOR 和 cnbook 都有文本批量替换的功能。/ K# `3 C2 j) o! Q
    词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY” ...

    9 q# v9 Q1 W* a: D) q3 ?emeditor宏执行有问题,几年前用过老版应该没问题,不试了。因为上面“Word”网友给出的筛选方案可用。

    点评

    不需要宏,在替换那里有批量替换,输入一个,导出规则,再修改规则。最后,批量替换。  发表于 2019-5-6 07:26
  • TA的每日心情
    开心
    2019-3-26 21:36
  • 签到天数: 178 天

    [LV.7]常住居民III

    发表于 2019-5-5 19:51:36 | 显示全部楼层
    本帖最后由 流星冲击 于 2019-5-5 19:55 编辑
    3 j0 n; r5 p6 @, r  f! U+ A5 A
    + @0 O% }/ a( Q3 Z" ^' A2 G- F4 I0 z; ODict Source Editor根据wordlist就可以用来提取内容,用过没问题,只是用的是类似正则表达式'|'的提取的方式,不完全按wordlist的词条顺序提取并分别列出来的那种,就是你指定提取1、3、2,被提取的内容顺序是1、2、3,提取完成,提取的内容还是1、2、3。
    2 x7 F- C( A0 p0 D按词表顺序列出来的,论坛有这样的python脚本,customiseMdxFromList【指定单词列表提取词库】:https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=25231,不过效率很慢,这种是需要一条条全文检索然后打印内容列出来的,所以比较耗时。
    ( c! g. E. f( B9 B
    2 V- G6 E; X( U
    ) b+ k" c) ~( g5 S6 K! y0 f6 O

    9 @9 h$ P( s, _+ y# A+ u* f! J+ ?* M! y8 O+ |

    点评

    最终还是用了它  发表于 2019-5-5 22:23

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-5-5 16:45:20 | 显示全部楼层
    Try this
    1 L4 F& M0 D: [* U! Uhttps://www.pdawiki.com/forum/fo ... &extra=page%3D1+ Q+ J1 s# s! Q
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    发表于 2019-5-5 15:59:59 | 显示全部楼层
    python+xpath

    该用户从未签到

     楼主| 发表于 2019-5-5 16:31:11 | 显示全部楼层
    jonah_w 发表于 2019-5-5 15:599 {5 e) B1 Y( n8 r8 `
    python+xpath

      G# z( J4 C( u那感觉有点儿小题大做了。不知道有没有现成的类似emeditor这类的处理方案。

    该用户从未签到

     楼主| 发表于 2019-5-5 18:25:21 | 显示全部楼层
    喬治兄 发表于 2019-5-5 16:45
    ' F6 {4 @# c# F% R4 r- o4 gTry this) W; O9 K( |$ c) y- n
    https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=18986&extra=page%3D1
    $ {' J7 ^3 c# i* w9 T  \$ K
    昨天试过,执行出错。

    该用户从未签到

     楼主| 发表于 2019-5-5 18:46:15 | 显示全部楼层
    Word 发表于 2019-5-5 18:03
    # S1 H! ]6 z) M+ k& r' t不需要使用宏,可以直接使用筛选功能
    : ]' O" D9 j+ D
    # T- K  }4 u* ^! O0 O9 wmdx 文本文件里的词条格式示例:

    $ D" A2 P0 d3 S- _* e看上去应该可行。
    0 b2 a1 _) [, }- o筛选导入上十万词头时很慢,看来要先把词头晒好,半夜让它自己干。
    , p# h$ u5 J1 f8 _& v* b4 o  v测试开工...
  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 1852 天

    [LV.Master]伴坛终老

    发表于 2019-5-5 18:57:45 | 显示全部楼层
    kandict 发表于 2019-5-5 18:46
      n+ n4 v5 J0 L- i看上去应该可行。
    4 h$ u, ~  K' K( l# A, j筛选导入上十万词头时很慢,看来要先把词头晒好,半夜让它自己干。' q+ A: Y1 D- e; @( P9 ^, f. j
    测试开工... ...

    % f5 `8 M# Z. g" a嗯,文件越大,词头越多,耗时越长,如果会导致软件崩溃什么的,也可以尝试将所有词头拆分为多个列表,然后逐一筛选和提取,最后合并即可
  • TA的每日心情
    开心
    2019-5-28 07:39
  • 签到天数: 339 天

    [LV.8]以坛为家I

    发表于 2019-5-5 20:09:27 | 显示全部楼层
    EMEDITOR 和 cnbook 都有文本批量替换的功能。
    ! [. E  Y+ n8 _! s8 Q5 Y3 e词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY”。
    4 C' w2 I1 {! j再来筛选或者反向筛选,就简单了。
    # z* P+ P# S) _+ U1 [. w7 m( P

    该用户从未签到

     楼主| 发表于 2019-5-5 20:52:57 | 显示全部楼层
    流星冲击 发表于 2019-5-5 19:517 Z# s& _! D5 d- i
    Dict Source Editor根据wordlist就可以用来提取内容,用过没问题,只是用的是类似正则表达式'|'的提取的方 ...
    - ~  I) ~# P) B! g' ^
    如果通用工具能用,暂时就不试dict source editor了,看它说明里是有这个功能。
    / x; G$ `2 _6 ?# Q: ~* C那个py脚本帖子里说 "约 2.5 秒/词,5000 词合共约 3.5 小时" ,那我就不试了,算下来要一个星期...
  • TA的每日心情
    开心
    2019-7-5 07:32
  • 签到天数: 57 天

    [LV.5]常住居民I

    发表于 2019-5-5 21:28:04 | 显示全部楼层
    用Access简单方便。

    该用户从未签到

     楼主| 发表于 2019-5-5 22:20:25 | 显示全部楼层
    流星冲击 发表于 2019-5-5 21:21. f1 L6 _3 x. p& u- v* b! q
    dict source editor目前提取词条最快(5000个词,印象当中用不了20s),并且缺了哪个词,提取完毕之后会 ...

    ; ~1 v8 K8 O/ t+ w8 ]速度确实不慢,放后台一会儿就生成了。最关键的是大文件能用,其它包括emeditor对大文件都失效了。+ d* P$ z$ h. `6 B
    最终就是用它弄成功的。

    该用户从未签到

     楼主| 发表于 2019-5-5 22:25:22 | 显示全部楼层
    Word 发表于 2019-5-5 18:570 `1 Z, Z4 X+ `
    嗯,文件越大,词头越多,耗时越长,如果会导致软件崩溃什么的,也可以尝试将所有词头拆分为多个列表,然 ...
    ! G' J7 K, \# Z6 S
    词头拆成两份,还是不行。症状是按下“筛选”按钮后它啥都不干。4 r9 R* ]6 `( M! x- l8 N+ u% Y
    较小的文件能正常筛选。

    该用户从未签到

     楼主| 发表于 2019-5-5 22:27:36 | 显示全部楼层
    gsxlm 发表于 2019-5-5 21:28
    ( w3 l( q0 |! |5 g) L用Access简单方便。
    / R  z$ v, I- H7 i" K7 p
    总是装了它,却没用过。这对它应该是小菜。
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-5-6 06:56:22 | 显示全部楼层
    gsxlm 发表于 2019-5-5 21:288 Z' y- [; o2 h  k0 I
    用Access简单方便。
    * _  {6 d$ n' i
    用Access怎么操作呀,是用SQL查询么?
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-5-6 07:21:23 | 显示全部楼层
    本帖最后由 ogrishman 于 2019-5-6 08:42 编辑 ) e8 |) z/ a7 h8 T% w& E7 f$ [! V

    , C( n9 ?0 W  B5 [. ?这种结构化的数据最好用perl或者AWK来处理。比如用AWK,处理mdx这种结构这么清晰的数据很容易,可以设置record separator为</>,field separator为换行符,然后只把匹配上的record输出就行了。楼主这个例子,用下面的命令就可以:gawk 'NR==FNR{arr[$0];next} $1 in arr' RS='\r?\n' 词头列表.txt RS='</>\r?\n' FS='\r?\n' ORS='</>\n' 文本.txt
    % c. ^6 k2 Z- j, s3 [- H5 `4 {3 f! R3 Z+ A; S9 ^! a
    另外我看楼主刚发了个迷你版the little dict,我解压后处理了一下,提取了所有的word list,然后用上面的命令针对这个word list在原始的the little dict里面提取词条。用手机粗略计时,11秒就完成了,也就是11秒钟在2.56G的文本文件里提取了326632个词条,提取结果大小是313MB。
    3 Q0 |& \) M* W

    该用户从未签到

     楼主| 发表于 2019-5-6 14:11:20 | 显示全部楼层
    ogrishman 发表于 2019-5-6 07:21( Y: @( H- _/ K$ d) v8 B
    这种结构化的数据最好用perl或者AWK来处理。比如用AWK,处理mdx这种结构这么清晰的数据很容易,可以设置rec ...
    # V) b3 O3 {7 B0 M1 z* B
    使用机会很少,所以没打算为此学脚本。
    . ?: ?! D9 [' m$ F0 R9 T- }你这速度快的惊人,不知它如何实现的。我用emeditor载入tld文本也要五六秒了。

    该用户从未签到

     楼主| 发表于 2019-5-6 14:51:21 | 显示全部楼层
    leescott 发表于 2019-5-5 20:09% y, b+ U: v. O( g; {5 r8 z" S
    EMEDITOR 和 cnbook 都有文本批量替换的功能。/ D, e* S- X9 }/ O" Q. }  e
    词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY” ...
    不需要宏,在替换那里有批量替换,输入一个,导出规则,再修改规则。最后,批量替换。

    ! h; E& i" P' N8 [1 m0 k$ @+ S. ?1 s2 q: S; C' _) q
    那个批处理不适合这事
    7 w# y: v9 a0 v. y* a( Q+ O, o6 B+ T$ E$ t5 q
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-5-9 12:48 , Processed in 0.075959 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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