如何回答大型文档中的问题?

时间:2019-04-03 16:20:13

标签: nlp

大约两周前,由于我的项目需求低,我被分配了一个完全不寻常的请求:基于机器学习自动从文档中提取答案。之前,我从未阅读过有关ML,AI或NLP的任何文章,因此在过去的两周中,我基本上一直在这样做。

关于ML,到目前为止,我发现的大多数书籍推荐和教程都使用Python语言和工具,因此我花了第一周的时间来学习Python,NumPy,Scikit,Panda,Matplotlib等。然后,在花了几天时间了解通用ML算法之后,本周我开始了解NLP本身。

到目前为止,我已经基本了解了“词袋”,使用TF-IDF(或简称为词数)将词转换为数字表示形式,并使用了一些高斯和多项式朴素贝叶斯方法进行训练和预测价值观。这些方法还提到使用常规预处理方法(例如lemmatization等)的重要性。但是,基本上所有示例都假定可以将给定文本分类为一个分类主题,例如情感分析用例。恐怕这并不代表我的用例,因此我想在这里进行描述,以便您可以帮助我确定我应该寻找的方法。

我们拥有一个由专业团队手动输入数千笔交易/交易的系统。每笔交易都有一组文档(通常每笔交易有十二个文档),有些文档可能有数百页。对于任何特定的交易,输入团队必须从这些文档中提取大约一千个字段。因此,在我们的数据库中,我们拥有所有数据,并且通常也知道与每个字段值相关的特定于文档的摘要。

因此,我的任务是给定一个新的文档和交易,并根据先前的答案,通过自动在新文档中找到相应的代码段,填写尽可能多的字段。我不确定应该如何解决这个问题。

例如,我可以将文档的每个句子视为要分析的单独文档,并将其与我已经拥有的用于匹配数据的摘录进行比较。但是,我不能确定其中的某些句子是否会真正回答问题。例如,也许在文档中有6个事件可以回答特定的问题/领域,但是输入者只能识别其中的2个或3个。

另外,对于任何给定的句子,它都可以判断出给定字段的答案是A或B,或者句子与字段/问题之间绝对没有关联,就像对于大多数句子。我知道Scikit提供了predict_proba方法,因此,例如,如果回答问题的概率超过80%,我可以尝试只将句子视为相关,但是基于我使用很少的句子和单词,我怀疑这不会很好地工作。另外,将500页页面文档中的每个句子作为要分析的单独文档可能会很慢,因此我不确定是否有更好的方法来处理此用例。

其中一些字段是自由文本字段,例如公司名称和公司名称,我怀疑这些字段将是最难回答的,因此,我尝试从有限选择的字段开始分类集。

您如何建议我研究这个问题?您是否建议我研究用于解决此特定问题的算法?

对于这个主题的任何不准确/不正确的术语或理解,请原谅我,因为这对我来说是非常新的。非常感谢您的帮助。

更新:有人要求我提供更多详细信息,所以您在这里。

其中一个字段称为“交易结构”,它可能具有以下值:“资产购买”,“股票或股权购买”或“公共目标合并”(还有其他几个,但这给了您一个想法)。

因此,以下是公开目标合并交易的一些句子(这些文件来自Edgar Filings公共数据库,可免费用于美国交易):

交易1 /文件1: “由马萨诸塞州公司(以下简称“买方”)HarborOne Bancorp,Inc.,马里兰州马里兰州有限责任公司Massachusetts Acquisitions,LLC于2018年3月14日签署的合并协议和计划(本“协议”)。买方是唯一成员(“合并公司”),而马里兰州公司(“公司”)则是Coastway Bancorp,Inc.。”

“在此情况下,买方,合并公司和公司打算根据本协议和马里兰州总公司法(“ MGCL”)将合并公司与公司合并(“合并”)以及经修订的《马里兰有限责任公司法》(以下简称“ MLLCA”),使公司成为合并中尚存的实体。合并之后,公司将立即与买方合并并合并为买方(“上游合并” ”),并且买方是上游合并中的尚存实体。合并旨在与上游合并相互依存,并且是上游合并的先决条件,并且上游合并应通过本协议证明的具有约束力的承诺,在生效时间(定义见下文)之后立即生效,无需任何一方的进一步批准,授权或指示;或

交易2 /文档1:

“鉴于此,还建议,在要约完成后,双方希望在切实可行的范围内尽快通过购买方与公司的合并合并由母公司对公司进行收购。尚存的实体(“合并”);”

现在,对于资产购买交易:

交易3 /文档1:

“根据本协议的条款和条件,卖方愿意向买方出售,并且买方愿意向卖方购买其与本文所述业务相关的所有资产。”

交易4 /文档1:

“鉴于此,卖方希望出售并转让给买方,并且买方希望从卖方购买并承担卖方对所购资产(此处定义)的权利和义务,但要遵守此处规定的条款和条件。”

我希望这些示例有助于解决问题,如果您需要更多详细信息,请在评论和回复中告知我。

4 个答案:

答案 0 :(得分:2)

因此,首先,您可能希望不同的模型填写不同的字段。但我建议您研究word2vec或其他嵌入模型。

一个大问题是您要填写的字段类型-是仅在文字上逐字逐句地表达信息(例如日期),还是根据单词确定主题? 。

另一句话是,如果有1000多个字段,那么您将不会花费很长时间(yrs标度)来完成该项目,除非您看到的是相对较差的准确性。精简模型/测试各种超参数需要花费一段时间(如果真正使用复杂的方法或资源匮乏(例如神经网络没有GPU),则通常需要数小时或数天),而单​​个模型则需要一个模型。现实地每个字段(除非其详细信息)。

答案 1 :(得分:2)

自然语言处理中的此类任务称为信息提取。特别是,您正在执行的任务有点像“方案模板”或“插槽填充”。这与通常的插槽填充有点不同,因为您需要搜索特定的文档。因为您不知道文档文本中相关参考文献中提到的“答案”数据库中的每个值在何处提到,所以称为“远程监管”的技术可能适用。

答案 2 :(得分:1)

在我们交谈之后,似乎您要执行的一般过程如下: 将您的语料库转换为可用格式:

~Preprocess your corpus to remove stop words. Maybe use lemmatization. 
Consider using the [hashing trick][1] if worried about corpus size
Convert docs to vectors (TFIDF or BOW should be good for most of your cases)

创建和训练模型:

Basic models seem better for you if you're new - in simple classification use
Naive Bayes or decision forest or support vector machines (SVMs). 

基本代码:

x_train, x_test = splitting(x, 0.8) #Ratio of train to test = 0.8, better to do crossvalidation
y_train, y_test = splitting(y, 0.8)
clf = SVC() #Or whatever algo
clf.fit(x_train, y_train)
acc = clf.score(x_test, y_test)

答案 3 :(得分:0)

我也在Python的Scikit-learn邮件列表中问了这个问题,我从Boris Hollas得到了令人惊讶的答复,其中提到了一篇文章,解决了HMM算法的这个确切问题。这篇文章被Dayne Freitag和Andrew McCallum称为“通过随机优化学习的具有HMM结构的信息提取”。我仍然缺乏充分理解该文章的必要背景,但是它无疑是更好地理解问题及其可能解决方案的一个很好的起点。非常感谢,鲍里斯!!

就像joeln在他的答案中指出的那样,此类任务被称为信息提取,他还提到该任务有点像“场景模板”或“插槽填充”,而Wikipedia上有关信息提取的文章将其称为“信息提取”。如果我正确理解,则为“模板填充”。有了所有这些变体,在我知道该特定任务的常用术语之后,无疑将使我更容易继续研究。

非常感谢所有帮助我进行有关此主题的研究的人,特别是Evan Mata,他鼓励我提供一些更具体的示例来帮助解释问题本身,并对这种过程的持续时间提供一些初步估计。可能需要完成。这非常有用,因为我的客户还将有机会决定是否值得继续花时间和金钱来完成这项任务。