来自PDF的干净文本

Tex*_*Tex 8 language-agnostic nlp stanford-nlp

这更像是一个算法问题,而不是一个特定的语言问题,所以我很高兴收到任何语言的答案 - 甚至伪代码,甚至只是一个想法.

这是我的问题:我需要处理来自PDF文章的大型数据集,这些文章被残酷地复制/粘贴到.txt中.我只得到这种可憎的结果,大约是16k文件,3.5 GB或文本(我使用的语料库是ACL Antology Network,http: //clair.si.umich.edu/clair/aan/DatasetContents . HTML).

"垃圾"来自公式,图像,表格等等.它只是弹出正在运行的文本的中间,所以我不能使用正则表达式来清理它,我也想不出任何使用机器学习的方法.我已经花了一个星期的时间,然后我决定继续进行快速而肮脏的修复.我不在乎完全清理它,只要大部分文本区域被删除,我就不会关心漏报和积极因素.

文本的一些例子:请注意公式包含垃圾字符,但表格和标题不包含(但它们仍然使我的句子很长,因此不可解析).垃圾以粗体显示.

容易一个:

重复实验,同时抑制第一个具有最大扩展的方案的专业化,然后是两个最扩展的模式.覆盖和加速的措施很重要1只要我们有兴趣保留分配给句子的f结构,这种覆盖概念就比必要的更严格.实际上,相同的f结构可以由多个解析分配,因此在某些情况下,即使专门语法为其分配正确的f结构,也认为句子不在覆盖范围内. 2'VPv'和'VPverb [main]'涵盖由主要动词为首的VP.'NPadj'涵盖附有形容词的NP.205原规则:l/Pperfp - + ADVP*SE(t ADJUNCT)($ ADV_TYPE)= t,padv~/r {@M_Head_Perfp I @ M_Head_Passp} @(Anaph_Ctrl $){AD VP + SE('~ADJUNCT) ($ ADV_TYPE)= vpadv由以下内容替换:ADVP,[.E(~ADJUNCT)(.升.ADV_TYPE)= vpadv l /'Pperfp - + @PPadjunct @PPcase_obl {@M.Head_Pevfp [@M .. Head_Passp} @(Anaph_Ctrl~)V {@M_Head_Perfp I @ M_Head_Passp} @(Anaph_Ctrl~)图1:从实际的法语语法中修剪规则. "*"和"+"符号具有正则表达式中的通常解释.括号中的子表达式是可选的.替代子表达式用大括号括起来,并用"["符号分隔.后跟标识符的"@"是宏扩展操作符,最终由其他功能描述替换. 语料库 - .. ,, 0.1 [消除歧义的Treebank树库人类专家语法专业化专业语法图2:我们的语法专业化实验的设置.这种形式的语法修剪可以实现什么的指标. 然而,它们可能会产生误导,因为如果没有覆盖,那么未被发现的句子的失败时间可能远低于他们的句子时间.

艰难的一个:

表4总结了英语和罗马尼亚语参考的精确结果.结果表明,英语的共指是比罗马尼亚共识更明显的,但是SNIZZLE提高了两种语言的共指分辨率.通过优先级高于罗马尼亚对应的启发式的启发式解决英语共指的情况,有64%的情况.这个结果解释了为什么英语罗马尼亚语SWIZZLE在罗马尼亚名词代词上有更好的精确度增强 73%89%66%78%76%93%71°/ o 82%表4:共指精度总计84%72%87% 76%英语罗马尼亚语SWIZZLE on English SWIZZLE on Romanian Nominal 69%63%66%61%Pronomoninal Total 89%78%83%72%87%77%80%70%表5:Coreference回顾英语的共识.表5还说明了召回结果.数据驱动的共参考分辨率优于其他方法的优势在于其更好的回忆性能.这可以通过这种方法捕获更多种共参照模式来解释.即使其他共参考分辨率系统对某些特定形式的系统表现更好,但它们的召回结果却被系统方法所超越.与单语数据驱动的共参照系统的召回相比,多语言共参数反过来提高了精度.此外,表5显示英语核心结果比罗马尼亚核心结构更能回忆.但是,召回显示SNIZZLE的两种语言都有所减少,因为删除了不精确的共参考链接.通常情况下,删除数据会降低召回率.通过使用为MUC评估开发的自动记分器程序获得所有结果.

请注意表格中没有包含奇怪的字符,并且正好在句子的中间:"这个结果解释了为什么有更好的精确度增强 - -TABLE HERE-英语参考." 我无法知道表格在运行文本方面的位置.它可能发生在句子之前,之后或之内,就像在这种情况下一样.另请注意,表格不会以句号结束(论文中的大多数字幕都没有...)所以我不能依靠标点来发现它.当然,我对非准确的界限感到满意,但我仍然需要对这些表做些什么.其中一些包含单词而不是数字,在这些情况下我没有足够的信息:没有垃圾字符,没有.只对人类显而易见:S

Yos*_*ale 2

(我讨厌蹩脚的复制和粘贴。)

您可能会发现一些有用的想法(我自己在这一点或另一点上使用了其中的每一个)

  1. (非常强力):使用分词器和字典(真正的字典,而不是数据结构) - 解析出单词和任何不是字典单词的单词 - 删除它。如果您的文本包含大量公司/产品名称,这可能会出现问题 - 但这也可以使用正确的索引来解决(网络上有一些 - 我正在使用一些专有的索引,因此我无法共享它们,对不起)

  2. 给定一组干净的文档(比如说 2K),为它们构建一个 tf/idf 索引,并将其用作字典 - 其他文档中未出现在索引中的每个术语(或出现的频率非常低) tf/idf) - 删除它。这应该会给你一个相当干净的文档。

  3. 使用亚马逊的机械土耳其人机制:设置一项任务,让阅读文档的人需要标记没有意义的段落。对于 Mechanical Turk 平台来说应该相当容易(16.5K 并不算多) - 这可能会花费你几百美元,但是你可能会得到相当好的文本清理(所以如果它是用公司的钱,这可能是你的出路——他们需要为自己的错误付出代价:))。

  4. 考虑到您的文档来自同一域(总而言之,相同的主题),并且问题完全相同(相同的表头、大致相同的公式):将所有文档分解为句子,并尝试使用 ML 对句子进行聚类。如果表标题/公式相对相似,它们应该很好地远离其余句子,然后您可以逐句清理文档(获取文档,将其分解为句子,对于每个句子,如果它是“奇怪”簇的一部分,将其删除)