改进非结构化文本的解析

时间:2017-07-14 15:25:17

标签: python nlp nltk

我正在将合同公告解析为列以捕获公司,奖励金额,授予项目的描述等。A raw example can be found here.

我使用正则表达式编写了一个脚本来执行此操作,但随着时间的推移,我不得不考虑regexp方法作为长期解决方案的条件。我一直在读NLTK,似乎有两种方法可以使用NLTK来解决我的问题:

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

    1. 2是合理的解决方案
    2. 如果存在可能对培训我的模型有用的标记语料库
    3. 知道准确度随着训练数据的大小而提高,我应该从多少手动标记的公告开始。
    4. 以下是我如何构建训练集的示例。如果有任何明显的缺陷,请告诉我。

      IOB_tagged_text

1 个答案:

答案 0 :(得分:1)

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

Spacy有一个默认的英语NER模型,可以识别组织;它可能会或可能不会对你有用,但它值得一试。

您期望什么样的输出"项目的描述被授予"?通常NER会找到几个令牌长的项目,但我可以想象一个描述是几个句子。

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

enter image description here

你需要多少个例子取决于你的输入,但想到大约一百个作为绝对最小值并从那里积累起来。

希望有所帮助!

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

我从未见过像这样的任意短语使用的典型NER方法。如果您已经有标签,那么尝试和了解预测的方式并没有什么害处,但如果您遇到问题,还有另一种方法。

鉴于语言的规律性,解析器可能在此处有效。您可以在线试用Stanford Parser here。使用它的输出("解析树"),你可以取出动词为" award"的VP,然后在IN为&#的地方拔出PP 34;对于",这应该是你正在寻找的。 (大写字母为Penn Treebank Tags; VP表示"动词短语",PP表示"介词短语",IN表示"介词。)