AWS:Textract与Cloudsearch

时间:2019-11-13 10:50:48

标签: amazon-web-services amazon-cloudsearch amazon-textract

我正在创建一个使用某些AWS服务的项目(出于培训目的)。

现在大家都知道,AWS有很多不同的服务,它需要一些有关如何使用它们以及可以使用它们的知识。这就是为什么我在这里发布问题:

我的想法

我想创建一个应用程序,用户可以在其中上传他们的PDF /图像,然后用AWS Textract处理它们,然后能够以一种聪明的方式搜索其文件

现在的诀窍是:

  • 所有文档的结构都不相同
  • 应用程序的每个用户都有自己的文档(应为私人文件)

因此,在阅读了许多文档之后,这里就是我使用AWS TextractAWS CloudSearch提出的解决方案

enter image description here

客户将其文档上传到我的服务。然后,该文档将由AWS Textract保存和处理,并将输出存储在数据库中。

搜索

enter image description here

现在,这是我不确定的地方。我希望用户能够搜索他的私人文档。我一直在研究cloudsearch,但是当文档如此不同和独特时,我不是100%肯定它的功能。

所以我想我的问题是搜索这些唯一文档的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

在我什至尝试回答您的问题之前,需要注意一些事项:

  

所以我想我的问题是搜索这些独特内容的最佳方法是什么   文件?

首先,Textract以以下格式提供JSON输出:

"BlockType": "LINE",
      "Confidence": 99.71240997314453,
      "Text": "Previous Employer: None",
      "Geometry": {…}

这意味着CloudSearch看到的字段是“文本”,而没有看到“以前的雇主”作为字段,而只是文本字符串的一部分。 (我会回到这里)。

您还应注意,与其他OCR一样,Textract也不是完美的,因此您应该预料到一定数量的错误,例如上面的文本字段可能读为

"Text": "Previous Employee: None"

它也可能以您意想不到的方式拆分或连接事物。因此,您可能最终得到两个单独的LINE块,分别是“ Previous Employer:”和“ None”。

关于隐私,单个CloudSearch域没有人员身份数据或人员Bs数据的概念。只有数据。

您可以在Lambda或API网关中执行某些操作,这些操作可能会限制某些字段的查询或结果,但不会将人员隐藏为人员B的数据。此外,由于我们使用的是Textract,因此所有操作都会在仍然是“文本”字段。

您唯一的选择是为每个用户拥有一个单独的CloudSearch域。只要您拥有100个或更少的客户,并且您没有其他CloudSearch Domains来做其他事情,这是真正的可能性,因为AWS将每个帐户的Domains数量限制为100。有关更多信息,请参阅Understanding Amazon CloudSearch Limits。< / p>

尽管我们处于CloudSearch限制的主题,但是每个文档只能有200个字段。即使是很小的文档,也可能导致Textract JSON响应包含200多个字段。由于“几何”下的所有字段,单个LINE块具有18个字段。因此,您可能需要遍历Textract生成的任何数据,以将对您无用的字段删除,然后再将其上传到CloudSearch。

所以要进行实际搜索。您实际上只有一个要搜索的字段,即“文本”。这意味着您将无法索引任何上传的文档,这将影响查询响应时间。

您可以执行以下类型的请求:

  1. 按字段搜索(匹配):

    q=Previous Employer: None&q.options={fields: ['Text']}

  2. 按字段搜索(包含):

    (phrase field=Text 'Previous Employer')

  3. 通过自由文本(单词)搜索:

    q=Employer

  4. 按自由文本搜索(短语):

    q="Previous Employer"

  5. 草率搜索(单词之间的距离):

    q="Previous None"~2

还有更多的文本搜索示例here,但我想说明的是,您将只能进行文本搜索。

但是同样,Textract的数据结构还是个问题,因为所有这些查询都将返回相同的结果:

"BlockType": "LINE",
      "Confidence": 99.71240997314453,
      "Text": "Previous Employer: None",
      "Geometry": {…}

它不会返回文档中的下一行,因为该行具有相同的字段名称,并且从技术上讲将是单独的文档。

如果您获取Textract结果并创建一个全新的文档,则很多问题都可以解决(您需要考虑如何正确管理此工作流程)。

可能的文档格式:

{
  "id":   "somethingUnique",
  "fields": {
    "title": "FileName",
    "user": ["UserId"],
    "wholeText": "Giant concatenated string of all text from Textract"
    "page1": ["jsonString1","jsonstring2","etc"],
    "page2": ["jsonString1","jsonstring2","etc"],
    "originalDocImage": [bytes]
  }
}

每个json字符串是Textract结果(或仅仅是Text和Geometry)的单个块。

这样,您可以按userId限制搜索,返回用户整个文档并使用Geometry数据突出显示。

它还允许在User上建立索引,并允许他们按上传文件的名称(可以是另一个索引)进行搜索。

有点痛苦,因为使用多个可能不相邻的单词进行搜索,仍然需要您找到包含所有文本的巨大字符串,并且您需要遍历jsonStrings以获得Geometry数据进行突出显示。

这为CloudSearch之外的搜索留下了很多处理过程,所有搜索都必须由诸如API Gateway / Lambda之类的代理来代理,以确保人们无法对非自己的数据进行搜索。