3.2 从字处理器文件获取数据

文字处理软件通常用来在具有有限的可计算基础设施的项目中手工编制文本和词汇。这些项目往往提供数据录入模板,通过字处理软件并不能保证数据结构正确。例如,每个文本可能需要有一个标题和日期。同样,每个词条可能有一些必须的字段。随着数据规模和复杂性的增长,用于维持其一致性的时间的比重也增大。

我们怎样才能提取这些文件的内容,使我们能够在外部程序中操作?此外,我们如何才能验证这些文件的内容,以帮助作者创造结构良好的数据,在原始的创作过程中最大限度提高数据的质量?

考虑一个字典,其中的每个条目都有一个词性字段,从一个 20 个可能值的集合选取,在发音字段显示,以 11 号黑体字呈现。传统的文字处理器没有能够验证所有的词性字段已正确输入和显示的搜索函数或宏。这个任务需要彻底的手动检查。如果字处理器允许保存文档为一种非专有的格式,如 text、HTML 或 XML,有时我们可以写程序自动做这个检查。

思考下面的一个词条的片段:“sleep [sli:p] v.i.condition of body and mind…“。我们可以在 MSWord 中输入这些词,然后“另存为网页”,然后检查生成的 HTML 文件:

  1. <p class=MsoNormal>sleep
  2. <span style='mso-spacerun:yes'> </span>
  3. [<span class=SpellE>sli:p</span>]
  4. <span style='mso-spacerun:yes'> </span>
  5. <b><span style='font-size:11.0pt'>v.i.</span></b>
  6. <span style='mso-spacerun:yes'> </span>
  7. <i>a condition of body and mind ...<o:p></o:p></i>
  8. </p>

这个简单的程序只是冰山一角。我们可以开发复杂的工具来检查字处理器文件的一致性,并报告错误,使字典的维护者可以 使用原来的文字处理器 纠正的原始文件。

只要我们知道数据的正确格式,就可以编写其他程序将数据转换成不同格式。3.1中的程序使用nltk.clean_html()剥离 HTML 标记,提取词和它们的发音,以“逗号分隔值”(CSV)格式生成输出。

  1. from bs4 import BeautifulSoup
  2. def lexical_data(html_file, encoding="utf-8"):
  3. SEP = '_ENTRY'
  4. html = open(html_file, encoding=encoding).read()
  5. html = re.sub(r'<p', SEP + '<p', html)
  6. text = BeautifulSoup(html).get_text()
  7. text = ' '.join(text.split())
  8. for entry in text.split(SEP):
  9. if entry.count(' ') > 2:
  10. yield entry.split(' ', 3)

with gzip.open(fn+”.gz”,”wb”) as f_out:

f_out.write(bytes(s, ‘UTF-8’))

注意

更多 HTML 复杂的处理可以使用http://www.crummy.com/software/BeautifulSoup/上的 Beautiful Soup 的包。