查看: 813|回复: 24
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

23

主题

553

回帖

4546

积分

贡士

Rank: 6Rank: 6

积分
4546
跳转到指定楼层
1
发表于 2019-5-5 15:33:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kandict 于 2019-5-5 18:28 编辑

目的:想把手里的某些词典过滤出个子集来使用。
方法:已生成了词头列表文件,根据它来提取mdx文本的相关词条。
步骤:本来想的很简单,用emeditor的宏来实现:
  1. editor.ExecuteCommandByID(4548);                                               // 切换到词头列表文件
  2. nLegalHead = document.selection.Find( sSearchData ,eeFindNext,0); // 查找是否需要这个词
  3. editor.ExecuteCommandByID(4547);                                               // 切换回mdx文本

  4. if( nLegalHead != 0 ).......
复制代码

但尝试了多次,发现emeditor总是在执行了一段时间后卡死 (假如注释掉切换文件的语句则不会卡死)。

置顶的现成编辑工具中有两个有这个功能,其中一个总是执行出错,作者也不来论坛了。另一个Dict Source Editor还没有尝试。


想请各位说说自己的经验,在windows下,这类文字处理都用什么工具;或者说说我emeditor使用方法哪里有错误。谢谢


追加:emeditor其实没卡死,只是这种方式的速度慢的严重超出我想像,即使三千词的例子也让我误以为其卡死。

本帖被以下淘专辑推荐:

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

    [LV.5]常住居民I

    31

    主题

    232

    回帖

    2810

    积分

    解元

    Rank: 5Rank: 5

    积分
    2810
    来自 19楼
    发表于 2019-5-6 07:07:03 | 只看该作者
    ogrishman 发表于 2019-5-6 06:56
    用Access怎么操作呀,是用SQL查询么?

    貌似用emeditor更简单,我写了个帖子
    https://www.pdawiki.com/forum/thread-34351-1-1.html

    点评

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

    评分

    1

    查看全部评分

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

    [LV.Master]伴坛终老

    2

    主题

    1733

    回帖

    16万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    168862
    推荐
    发表于 2019-5-5 18:03:00 | 只看该作者
    不需要使用宏,可以直接使用筛选功能

    mdx 文本文件里的词条格式示例:
    abandon
    <link ... ><div ... > ... </div>
    </>
    better
    <link ... ><div ... > ... </div>
    </>
    zero
    <link ... ><div ... > ... </div>
    </>

    一、使用正则将词头文本文件替换为以下 TSV 格式(分隔符为制表符),用于导入高级筛选
    on        ^abandon$        -1        RO        0        -1
    on        ^better$        -1        RO        0        -1
    on        ^zero$        -1        RO        0        -1

    二、使用高级筛选
    1. 打开 mdx 文本文件
    2. 打开筛选工具栏,并在“匹配行以下的额外的可见行数”中选择 2
    3. 点击“高级筛选”按钮,打开“高级筛选”工具栏。点击“导入...”并导入制作好的 TSV 文件,然后点击“筛选”,会列出所有词头及其词头以下的 2 行的内容
    4. 点击“提取全部”按钮,会提取全部筛选出的内容到一个新建的文本文件

    评分

    1

    查看全部评分

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

    [LV.7]常住居民III

    16

    主题

    549

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    26462

    QQ 章

    推荐
    发表于 2019-5-5 21:21:50 | 只看该作者
    kandict 发表于 2019-5-5 20:52
    如果通用工具能用,暂时就不试dict source editor了,看它说明里是有这个功能。
    那个py脚本帖子里说 "约  ...

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

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    推荐
     楼主| 发表于 2019-5-5 20:55:27 | 只看该作者
    leescott 发表于 2019-5-5 20:09
    EMEDITOR 和 cnbook 都有文本批量替换的功能。
    词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY” ...

    emeditor宏执行有问题,几年前用过老版应该没问题,不试了。因为上面“Word”网友给出的筛选方案可用。

    点评

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

    [LV.7]常住居民III

    16

    主题

    549

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    26462

    QQ 章

    推荐
    发表于 2019-5-5 19:51:36 | 只看该作者
    本帖最后由 流星冲击 于 2019-5-5 19:55 编辑

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





    点评

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

    评分

    1

    查看全部评分

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

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    推荐
    发表于 2019-5-5 16:45:20 | 只看该作者
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

    2
    发表于 2019-5-5 15:59:59 | 只看该作者
    python+xpath

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    3
     楼主| 发表于 2019-5-5 16:31:11 | 只看该作者

    那感觉有点儿小题大做了。不知道有没有现成的类似emeditor这类的处理方案。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    6
     楼主| 发表于 2019-5-5 18:25:21 | 只看该作者
    喬治兄 发表于 2019-5-5 16:45
    Try this
    https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=18986&extra=page%3D1

    昨天试过,执行出错。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    7
     楼主| 发表于 2019-5-5 18:46:15 | 只看该作者
    Word 发表于 2019-5-5 18:03
    不需要使用宏,可以直接使用筛选功能

    mdx 文本文件里的词条格式示例:

    看上去应该可行。
    筛选导入上十万词头时很慢,看来要先把词头晒好,半夜让它自己干。
    测试开工...
  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 1593 天

    [LV.Master]伴坛终老

    2

    主题

    1733

    回帖

    16万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    168862
    8
    发表于 2019-5-5 18:57:45 | 只看该作者
    kandict 发表于 2019-5-5 18:46
    看上去应该可行。
    筛选导入上十万词头时很慢,看来要先把词头晒好,半夜让它自己干。
    测试开工... ...

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

    [LV.8]以坛为家I

    87

    主题

    558

    回帖

    4万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    42284
    10
    发表于 2019-5-5 20:09:27 | 只看该作者
    EMEDITOR 和 cnbook 都有文本批量替换的功能。
    词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY”。
    再来筛选或者反向筛选,就简单了。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    11
     楼主| 发表于 2019-5-5 20:52:57 | 只看该作者
    流星冲击 发表于 2019-5-5 19:51
    Dict Source Editor根据wordlist就可以用来提取内容,用过没问题,只是用的是类似正则表达式'|'的提取的方 ...

    如果通用工具能用,暂时就不试dict source editor了,看它说明里是有这个功能。
    那个py脚本帖子里说 "约 2.5 秒/词,5000 词合共约 3.5 小时" ,那我就不试了,算下来要一个星期...
  • TA的每日心情
    开心
    2019-7-5 07:32
  • 签到天数: 57 天

    [LV.5]常住居民I

    31

    主题

    232

    回帖

    2810

    积分

    解元

    Rank: 5Rank: 5

    积分
    2810
    14
    发表于 2019-5-5 21:28:04 | 只看该作者
    用Access简单方便。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    15
     楼主| 发表于 2019-5-5 22:20:25 | 只看该作者
    流星冲击 发表于 2019-5-5 21:21
    dict source editor目前提取词条最快(5000个词,印象当中用不了20s),并且缺了哪个词,提取完毕之后会 ...

    速度确实不慢,放后台一会儿就生成了。最关键的是大文件能用,其它包括emeditor对大文件都失效了。
    最终就是用它弄成功的。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    16
     楼主| 发表于 2019-5-5 22:25:22 | 只看该作者
    Word 发表于 2019-5-5 18:57
    嗯,文件越大,词头越多,耗时越长,如果会导致软件崩溃什么的,也可以尝试将所有词头拆分为多个列表,然 ...

    词头拆成两份,还是不行。症状是按下“筛选”按钮后它啥都不干。
    较小的文件能正常筛选。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    17
     楼主| 发表于 2019-5-5 22:27:36 | 只看该作者
    gsxlm 发表于 2019-5-5 21:28
    用Access简单方便。

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

    [LV.4]偶尔看看III

    43

    主题

    391

    回帖

    5万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    54723
    18
    发表于 2019-5-6 06:56:22 | 只看该作者
    gsxlm 发表于 2019-5-5 21:28
    用Access简单方便。

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

    [LV.4]偶尔看看III

    43

    主题

    391

    回帖

    5万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    54723
    20
    发表于 2019-5-6 07:21:23 | 只看该作者
    本帖最后由 ogrishman 于 2019-5-6 08:42 编辑

    这种结构化的数据最好用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

    另外我看楼主刚发了个迷你版the little dict,我解压后处理了一下,提取了所有的word list,然后用上面的命令针对这个word list在原始的the little dict里面提取词条。用手机粗略计时,11秒就完成了,也就是11秒钟在2.56G的文本文件里提取了326632个词条,提取结果大小是313MB。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    21
     楼主| 发表于 2019-5-6 14:11:20 | 只看该作者
    ogrishman 发表于 2019-5-6 07:21
    这种结构化的数据最好用perl或者AWK来处理。比如用AWK,处理mdx这种结构这么清晰的数据很容易,可以设置rec ...

    使用机会很少,所以没打算为此学脚本。
    你这速度快的惊人,不知它如何实现的。我用emeditor载入tld文本也要五六秒了。

    该用户从未签到

    23

    主题

    553

    回帖

    4546

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4546
    22
     楼主| 发表于 2019-5-6 14:51:21 | 只看该作者
    leescott 发表于 2019-5-5 20:09
    EMEDITOR 和 cnbook 都有文本批量替换的功能。
    词条一个一行。比如“爱好”等等,批量替换为“TTT爱好YYY” ...
    不需要宏,在替换那里有批量替换,输入一个,导出规则,再修改规则。最后,批量替换。


    那个批处理不适合这事