AWS:使用 Cloudsearch 的 Textract

AWS: Textract with Cloudsearch

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

众所周知,AWS 有许多不同的服务,需要了解如何使用它们以及它们的用途。这就是我在这里发布问题的原因:

我的想法

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

现在的技​​巧是:

所以在阅读了这里的大量文档之后,我使用 AWS TextractAWS CloudSearch

提出了解决方案

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

正在搜索

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

所以我想我的问题是搜索这些独特文档的最佳方式是什么?

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

So I guess my question is what is the best way to search these unique documents?

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

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

这意味着 CloudSearch 将看到的字段是 "Text",它不会将 "Previous Employer" 视为字段,只是文本字符串的一部分。 (我会回到这个)。

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

"Text": "Previous Employee: None"

它也有可能以您意想不到的方式拆分或连接事物。所以你最终可能会得到两个单独的 LINE 块 "Previous Employer:" 和 "None".

关于隐私,单个CloudSearch域没有person As data或person Bs data的概念。只有数据。

您可以在 Lambda 或 API 网关中执行某些操作,这些操作可能会限制某些字段的查询或结果,但不会向 B 隐藏 person As 数据。此外,因为我们正在使用Textract,无论如何,所有内容都将在 "Text" 字段下。

您唯一的选择是为每个用户设置一个单独的 CloudSearch 域。只要您拥有 100 个或更少的客户并且您没有用于其他用途的其他 CloudSearch 域,这就是真正的可能性,因为 AWS 将每个帐户的域数量限制为 100 个。有关详细信息,请参阅 Understanding Amazon CloudSearch Limits

虽然我们讨论的是 CloudSearch 限制,但每个文档只能有 200 个字段。即使是很小的文档也可能导致包含 200 多个字段的 Textract JSON 响应。由于 "Geometry" 下的所有字段,单个 LINE 块有 18 个字段。因此,您可能需要迭代 Textract 生成的任何数据,以在将数据上传到 CloudSearch 之前删除对您没有任何用处的字段。

所以要实际搜索。您实际上只有一个字段可以搜索,即 "Text"。这意味着您将无法为任何已上传的文档编制索引,这将影响查询响应时间。

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

  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 的数据结构又是一个问题,因为所有这些查询都会 return 同样的事情:

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

它不会 return 文档中的下一行,因为它具有相同的字段名称并且在技术上将是一个单独的文档。

如果您采用 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 结果(或只是文本和几何图形)的单个块。

这样您就可以通过用户 ID 限制搜索,return 用户整个文档并使用几何数据突出显示它。

它还允许对用户进行索引,并允许他们根据上传的文件名(可以是另一个索引)进行搜索。

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

这为 CloudSearch 之外的搜索留下了大量处理,所有搜索都必须由 API Gateway/Lambda 之类的东西代理,以确保人们无法搜索不是的数据他们自己的。