查看: 2260|回复: 8
打印 上一主题 下一主题

[讨论] 【完成】pdf 转 mdx:Dictionary of Cliches (Facts on File)

[复制链接]
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    跳转到指定楼层
    1
    发表于 2019-1-23 01:19:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 mikeee 于 2019-2-6 22:50 编辑

    再来用 PDF 做个 mdx,Dictionary of Cliches的pdf文件论坛里可以搜到。大致看了一下,估计两小时的工作量——最后用了不下10小时。步骤:
    • 上传pdf到 https://pdftohtml.net, 几分钟后下载转成了 html 的文件。
    • 用 Chrome 打开解压后得到的 html 文件, F12调出 devtools。稍微研究一下后即可得知,div.cls_025>span.cls_025,div.cls_025>span.cls_023,div.cls_023 的 css selector 可以完美定位所需的内容。div.cls_025>span.cls_025 定位的是词头, div.cls_025>span.cls_023,div.cls_023定位词义。几行python搞定。(用 bs4 或lxml应该也是可以的, 其实pq是基于 lxml的etree元素。用node的cheerio的话基本思想差不多,码可能更简洁。用正则的话当然就用不了css selectors,可能会繁琐一点。)
      1. from pyquery import PyQuery as pq

      2. file = r'C:\Users\xyz\Downloads\Dictionary of Cliches (Facts on File)\b67f0a6e-1e61-11e9-8f58-0cc47a792c0a_id_b67f0a6e-1e61-11e9-8f58-0cc47a792c0a.html'
      3. doc = pq(open(file, encoding='utf8').read())

      4. hw_css = 'div.cls_025>span.cls_025'
      5. ctx0_css = 'div.cls_025>span.cls_023'
      6. ctx0a_css = 'div.cls_025>span.cls_028'
      7. ctx0b_css = 'div.cls_028'  # capital, references
      8. ctx0c_css = 'div.cls_027'  # italics, book names
      9. ctx1_css = 'div.cls_023'
      10. hw_ctx_css = f'{hw_css},{ctx0_css},{ctx0a_css},{ctx0b_css},{ctx0c_css},{ctx1_css}'

      11. # css selector 到最后比我预期的复杂些, 所以用 abbyy finereader 可能比用 pdftohtml.net 简单些。
      12. items = doc(hw_ctx_css)
      复制代码
      我们要的东西在 items 里。稍微处理一下 items 得到 由(词头,词义)组成的 entries
      1. entries = []
      2. hw = ''
      3. ctx = ''

      4. upper_b = 50
      5. for elm in items[: upper_b]:
      6.     tmp = pq(elm)
      7.     if tmp.attr('class') == 'cls_025':

      8.         entries += [(hw, ctx)]

      9.         hw = tmp.text()
      10.         ctx = ''
      11.     else:
      12.         ctx += f' {tmp.text()}'

      13. # collect the last batch
      14. entries += [(hw, ctx)]

      15. def proc_func(ctx):
      16.     ctx = ctx.strip()

      17.     # insert a space after .: [a-z]\.)([^\s])
      18.     ctx = re.sub(r'([a-z]\.)([^\s])', r'\1 \2', ctx)

      19.     # remove spaces
      20.     ctx = re.sub(r'\s\s+', r' ', ctx)
      21.     return ctx

      22. entries = [(elm[0], proc_func(elm[1])) for elm in entries]

      23. print(entries[:3])
      复制代码
      输出为
      1. [('', '—Christine Ammer —Christine Ammer'), ('about face, to do an',  'To reverse a decision or change one’s opinion. The term comes from the American military command to turn 180 degrees at attention, dating from the mid-nineteenth century, and by 1900 was being used figuratively. A more recent colloquial usage is to do a 180, but it has not yet reached cliché status.'), ('about the size of it',  'An approximately accurate version of a situation, event, or circumstance. It generally is used as a summing up: “That’s about the size of it. ”')]
      复制代码
      基本大功告成了。其实后面还是有很多事要做。
    • 转成(mdxbuilder可用的) mdxhtml 格式(其实也可以直接用writemdict直接做成 mdx)。pdftohtml.net 转的html含位置信息,要抽取词头和释义以及参考链接还是要费点周折。折腾了几个晚上。结果是上传的三个py文件(mapping_dict.py用于处理一些特殊的链接)。运行 gen_mdicthtml.py 即可生成 dict_of_cliches_mdict.html。用 mdxbuilder 处理 dict_of_cliches_mdict 即可得到 mdx 和 mdd。所有的 py、html及 css、封面 png 打成包(见附件),python码比较乱,没有整理,但Py3.6下是可以运行的,有兴趣的网友可以折腾一下。
    • Mdxbuilder 处理 dict_of_cliches_mdict.html 生成 mdx、mdd。(见附件)词头做了分拆,有交叉索引链接。见下图。
    • 改进:找时间再做个可以查独立单词或词组的详细索引,进一步提高字典的可用性。
    • 结语:如果 pdf 文件的内容是英文的并且可以拷出来,用 pdftohtml.net 转 html 再用 css selector 可以非常方便的自动处理词头和释义。但也有不少坑——漏掉一类  css selector就会导致内容的遗失。

    py-html-css-png-DictionaryofCliches.7z

    983.26 KB, 下载次数: 18, 下载积分: 米 -5 粒

    py-html-css-png-DictionaryofCliches

    DictionaryofCliches mdx.7z

    981.83 KB, 下载次数: 31, 下载积分: 米 -5 粒

    mdx mdd

    评分

    1

    查看全部评分

    本帖被以下淘专辑推荐:

  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

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

    2
    发表于 2019-1-23 01:35:09 | 只看该作者
    厉害了,要跟楼主学习
  • TA的每日心情
    开心
    2023-3-10 21:17
  • 签到天数: 85 天

    [LV.6]常住居民II

    5

    主题

    385

    回帖

    9235

    积分

    进士

    Rank: 8Rank: 8

    积分
    9235
    3
    发表于 2019-1-23 03:35:30 来自手机 | 只看该作者
    很厉害,就是看不懂
  • TA的每日心情
    开心
    前天 20:04
  • 签到天数: 695 天

    [LV.9]以坛为家II

    1

    主题

    761

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11072
    4
    发表于 2019-1-23 08:13:47 | 只看该作者
    厉害厉害,支持楼主!
  • TA的每日心情
    无聊
    2019-1-29 19:23
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    30

    回帖

    186

    积分

    童生

    Rank: 2

    积分
    186
    5
    发表于 2019-1-29 19:43:46 | 只看该作者
    厉害,根本看不懂
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    6
     楼主| 发表于 2019-2-6 16:58:31 | 只看该作者
    做完了,没有人工校对,免费下载 mdx。欢迎交流。

    该用户从未签到

    0

    主题

    173

    回帖

    5871

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5871
    7
    发表于 2019-2-27 08:12:11 | 只看该作者
    感谢楼主分享====
  • TA的每日心情
    擦汗
    2020-6-6 16:10
  • 签到天数: 164 天

    [LV.7]常住居民III

    12

    主题

    709

    回帖

    4591

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4591
    8
    发表于 2019-3-1 19:07:06 | 只看该作者
    楼主厉害啊 膜拜以下