TA的每日心情 | 开心 2019-8-21 08:44 |
---|
签到天数: 163 天 [LV.7]常住居民III
状元
- 积分
- 14980
|
本帖最后由 mikeee 于 2019-1-2 11:59 编辑
Pdf文件:
工具:Abbyy Finereader + html 解析工具(主要用到 css selector或 xpath,此帖将使用 python3 的 pyquery)
其他信息:曾有网友发帖问起有没可能将此书做成 mdx [https://www.pdawiki.com/forum/fo ... light=word%2Borigin]。我用 Abbyy Finereader 网页版做了10 页的测试,证实可行。
后来没了下文。假期临近,我来学习这个帖 [https://www.pdawiki.com/forum/fo ... &tid=29288&ctid=352] 记录一下将两本书转成两列文本及 mdx 的过程。希望能帮助其他网友在将 pdf 转为 mdx 时节省一点时间。如有不当之处也请各路高人不吝指点。
难点:Pdf 转 mdx 的关键一步是将pdf文件里的文字转化成做 mdx 所需要的格式(词头和内容(释义))。最简单的格式就是两列,见过pdawiki有工具将两列xls转成 mdx。当然,要做成漂亮的 mdx 则需要折腾 css、javascript,这些不在此帖的范围。 一般情况下要将 pdf 文件里文字的词头和内容分离都会比较麻烦。如果有规则可循,则可以用上正则什么的。而此书尽管文本是可以直接拷出来的,但每页有页头(如 Ballad of Typhoid Mary 55)和字母(如L)的信息,要用正则处理到也不是不可能,不过肯定要折腾一番。最麻烦的地方可能是拷出来的文本段落信息没有了,pdf 文件里的每一行都是一段。结论,要pdf里的文字一次性拷出来整理成两列会非常麻烦。如果原pdf文件是扫描的,拷文字的办法自然也是不可以的。而此帖的办法则可以用于扫描pdf文件——尽管没有亲测过,可能有不少坑。有时间或许也会试试。
基本思想:用 Abbyy Fineread 将 pdf 转换成 docx, 再将 docx 转换成 html。再用 python包 pyqery分离词头和内容。(这一步也可用其他办法,比如 node的jquery或cheerio。python 里应该也是可以用 bs4 解析html,喜欢 xpath 的也可以用 lxml)。将 docx 转换成 html的另一个好处是:页头消失了。如果不想用程序解析 html,也可以用浏览器打开 html文件,拷出文本做进一步处理。
步骤一览
- Pdf 转 docx
- Docx 转 html
- 解析 html
其实[https://www.pdawiki.com/forum/fo ... light=word%2Borigin] 的9楼已经给出了步骤及 Python 源码。
第三步最简单的解析方法就是用浏览器打开 html 文件拷出文本再用自己喜欢的方法将词头和内容分离。本帖将利用 python 的 pyquery包非常快捷省力地分离词头和内容。
详细步骤, 重点在第三步上,但第一、二步好像也有坑。
A Dictionary of Confusable Phrases.pdf转Mdx
- Finereader设置:完全识别、检测页首、只识别英文、
果然有坑,全书 405 页,进行到四十几页时系统说内存不足。杀掉所有程序再试。因为知道pdf文件含文本,将“完全识别”改成“快速识别”,可以以节省内存——识别成功。
memo to self:第一、二步好像可以合成一步,Finereader里可直接存为 html,但是否可以用 css selector分离则有待测试。 试了,词头的html tag为- <span class="font6" style="font-weight:bold;">a la guerre comme a la guerre • c'est la guerre</span>
复制代码 在一个群里问到, 可用 css selector - span[class="font6"][style^="font-weight"]
复制代码 定位词头。以后再回来折腾这个。其实可以直接用 css selcetor: span[class="font6"][style="font-weight:bold;"] 或 span.font6[style="font-weight:bold;"]
memo to self: 先转成 docx 在处理纯英语文件时有个好处,可以利用Office Word的 spellchecker,而且Finereader不确定的地方会以颜色显示,有利于对格式、字体等的初步校核。格式和字体对css selector有影响。因此:分两步(pdf到docx,再docx到html)的做法是对的,第一、二步好像可以合成一步的做法不会再用了。
继续,用 Office 打开 docx,存为 html。用Chrome打开 htm 文件。右击页面选 Inspect (或Ctl-Shift-I)调出 Devtools。选定Element标签。在html页面里寻找粗体词头(比如第一个词头 a la guerre comme a la guerre • c'est la guerre)。
memo to self: OCR前可先切掉pdf文件的首尾。或用 Office 处理 docx 文件或用 BlueGriffon(或其他html编辑器)处理 html文件删去无用的东西,后面分析 css selector时可以省去一些麻烦。
折腾一阵后可以知道词头的 css selector 是 而释义部分的 css selector 是可以在Devtools里的 Elements标签里按 Ctl-F 后键入 .Bodytext30 或 .Bodytext0 验证:点击下箭头(Search Next),html 对应的元素被高亮。对应的序号会被显示出来。
.Bodytext30 共选出 3970个元素,第一个词头(a la guerre comme a la guerre • c'est la guerre)是第53个,最后一个词头(zero hour • zero time)是第 3969个,因此词头的个数应该是 3917 。用pdf阅读器打开pdf文件,可以看到从第10页到339为正文,共330页, 合每页约12条。大致差不多。其实这本书里的每一个词头都是一对,且含•。因此直接从pdf导出txt文本数一下•的个数就知道有多少条词目:3969 -- 和3917并不吻合。所以还要看看究竟是 .Bodytext30 漏了条目还是 • 出现在不是词头的地方。先搁置一下。(不吻合的原因是有些词头带两个•,有些释义里也用到•。)处理了一下后可以确定条目数为 3966。仔细看了一下html,发现Fineread OCR识别时错误地将几个词头整成了释义。html 错了 css selector 自然也就找不到词头,所以,OCR后先得检查 html 文件。
memo to self:OCR完了后应对照 pdf 检查 docx 或 html 文件。
前面讲过,由于《A Dictionary of Confusable Phrases》这本书的词头含 •(如 abandon ship • give up the ship)而且是自成一行,所有第三步无需折腾css selector而只需用简单的正则。只要通过浏览器从 html 文件拷出 txt, 再用正则将 词头和释义分离。附上第一、二步得到的 html 文件以及通过浏览器从 html文件拷出的 txt。【附件: html-txt-A Dictionary of Confusable Phrases.rar】
附件里的 txt可用支持正则的文本编辑器(如vscode,notepad++, emeditor、editpad、vim、emacs)用以下正则分离词头和释义:- \n([^•\n]*?)(\s*•\s*)([^\n]*)([\s\S]*?)(?=\n[^•\n]*•)
复制代码 (不想用环视的话好像搞不定……求坛里高人赐招。)前三个括号(即 \1 \2 \3)匹配词头; 第四个括号(\4)匹配释义。最后一个括号是环视零宽匹配。但因为有些释义里用到•,用正则的话必须对这些做特别处理。又一次显露了正则的局限性。
用正则分离出来的 词头(共3966条)放在附件里(附件 hw-via-regex.txt )
到这一步有了这个txt文件要做成 mdx其实已经不用费太大功夫了。如在文本编辑器里折腾的话,根据 MdxBuilder 的要求利用\1 \2 \3 \4就可以生成MdxBuilder所需要的文件,进而用MdxBuilder生成mdx。
- 从[A Dictionary of Confusable Phrases.htm](见附件)抽取词头 via python3 的 pyquery包
我们上面看到Devtools里用 .Bodytext30 选出的词头数和用正办法则得到不一样。我们需要检查Finereader OCR得到的 docx文件。但单靠肉眼检查是非常费力而又不可靠的方法。我们要做的是用python程序抽取词头,然后用比较软件对比 python 程序得到的词头和用正则得到的词头。二者不同的地方就是可能出现问题的地方。
来到了此帖的核心:pyquery,先上程序- '''
- For Python3, not tested for Python2
- extract headerwords from
- A Dictionary of Confusable Phrases-trimmed.htm
- '''
- from pathlib import Path
- from pyquery import PyQuery as pq
- file = r'A Dictionary of Confusable Phrases-trimmed.html'
- file = r'A Dictionary of Confusable Phrases.htm'
- assert Path(file).exists(), f'[{file}] does not exist'
- encoding = 'utf8'
- try:
- with open(file, 'rt', encoding=encoding) as fp:
- file_cont = fp.readlines()
- except Exception as exc:
- print(exc, 'trying with 18030')
- encoding = 'gb18030'
- try:
- with open(file, 'rt', encoding=encoding) as fp:
- file_cont = fp.read()
- except Exception as exc:
- print(exc)
- raise SystemExit(f'Unable to read file [{file}] in utf8 nor gb18030, exiting')
- # file content in file_cont, start to parse
- css_header = '.Bodytext30'
- doc = pq(file_cont)
- headers = doc(css_header)
- with open('hw-via-pyquery.html', 'w', encoding=encoding) as fhandle:
- fhandle.write(str(headers))
复制代码 贴上去的码缩进全没有了。手动缩进很辛苦。源码也上载在附件里。(稍微改了一下,直接输出词头txt文件,见附件 html_to_hw_rev.rar)
程序读进[A Dictionary of Confusable Phrases.htm](见附件),然后利用前面得到的 css selector (.Bodytext30) 抽取词头,再写进文件[hw-via-pyquery.html]. 用浏览器打开[hw-via-pyquery.html]大致这个样子:
在浏览器里ctl-a ctl-c 拷出 txt, 拷进文本编辑, 删掉空行(搜 \r\n\r\n 替代成 \r\rn 或用你喜欢的办法)。存为 hw-via-pqquery.txt。
再用比较软件打开 hw-via-regex.txt 和 hw-via-pqquery.txt。我用了 Beyand Compare. 这个样子:
左边是 hw-via-regex, 右边是 hw-via-pyquery. 可以看出,hw-via-pyquery漏掉了一些词头。根据显示的信息打开 docx检查以后,就发现 finereader做OCR时在换页有时会出错。在docx里参考原pdf文件进行修改。用Office Word打开 docx 后,可以看到,词头都是 size 8 粗体,而释义则是size 7。
Finereader将pdf转成 docx 再转成 htm 并不完美,近4000条例大约有30-40条要手动将词头的 .Bodytext0 修改成 .Bodytext30, 用到一条正则花了不少脑筋 (<p class=Bodytext[0][^>]*>((?!</p>).)*?•((?!</p>).)*?</p>) ,正则搜索htm文件里的 <p class=Bodytext0> ... </p> 含• 的地方,改成 Bodytext30。最终得到的词头见附件 hw-via-pyquery-rev.txt。
下一步就是抽取对应的释义了。可以预计会有很多坑。貌似圣诞假完不成。
好像还挺顺利。稍微折腾一下就可以知道,词头和释义分别在 .Body30 和 .Bodytext0、.Bodytext3 里。祭出python pyquery,贴源码缩进消失,不好整,就不贴源码了。源码见附件 html_to_hw_cont.rar。最后得到词头及释义的 txt 文本(附件 A Dictionary of Confusable Phrases edited1_hw_cont.rar),如下图
- 到这里,要从 txt 做成 mdx 词典已经不是太费事了。当然,还需要校对、微调格式等等。
折腾了一下午,mdx词典毛坯出来了,还有些问题,非ASCII码有乱码,索引还没整好。先放出来。附上python源码和 mdx词典。(附件 mdx_pdf-to-mdx.rar)及对应的 css 和 jpg (附件 demo_data.rar)。
mdx的乱码已经修好。但内容仍需校对,不过已不属于本帖的范围。会找时间为mdx词典做个详细的索引,只需加几行码不是太难的事情。
下面截止折腾 Word and Phrase Origin这本书。做法基本相同,过程的记录会简略一些。
鉴于标题里“最省力”这个词可能有争议;), 后面加个问号吧。
WORD AND PHRASE ORIGINS.pdf 转 Mdx
- pdf至docx
有了做上一本的经验,先将截取pdf正文(删掉首尾的序言和索引)。Finereader OCR花了两个多小时。打开得到的 docx文件却发现每页页首的页面数目和标题没有被移除,网络版Finereader反而移除了页首的东西。还好后面的css selector可以排除页首的东西、
- Docx至htm (见附件htm_to_txt_word-phrase-origin.rar里的 word-phrase-orgin.html)
- Htm至(Mdxbuilder用的)Mdic_thtml: 几乎可以重现 htm 里的内容
python 程序利用pyquery和 css selector 分离词头和释义 (见附件htm_to_txt_word-phrase-origin.rar里的html_to_hw_cont.py)
得到的 txt 几乎重现了 pdf的内容 (见附件htm_to_txt_word-phrase-origin.rar里的 word_and_phrase_origin.txt)。这个样子:
- ……sold it to consumers, eliminating the middleman. Within 20 years the company became the first American grocery chain.
- [Aardsma.] The huge Baseball Encyclopedia lists pitcher David Aardsma, now of the Boston Red Sox, as first on the alphabetical list of players who have played in the Major Leagues since 1876. Before Aardsma made the San Francisco Giants roster in 2004, home run king Hank Aaron topped the Encyclopedia list.
- [aardvark; aardwolf.] Both these animals dig in the earth for termites and ants, the former somewhat resembling a pig, the latter looking a little like a striped wolf. Thus the Boers in
- South Africa named them, respectively, the aardvark (from the Dutch aard, “earth,” plus vark, “pig”) or “earth pig,” and aardwolf, or “earth wolf.”
- [Aaron lily; Aaron's beard; Aaron's rod; Aaron's serpent.] Numerous plants are named for the patriarch Aaron. Mention in the 133d Psalm of “the beard of Aaron” led to Aaron's beard becoming the common name……
复制代码 要生成 Mdx词典只要加几行码生成Mdithtml再导入 MdxBuilder 生成 Mdx文件就可以了。从近1000页的 pdf 文件到 Mdx 词典毛坯只需一个人几小时的时间! - 做成了 Mdx,没校对过。(附件 mdx_word-phrase-origin.rar)
算是做完了两本书。结论:此法是可行的,但和用任何方法一样,最终还是需要人去一个一个字地检查及校对。大家如有什么建议、评论、问题,请跟帖,我尽量回答。开贴的四天以来我也学了不少东西,但愿此帖能对有些人有点用处或有所启发。(signing off boxing day 2018)
2018-12-27 更新:有网友发现 https://www.pdftohtml.net/ 可以免费(无文件大小限制、无广告、无需注册——至少现在是这样)将pdf转成 html并且找到了基于css selector的方法分离两列(成功将Word and Phrase Origins 一书的 pdf 分拆成每页左右两个文件)。这样的话,贴里提到的第一、二步就可以合成一步在 https://www.pdftohtml.net/ 上完成。2019-01-02 更新:重读开篇里提到的贴 https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=29288&ctid=352,里面说的用软件a-pdf-pc将pdf一切二和用Adobe Acrobt去页眉和页脚的方法都可以简化从pdf到mdx的制作,可以一试。贴里还说可以用软件AnyBizSoft_PDF_Converter将pdf转成html,下次也要试试。此帖的第一、二步可用软件包括:Abbyy Finereader,迅捷,AnyBizSoft_PDF_Converter 以及 pdftohtml.net (貌似只能转英语)。
|
-
html-to-txt-word-phrase-origin.jpg
(296.88 KB, 下载次数: 0)
-
html-to-txt-word-phrase-origin.jpg
(296.88 KB, 下载次数: 0)
-
-
html-txt-A Dictionary of Confusable Phrases.rar
1.53 MB, 下载次数: 4, 下载积分: 米 -5 粒
售价: 10 粒米 [记录]
[购买]
html txt A Dictionary of Confusable Phrases
-
-
hw-via-regex.txt
162.01 KB, 下载次数: 3, 下载积分: 米 -5 粒
词头3966条
-
-
html_to_hw.rar
557 Bytes, 下载次数: 3, 下载积分: 米 -5 粒
html_to_hw.py
-
-
html_to_hw_rev.rar
1.74 KB, 下载次数: 2, 下载积分: 米 -5 粒
html_to_hw.py 修改版
-
-
hw-via-pyquery-rev.txt
151.57 KB, 下载次数: 3, 下载积分: 米 -5 粒
词头viapyquery 修改版
-
-
html_to_hw_cont.rar
827 Bytes, 下载次数: 3, 下载积分: 米 -5 粒
html_to_hw_cont.py
-
-
A Dictionary of Confusable Phrases edited1_hw_cont.rar
653.66 KB, 下载次数: 1, 下载积分: 米 -5 粒
hw-cont confusable dict txt
-
-
mdx_pdf-to-mdx.rar
1.7 MB, 下载次数: 2, 下载积分: 米 -5 粒
html to mdicthtml py mdx
-
-
demo_data.rar
66.55 KB, 下载次数: 1, 下载积分: 米 -5 粒
css jpg for MdxBuilder
-
-
htm_to_txt_word-phrase-origin.rar
3.64 MB, 下载次数: 3, 下载积分: 米 -5 粒
-
-
mdx_word-phrase-origins.rar
2.55 MB, 下载次数: 8, 下载积分: 米 -5 粒
评分
-
3
查看全部评分
-
|