【问题标题】:Improving parsing of unstructured text改进非结构化文本的解析
【发布时间】:2017-12-19 18:29:40
【问题描述】:

我正在将合同公告解析成列,以捕获公司、中标金额、中标项目描述等。A raw example can be found here.

我使用正则表达式编写了一个脚本来执行此操作,但随着时间的推移会出现意外情况,我必须考虑正则表达式方法不能成为长期解决方案的原因。我一直在阅读 NLTK,似乎有两种方法可以使用 NLTK 来解决我的问题:

  1. 使用 RegexpParser 表达式对公告进行分块 - 如果我要捕获的两个不同字段具有相同的句子结构,这可能是一个弱解决方案。
  2. 获取 n 个公告,标记化并通过 pos 标记器运行 n 个公告,使用 IOB 格式手动标记我想要捕获的公告部分,然后使用这些标记的公告来训练 NER 模型。 A method discussed here

在我手动标记公告之前,我想衡量一下

  1. 2 是一个合理的解决方案
  2. 如果存在可能对训练我的模型有用的标记语料库
  3. 知道准确性会随着训练数据的大小而提高,我应该从多少手动标记的公告开始。

这是我如何构建训练集的示例。如果有任何明显的缺陷,请告诉我。

【问题讨论】:

    标签: python nlp nltk


    【解决方案1】:

    试图仅使用 POS 标签来获取公司名称和项目描述将是一件令人头疼的事情。绝对走NER路线。

    Spacy有一个默认的可以识别组织的英文NER模型;它可能适合您,也可能不适合您,但值得一试。

    对于“获奖项目的描述”,您期望什么样的输出?通常 NER 会发现几个标记长的项目,但我可以想象一个描述是几个句子。

    对于标记,请注意您不必使用文本文件。 Brat 是一个用于可视化标记文本的开源工具。

    您需要多少示例取决于您的输入,但将大约一百个视为绝对最小值并从那里开始构建。

    希望有帮助!


    关于项目描述,感谢您的示例,我现在有了更好的主意。看起来赠款第一句中的语言在介绍项目描述方面非常常规:XYZ Corp has been awarded $XXX for [description here]

    我从未见过用于此类任意短语的典型 NER 方法。如果您已经有了标签,那么尝试并查看预测的结果并没有什么坏处,但如果您遇到问题,还有另一种方法。

    鉴于语言的规律性,解析器可能在这里有效。您可以在线试用 Stanford Parser here。使用该输出(“分析树”),您可以拉出动词为“award”的VP,然后拉出IN为“for”的PP,这应该就是您的意思寻找。 (大写字母Penn Treebank Tags;VP表示“动词短语”,PP表示“介词短语”,IN表示“介词。)

    【讨论】:

    • 通过“描述标签”,我想捕捉一些关于承包商将做什么的叙述,例如“空中交通管制系统部门的集成、测试和评估、安装、维护、配置和管理设备”在最后的公告中。我已经对大约 400 条公告进行了标记和 POS 标记,并将它们写入 Excel 表,我可以在其中循环向下填充 IOB-Custom Tag Name 属性的列。我会在我的原始帖子中添加一个屏幕截图,以防有人觉得这很有用。我会尝试报告我是否取得了很大的成功。
    • 感谢更新;我添加了一种获取描述的方式。
    • 谢谢。这与 RegexpParser 方法不同,因为它估计哪个名词序列属于一起,而不是用户必须构建模式,是吗?正如我所提到的,我有正则表达式可以很好地解析公告,直到引入一些错误的额外空格字符,例如,然后我必须考虑这种意外情况。如果需要,我总是可以默认为那些。不过,我的计划是不依赖它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多