在Python中将AI管道连接到Word文档
在这里,我将向您展示如何在Web浏览器中可视化Word文档中的合约信息。
对于上下文,假设您有一个处理Word或PDF文档的AI管道。也许他们是法律文件;也许合约。
如何将结果呈现给人类用户?
当然,这是面向客户的关键UI设计选择: – 您的客户如何与您的产品互动?使用它是一种乐趣吗?文档看起来像在Word中吗?
但是文档可视化在任何初始AI培训阶段和在线学习中都同样重要。
在初始培训阶段,您需要准备培训数据集。你有多容易做到这一点?然后,当你评估结果时,同样的问题:QA能否轻松看出AI的正确与错误?
在Native Documents中,我们构建了一个API,使您可以轻松地在Web应用程序中针对Word文档显示结果。在本文中,我们将展示与LexNLP的交互,LexNLP是我们所知道的唯一一个用于处理法律文本的开源NLP库。
一般模式如下:
- 将文档作为文本或富文本
- 推动它通过您的NLP管道
- 使用我们的范围API来使用NLP结果注释文档。结果将显示为Word注释
- (可选)将任何自定义用户操作附加到评测中(例如,接受,解除,标记/争议)
- 可选地,导出为Word注释
我们能用它做什么?
法律中有很多AI应用程序。这些包括人工智能辅助合约起草,审查和谈判。在签订合约之前,您通常需要能够对其进行编辑,这意味着您需要Word格式文档,而不是PDF。
在这里,我们将通过“实体提取”示例。
实体是文档中感兴趣的项目。例如,聚会名称或日期:如果要将合约提取到合约管理系统或清理敏感信息,则需要查找的各种事项。
输入LexNLP
在这里,我们将使用LexNLP的定义提取功能:如果您想要实现合约制定助手功能和知识管理/先行搜索应用程序,定义非常有用。
制备
我假设你有一个功能的Python安装。
要继续,您需要一个原始文档开发和秘密。在https://developers.nativedocuments.com/上找到你的
然后访问https://canary.nativedocuments.com并输入您的设备和密码。 (有几种方法可以处理你的开发和秘密,但是为了本演练的目的,这是最简单的。在生产中,你将它编译成你的Javascript。)
接下来,获取/安装我们的python工具:
pip install – 升级http://downloads.nativedocuments.com/python/ndapi.tar.gz
在Windows上创建C: Users name .ndapi config.default-config并在Linux / Mac上创建〜/ .ndapi / config.default-config
config.default-config文件应该具有以下形式:
{“dev_id”:“你的设备ID在这里”,“dev_secret”:“你的设备秘密在这里”,“service_url”:“https://canary.nativedocuments.com”,“api_ver”:“DEV”}
这是Native Documents配置完成的。
接下来,安装LexNLP,例如:
git clone https://github.com/LexPredict/lexpredict-lexnlp.gitcd lexpredict-lexnlppython setup.py install
现在你可以检查一切是否有效:
wget http://downloads.nativedocuments.com/python/extractDefinitions.pypythonexec(open("extractDefinitions.py").read())extractDefs("default-config“,”https://www.ycombinator.com/docs /YC_Form_SaaS_Agreement.doc“)
如果您在Chrome中加载生成的网址,那么您应该使用该文档及其中的定义。如果您没有看到该文档或定义,请在下面或https://helpdesk.nativedocuments.com/上发表评论
接下来,我们将介绍刚刚发生的事情。
为此,首先需要一个示例文档(Word .doc或.docx格式)。我们假设您使用了YC_Form_SaaS_Agreement.doc
概观
总结一下,这就是我们需要做的事情:
- 将文档加载到本机文档并导出为文本
- 获取感兴趣的项目(使用NLP)
- 创建注释指令
然后,您可以将结果可视化,和/或将结果作为docx获取。
第1步:加载文档
$pythonPython 3.6.8(默认,2019年6月1日,16:00:10)>>> import ndapi >>> ndapi.init(user =“default-config”)True >>> mydocx = open(“./ YC_Form_SaaS_Agreement .DOC”,” RB”)>>> sessionInfo = ndapi.upload_document_to_service(mydocx)>>>打印(sessionInfo){ 'NID': 'DEV7BDVM9BGGAIMAUI487AB49QUQS000000000000000000000000002I0THD1D829MQUI4EVGNMFDM860000', '作者': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiTmF0aXZlIERvY3VtZW50cyIsIm5pY2tuYW1lIjoibmQifQ.tN0R0W3YjpwjnFBUmAj8dxfEMRtcNsXA677QcDtHb2s', 'RID' :'I2522'}
请注意nid。这就是我们需要与文档进行交互的内容。
>>> nid = sessionInfo('nid')
旁白:此时您可以在我们的编辑器中查看您的文档。
这是计算打开文档的URL的一个小功能。
def printEditUrl(nid,author):print(“https://canary.nativedocuments.com/edit/”+ nid +“?author =”+ author)
要获取URL:
printEditUrl(sessionInfo(“NID”),sessionInfo(“作者”))
如果要查看文档,请继续打开该URL。
没工作?你去过https://canary.nativedocuments.com并输入你的设备和秘密吗?
第2步:导出为纯文本
与大多数NLP / AI一样,LexNLP使用纯文本。所以,让我们做到这一点。
>>> ndRawText = ndapi.download_document_from_service(nid,mime_type =“application / vnd.nativedocuments.raw.text + text”)>>> print(ndRawText.data)b“urn:nd:stream:5591RH3HVNOMMJM0LOH9DIDRTENGG00000 … Jf0seo4p6vv-sf nSAAS服务订单表格 n客户: t t n联系人: n地址: n电话: n nE-Mail: n n服务:(此处列出并简要说明服务)
您可以看到结果包含流标题,然后是文档的文本,由换行符分隔。
我们暂时将标题放在一边。
splits = ndRawText.data.decode()。split(' n',1)
第3步:与NLP交谈
在这里,我们与LexNLP讨论定义:
import lexnlp.extract.en.definitionsprint(list(lexnlp.extract.en.definitions.get_definitions_explicit(splitits(1))))(('Service(s)','Services :(姓名并在此简要描述服务)___________( “服务”)。',(140,158)),:('支持时间','附件C n支持条款 n(可选) n公司将通过电话和电子邮件向客户提供技术支持在太平洋时间上午9:00至下午5:00的工作日,排除联邦假期(“支持时间”)。',(22449,22466)))
对于LexNLP找到的每个定义,您可以看到它返回定义的术语,含义以及找到定义术语的字符范围。
我们只需重用该字符范围即可告知Native Documents附加注释的位置。
第4步:将NLP响应转换为注释指令
对于要显示注释的Native Documents,我们需要发送以下形式的JSON:
urn:nd:stream:5591RH3HVNOMMJM0LOH9DIDRTENGG00000 … Jf0seo4p6vv-sf“(140..157):0.MEANING”:{“含义”:“服务:(姓名并在此简要描述服务)..(服务)” }:“(22449..22465):17.MEANING”:{“含义”:“EXHIBIT C支持条款(可选)公司将提供..假期(支持时间)”}
为了制作它,让我们使用几个辅助函数:
class ndComment:def __init __(self,start,end,slot,mng,content):self.start = start self.end = end self.slot = slot self.mng = mng self.content = content.replace(' n ','')self.content = self.content.replace(' t','')self.content = self.content.replace('“','')def toString(self):return” “(”+ str(self.start)+“..”+ str(self.end)+“):”+ str(self.slot)+“。”+ self.mng +“”:{“含义“:”“+ str(self.content)+”“} n”def constructPayload():definitions = lexnlp.extract.en.definitions.get_definitions_explicit(splits(1))results =(ndComment(d (2)(0),d(2)(1)-1,ind,“MEANING”,d(1))。toString()表示ind,d表示枚举(定义))payload = splits(0)+“ n“+''。join((''。join(result)for results in results))返回有效负载
现在我们可以使用它将注释附加到文档:
annotations = constructPayload()ndapi.upload_document_to_service(annotations,“ranges”,nid = nid,mime_type =“application / vnd.nativedocuments.raw.text + text”)
可视化带注释的文档
现在让我们看一下编辑器中的文档。
首先,如果您还没有访问https://canary.nativedocuments.com,请输入您的开发密钥和密码。
完成后,您可以打开URL。要获取要加载的URL:
printEditUrl(sessionInfo(“NID”),sessionInfo(“作者”))
如果你在Chrome中查看它,你可能会注意到注释中的一些调试;在后续文章中,我将向您展示如何自定义注释注释的外观。
把它们放在一起
您可以在http://downloads.nativedocuments.com/python/extractDefinitions.py找到该代码
它包含一个函数extractDefs,它接受2个参数,你的.ndapi / config(例如“config-default”),以及Word文档(doc或docx)的路径或URL。例如:
pythonexec(open(“extractDefinitions.py”)。read())extractDefs(“default-config”,“https://www.ycombinator.com/docs/YC_Form_SaaS_Agreement.doc”)
它会返回您可以在Web浏览器中打开的URL。为了便于与同事共享工作URL(但不能用于生产),URL包含devid作为参数。
您可以修改它以提取LexNLP支持的其他信息,或者实际上完全替换其他一些NLP引擎。
欢迎反馈和评测。
将一个AI管道连接到Python中的Word文档最初发布在HackerNoon.com on Medium上,人们通过突出显示和回应这个故事来继续对话。