掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1538|回复: 24

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

[复制链接]

该用户从未签到

发表于 2019-5-5 15:33:41 | 显示全部楼层 |阅读模式
本帖最后由 kandict 于 2019-5-5 18:28 编辑
/ p! ~5 I1 s2 U, A. D6 W
( n" `% v' z) U2 B  \' i; O目的:想把手里的某些词典过滤出个子集来使用。1 z8 _  ?4 `& B: |: |% I
方法:已生成了词头列表文件,根据它来提取mdx文本的相关词条。0 n7 c  a( U6 e; K9 x, A( T8 q
步骤:本来想的很简单,用emeditor的宏来实现:
3 j( m, T* k% u
  1. editor.ExecuteCommandByID(4548);                                               // 切换到词头列表文件
    ' I% `$ P5 `  F" f: Q, u# A
  2. nLegalHead = document.selection.Find( sSearchData ,eeFindNext,0); // 查找是否需要这个词/ q( E+ O6 Z0 K4 u3 R  ]& N
  3. editor.ExecuteCommandByID(4547);                                               // 切换回mdx文本
    , S2 @" e8 p3 p* f) j! D
  4. 9 c# r1 P1 V5 K' y; B& r
  5. if( nLegalHead != 0 ).......
复制代码

4 v9 Z# D4 l) l6 B5 n# K0 n# {但尝试了多次,发现emeditor总是在执行了一段时间后卡死 (假如注释掉切换文件的语句则不会卡死)。
8 A0 G4 X  ?6 \6 U" s3 R
' }! b  T4 V; ^7 s3 u+ S. N0 t2 ~7 a置顶的现成编辑工具中有两个有这个功能,其中一个总是执行出错,作者也不来论坛了。另一个Dict Source Editor还没有尝试。* H* d& O5 A2 Z0 h1 S% z$ a
8 i$ H+ d0 H: f9 V! J- a

, L" P' B' w) N. ?) y1 Q想请各位说说自己的经验,在windows下,这类文字处理都用什么工具;或者说说我emeditor使用方法哪里有错误。谢谢
/ s9 |$ f% \; J, S  L2 l+ u& s, W% [" f7 J/ l5 ~, S5 D3 C

" ^2 n# z/ J! ?) y4 q' i& O追加:emeditor其实没卡死,只是这种方式的速度慢的严重超出我想像,即使三千词的例子也让我误以为其卡死。* \7 l' f8 W  p% z( M

本帖被以下淘专辑推荐:

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

    [LV.5]常住居民I

    发表于 2019-5-6 07:07:03 | 显示全部楼层
    ogrishman 发表于 2019-5-6 06:564 s% a- ~# c( [- F: w. ]
    用Access怎么操作呀,是用SQL查询么?
    9 N1 ~' M+ k5 H# [$ e7 V
    貌似用emeditor更简单,我写了个帖子
    4 e8 c$ s' u; R9 H* f6 @: p! V; Khttps://www.pdawiki.com/forum/thread-34351-1-1.html

    点评

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

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    前天 20:43
  • 签到天数: 2183 天

    [LV.Master]伴坛终老

    发表于 2019-5-5 18:03:00 | 显示全部楼层
    不需要使用宏,可以直接使用筛选功能
    6 G" @- Y; B9 y- A
    2 @4 B" `$ B1 D0 |+ k8 _mdx 文本文件里的词条格式示例:
    4 b) p* c6 o! a: iabandon8 E9 ~' a+ M1 R  K8 d+ _/ r
    <link ... ><div ... > ... </div>+ i/ Q( _8 Q3 ~: Z3 {$ W2 d9 a
    </>+ C, y' c" V2 \1 ]6 w# S
    better
    2 \8 x8 G  i/ n& w<link ... ><div ... > ... </div>! q& M& C6 F* K3 G9 n
    </>
    " F, I  N' x& Lzero
    % o$ A9 N; ~! `( D8 T<link ... ><div ... > ... </div>7 G! w- b5 y' @3 A: F2 n  q. `' b
    </>2 G0 E4 y, T7 c8 C) Z: z
    ( w$ M2 o" W8 h/ [
    一、使用正则将词头文本文件替换为以下 TSV 格式(分隔符为制表符),用于导入高级筛选
    $ P! K  p, n- v; Z* B+ ^! Con        ^abandon$        -1        RO        0        -1) l8 s/ g9 J$ H  i+ D" q  G
    on        ^better$        -1        RO        0        -1! A# r+ j1 e1 A$ q
    on        ^zero$        -1        RO        0        -1; z) ^" B' b, a4 I( K& N( n

    ) u1 h1 }; [) N& O二、使用高级筛选) K# ^" n& x. L) G% B- G" r
    1. 打开 mdx 文本文件2 v' z( f0 {$ N7 A9 u4 t& U
    2. 打开筛选工具栏,并在“匹配行以下的额外的可见行数”中选择 25 f8 a  K, A: q5 `' h
    3. 点击“高级筛选”按钮,打开“高级筛选”工具栏。点击“导入...”并导入制作好的 TSV 文件,然后点击“筛选”,会列出所有词头及其词头以下的 2 行的内容. O# n! Y! P1 R
    4. 点击“提取全部”按钮,会提取全部筛选出的内容到一个新建的文本文件
    ' b& d+ s/ }% V* d; c- e9 S. C

    评分

    1

    查看全部评分

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

    [LV.7]常住居民III

    发表于 2019-5-5 21:21:50 | 显示全部楼层
    kandict 发表于 2019-5-5 20:52
    3 l, F- f! G$ E% ?- t如果通用工具能用,暂时就不试dict source editor了,看它说明里是有这个功能。
    ; A4 M- n! B; N$ I2 @那个py脚本帖子里说 "约  ...

    % b/ E. s7 o, j: _8 e+ Edict source editor目前提取词条最快(5000个词,印象当中用不了20s),并且缺了哪个词,提取完毕之后会有一个文档提示,不明白为什么不尝试用这款软件。而且只需要一个txt词表就可以提取了,傻瓜化点击几下鼠标就可以操作了,也无需修改mdx的源数据。

    该用户从未签到

     楼主| 发表于 2019-5-5 20:55:27 | 显示全部楼层
    leescott 发表于 2019-5-5 20:09
    0 ?% C/ k9 j' L- K2 pEMEDITOR 和 cnbook 都有文本批量替换的功能。
    , |" K+ Z, {! F. C4 u词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY” ...
    # ^3 v5 {; }# n# M. E; r
    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 编辑 2 u# w8 j* |+ ~

    . D  \& F6 N5 L9 T1 H0 ^5 @Dict Source Editor根据wordlist就可以用来提取内容,用过没问题,只是用的是类似正则表达式'|'的提取的方式,不完全按wordlist的词条顺序提取并分别列出来的那种,就是你指定提取1、3、2,被提取的内容顺序是1、2、3,提取完成,提取的内容还是1、2、3。
    . B5 t4 e- [" M* P  _按词表顺序列出来的,论坛有这样的python脚本,customiseMdxFromList【指定单词列表提取词库】:https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=25231,不过效率很慢,这种是需要一条条全文检索然后打印内容列出来的,所以比较耗时。

    - A  f* A# U% j- U. _# Y& o
    # o! n. V4 _* v- |+ A+ a+ E, ?/ @3 G0 m- O. h! ^8 c8 U) J) L/ X

      p# }' j6 v8 Y0 R2 Z+ z, s/ q
    ( a3 A' `7 ~' U5 b8 A  m" T

    点评

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

    评分

    1

    查看全部评分

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

    [LV.1]初来乍到

    发表于 2019-5-5 16:45:20 | 显示全部楼层
    Try this
      ~4 ?1 C9 u+ ?1 g& n* thttps://www.pdawiki.com/forum/fo ... &extra=page%3D14 V# d- [/ Z# E6 p( U  D! C
  • 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:598 h9 K1 H, {; Q9 o7 Y7 K
    python+xpath

    0 h: _6 F/ X9 \! q" O那感觉有点儿小题大做了。不知道有没有现成的类似emeditor这类的处理方案。

    该用户从未签到

     楼主| 发表于 2019-5-5 18:25:21 | 显示全部楼层
    喬治兄 发表于 2019-5-5 16:45
    6 I* n2 I1 q* B* f: mTry this
    1 F- v) a( \2 W+ w% }https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=18986&extra=page%3D1
    - ^! D9 i% T2 \  e% d8 ]
    昨天试过,执行出错。

    该用户从未签到

     楼主| 发表于 2019-5-5 18:46:15 | 显示全部楼层
    Word 发表于 2019-5-5 18:03
    # ]2 b- j. l3 h不需要使用宏,可以直接使用筛选功能5 j7 Q0 R9 Z: d: L" s. V
    4 i( x) t2 ?, w0 u. g
    mdx 文本文件里的词条格式示例:
    7 _% \& z9 Y; X* _
    看上去应该可行。
    , G0 }$ u+ U: b5 [& w筛选导入上十万词头时很慢,看来要先把词头晒好,半夜让它自己干。/ A8 I$ o/ P) U3 A/ V- v* s
    测试开工...
  • TA的每日心情
    慵懒
    前天 20:43
  • 签到天数: 2183 天

    [LV.Master]伴坛终老

    发表于 2019-5-5 18:57:45 | 显示全部楼层
    kandict 发表于 2019-5-5 18:46
    & Q5 W7 g5 }) {' q& h  W3 H7 Y看上去应该可行。
    * |7 \: @1 J" r) J* t筛选导入上十万词头时很慢,看来要先把词头晒好,半夜让它自己干。
    ( n' |# H9 G, @测试开工... ...

    7 E0 o9 l1 E! v0 T8 A, h& R; Z嗯,文件越大,词头越多,耗时越长,如果会导致软件崩溃什么的,也可以尝试将所有词头拆分为多个列表,然后逐一筛选和提取,最后合并即可
  • TA的每日心情
    开心
    2019-5-28 07:39
  • 签到天数: 339 天

    [LV.8]以坛为家I

    发表于 2019-5-5 20:09:27 | 显示全部楼层
    EMEDITOR 和 cnbook 都有文本批量替换的功能。2 l" G# |6 Y9 U4 z7 [5 }$ K
    词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY”。% Q+ M* j8 h* q; w2 T
    再来筛选或者反向筛选,就简单了。( |) p' u$ W( u0 W: N

    该用户从未签到

     楼主| 发表于 2019-5-5 20:52:57 | 显示全部楼层
    流星冲击 发表于 2019-5-5 19:51
    ) t6 L, b# e: V2 JDict Source Editor根据wordlist就可以用来提取内容,用过没问题,只是用的是类似正则表达式'|'的提取的方 ...

    # L3 F0 k* e1 y' r2 s% m4 Z6 V2 \0 R) I如果通用工具能用,暂时就不试dict source editor了,看它说明里是有这个功能。# f6 u- H. v) m$ Y
    那个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
    1 v4 ]7 }! O8 p1 Cdict source editor目前提取词条最快(5000个词,印象当中用不了20s),并且缺了哪个词,提取完毕之后会 ...

    ( D) R8 O, }% p) I& @速度确实不慢,放后台一会儿就生成了。最关键的是大文件能用,其它包括emeditor对大文件都失效了。
    4 h7 J% p- ^9 m7 ~6 E% T; u最终就是用它弄成功的。

    该用户从未签到

     楼主| 发表于 2019-5-5 22:25:22 | 显示全部楼层
    Word 发表于 2019-5-5 18:57
    , b) _# s3 z" G/ M8 c# n) Z嗯,文件越大,词头越多,耗时越长,如果会导致软件崩溃什么的,也可以尝试将所有词头拆分为多个列表,然 ...

    . Z* R3 z( l. s+ F2 Y( U词头拆成两份,还是不行。症状是按下“筛选”按钮后它啥都不干。3 ^8 a/ r- L& i5 Q8 ~
    较小的文件能正常筛选。

    该用户从未签到

     楼主| 发表于 2019-5-5 22:27:36 | 显示全部楼层
    gsxlm 发表于 2019-5-5 21:28
    % S( ?7 \1 q6 m- m6 @9 F  V用Access简单方便。

    + n3 F1 R+ U7 E( h总是装了它,却没用过。这对它应该是小菜。
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-5-6 06:56:22 | 显示全部楼层
    gsxlm 发表于 2019-5-5 21:28
    : z9 G* ~: K- G& r* j7 R+ Z4 O用Access简单方便。

    5 n; {5 F5 ?/ k用Access怎么操作呀,是用SQL查询么?
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-5-6 07:21:23 | 显示全部楼层
    本帖最后由 ogrishman 于 2019-5-6 08:42 编辑
    ' Z; F9 R5 y) f- Y" q
    # b. a4 [4 ^' u这种结构化的数据最好用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
    ' U  V/ _7 Q( E
    1 ^% W0 Y6 u5 r) p1 B另外我看楼主刚发了个迷你版the little dict,我解压后处理了一下,提取了所有的word list,然后用上面的命令针对这个word list在原始的the little dict里面提取词条。用手机粗略计时,11秒就完成了,也就是11秒钟在2.56G的文本文件里提取了326632个词条,提取结果大小是313MB。! w+ C* a* m3 Q1 Q* V; t" M

    该用户从未签到

     楼主| 发表于 2019-5-6 14:11:20 | 显示全部楼层
    ogrishman 发表于 2019-5-6 07:21( o! z7 u* u% j) D; r9 j4 o
    这种结构化的数据最好用perl或者AWK来处理。比如用AWK,处理mdx这种结构这么清晰的数据很容易,可以设置rec ...

    0 f3 Y( D" O/ ~使用机会很少,所以没打算为此学脚本。( y( N" h- A# m. r5 r
    你这速度快的惊人,不知它如何实现的。我用emeditor载入tld文本也要五六秒了。

    该用户从未签到

     楼主| 发表于 2019-5-6 14:51:21 | 显示全部楼层
    leescott 发表于 2019-5-5 20:09
    ' d7 ?7 n5 W6 S% s. ~EMEDITOR 和 cnbook 都有文本批量替换的功能。
    5 `8 l; r" ?3 T3 ]词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY” ...
    不需要宏,在替换那里有批量替换,输入一个,导出规则,再修改规则。最后,批量替换。
    , ?: p- r: s, a# [9 D
      f8 \9 q$ _/ f. c
    那个批处理不适合这事
    ) B( w( N4 ?1 T, s$ \# e" z1 f+ ^5 S, q# {$ P5 G. z
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-5-25 05:55 , Processed in 0.025494 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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