Поделиться через


Учебник. Использование Функций Azure и Python для обработки сохраненных документов

Аналитика документов может использоваться в составе автоматизированного конвейера обработки данных, созданного с помощью Функции Azure. В этом учебнике показано, как использовать Функции Azure для обработки документов, отправленных в контейнер хранилища BLOB-объектов Azure. Этот рабочий процесс извлекает данные таблицы из сохраненных документов с помощью модели макета аналитики документов и сохраняет данные таблицы в файле .csv в Azure. Затем данные можно отобразить с помощью Microsoft Power BI (не рассматривается здесь).

Снимок экрана: схема рабочего процесса службы Azure

В этом руководстве описано следующее:

  • Создайте учетную запись Службы хранилища Azure.
  • Создайте проект Функций Azure.
  • Извлечение данных макета из отправленных форм.
  • Отправка извлеченных данных макета в службу хранилища Azure.

Необходимые компоненты

  • Подписка Azure - Создайте подписку бесплатно

  • Ресурс аналитики документов. После получения подписки Azure создайте ресурс аналитики документов в портал Azure, чтобы получить ключ и конечную точку. Используйте бесплатную ценовую категорию (F0), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды.

    • После развертывания ресурса выберите Перейти к ресурсу. Вам потребуется ключ и конечная точка из ресурса, создаваемого для подключения приложения к API аналитики документов. Ключ и конечная точка позднее будут вставлены в приведенное ниже поле кода.

      Снимок экрана: расположение ключей и конечной точки на портале Azure.

  • Python 3.6.x, 3.7.x, 3.8.x или 3.9.x (Python 3.10.x не поддерживается для этого проекта).

  • Последняя версия Visual Studio Code (VS Code) со следующими расширениями:

  • Установленный Обозреватель службы хранилища Azure.

  • Локальный PDF-документ для анализа. Для этого проекта можно использовать пример документа PDF.

Создание учетной записи хранения Azure

  1. Создайте учетную запись хранения общего назначения Azure версии 2 на портале Azure. Если вы не знаете, как создать учетную запись хранения Azure с контейнером хранилища, следуйте этим кратким руководствам:

    • Создание учетной записи хранения. При создании учетной записи хранения выберите уровень производительности Стандартныйв поле Сведения об экземпляре>Производительность.
    • Создание контейнера. При создании контейнера в окне Создание контейнера установите для поля Уровень общего доступа значение Контейнер (анонимный доступ на чтение для контейнеров и файлов).
  2. На панели слева выберите вкладку Общий доступ к ресурсам (CORS) и удалите имеющуюся политику CORS при наличии.

  3. После развертывания учетной записи хранения создайте два пустых контейнера хранилища BLOB-объектов с именем input и output.

Создание проекта Функций Azure

  1. Создайте папку с именем functions-app для хранения проекта и нажмите кнопку Выбрать.

  2. В Visual Studio Code откройте палитру команд. Найдите и выберите Python:Select Interpreter → выберите установленный интерпретатор Python версии 3.6.x, 3.7.x, 3.8.x или 3.9.x. Этот выбор добавит выбранный путь интерпретатора Python в проект.

  3. Выберите логотип Azure на панели навигации слева.

    • В представлении "Ресурсы" вы увидите существующие ресурсы Azure.

    • Выберите подписку Azure, которую вы используете для этого проекта, и ниже вы увидите приложение-функцию Azure.

      Снимок экрана: список ресурсов Azure в едином представлении.

  4. Выберите раздел "Рабочая область (локальная)", расположенный под перечисленными ресурсами. Выберите значок "плюс" и нажмите кнопку Создать функцию.

    Снимок экрана: начало создания функции Azure.

  5. При появлении запроса выберите Создать проект и перейдите в каталог приложения-функции. Выберите Выбрать.

  6. Вам будет предложено настроить несколько параметров:

    • Выберите язык → выберите Python.

    • Выберите интерпретатор Python, чтобы создать виртуальную среду → выберите интерпретатор, заданный по умолчанию.

    • Выберите шаблон → выберите триггер Хранилища BLOB-объектов Azure и присвойте триггеру имя или примите имя по умолчанию. нажимайте клавишу ВВОД, чтобы подтвердить.

    • Выберите параметр → в раскрывающемся меню выберите ➕Создать новый параметр локального приложения.

    • Выберите подписку → выберите подписку Azure с созданной учетной записью хранения → выберите свою учетную запись хранения → выберите имя контейнера ввода хранилища (в данном случае input/{name}). нажимайте клавишу ВВОД, чтобы подтвердить.

    • Выберите способ открытия проекта → выберите "Открыть проект" в текущем окне в раскрывающемся меню.

  7. После выполнения этих действий в VSCode будет добавлен новый проект Функций Azure с помощью скрипта Python __init__.py. Этот скрипт активируется при отправке файла в контейнер хранилища input:

import logging

import azure.functions as func


def main(myblob: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")

Проверка функции

  1. Нажмите клавишу F5, чтобы запустить базовую функцию. VS Code предложит выбрать учетную запись хранения для взаимодействия.

  2. Выберите созданную учетную запись хранения и продолжайте работу.

  3. Откройте Обозреватель службы хранилища Azure и отправьте образец PDF-документа в контейнер input. Затем проверьте терминал VSCode. Скрипт должен зарегистрировать, что он был активирован при отправке PDF-файла.

    Снимок экрана: терминал VS Code после отправки нового документа.

  4. Прежде чем продолжить, завершите выполнение скрипта.

Добавление кода обработки документов

Затем вы добавите собственный код в скрипт Python, чтобы вызвать службу аналитики документов и проанализировать отправленные документы с помощью модели макета аналитики документов.

  1. В VS Code перейдите к файлу функции requirements.txt. В этом файле указаны зависимости для скрипта. Добавьте следующие пакеты Python в файл:

    cryptography
    azure-functions
    azure-storage-blob
    azure-identity
    requests
    pandas
    numpy
    
  2. Затем откройте скрипт __init__.py. Добавьте следующие операторы import :

    import logging
    from azure.storage.blob import BlobServiceClient
    import azure.functions as func
    import json
    import time
    from requests import get, post
    import os
    import requests
    from collections import OrderedDict
    import numpy as np
    import pandas as pd
    
  3. Созданную функцию main можно оставить без изменений. Вы добавите пользовательский код в эту функцию.

    # This part is automatically generated
    def main(myblob: func.InputStream):
        logging.info(f"Python blob trigger function processed blob \n"
        f"Name: {myblob.name}\n"
        f"Blob Size: {myblob.length} bytes")
    
  4. Следующий блок кода вызывает API анализа макета анализа документов в отправленном документе. Заполните значения конечной точки и ключа.

    # This is the call to the Document Intelligence endpoint
        endpoint = r"Your Document Intelligence Endpoint"
        apim_key = "Your Document Intelligence Key"
        post_url = endpoint + "/formrecognizer/v2.1/layout/analyze"
        source = myblob.read()
    
        headers = {
        # Request headers
        'Content-Type': 'application/pdf',
        'Ocp-Apim-Subscription-Key': apim_key,
            }
    
        text1=os.path.basename(myblob.name)
    

    Внимание

    Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье "Безопасность служб искусственного интеллекта Azure".

  5. Далее добавьте код для запроса к службе и получения возвращаемых данных.

    resp = requests.post(url=post_url, data=source, headers=headers)
    
    if resp.status_code != 202:
        print("POST analyze failed:\n%s" % resp.text)
        quit()
    print("POST analyze succeeded:\n%s" % resp.headers)
    get_url = resp.headers["operation-location"]
    
    wait_sec = 25
    
    time.sleep(wait_sec)
    # The layout API is async therefore the wait statement
    
    resp = requests.get(url=get_url, headers={"Ocp-Apim-Subscription-Key": apim_key})
    
    resp_json = json.loads(resp.text)
    
    status = resp_json["status"]
    
    if status == "succeeded":
        print("POST Layout Analysis succeeded:\n%s")
        results = resp_json
    else:
        print("GET Layout results failed:\n%s")
        quit()
    
    results = resp_json
    
    
  6. Добавьте следующий код для подключения к контейнеру output службы хранилища Azure. Введите собственные значения для имени и ключа учетной записи хранения. Ключ можно получить на вкладке Ключи доступа ресурса хранилища на портале Azure.

    # This is the connection to the blob storage, with the Azure Python SDK
        blob_service_client = BlobServiceClient.from_connection_string("DefaultEndpointsProtocol=https;AccountName="Storage Account Name";AccountKey="storage account key";EndpointSuffix=core.windows.net")
        container_client=blob_service_client.get_container_client("output")
    

    Следующий код анализирует возвращенный ответ аналитики документов, создает файл .csv и отправляет его в выходной контейнер.

    Внимание

    Скорее всего, вам потребуется изменить этот код, чтобы он соответствовал структуре собственных документов.

        # The code below extracts the json format into tabular data.
        # Please note that you need to adjust the code below to your form structure.
        # It probably won't work out-of-the-box for your specific form.
        pages = results["analyzeResult"]["pageResults"]
    
        def make_page(p):
            res=[]
            res_table=[]
            y=0
            page = pages[p]
            for tab in page["tables"]:
                for cell in tab["cells"]:
                    res.append(cell)
                    res_table.append(y)
                y=y+1
    
            res_table=pd.DataFrame(res_table)
            res=pd.DataFrame(res)
            res["table_num"]=res_table[0]
            h=res.drop(columns=["boundingBox","elements"])
            h.loc[:,"rownum"]=range(0,len(h))
            num_table=max(h["table_num"])
            return h, num_table, p
    
        h, num_table, p= make_page(0)
    
        for k in range(num_table+1):
            new_table=h[h.table_num==k]
            new_table.loc[:,"rownum"]=range(0,len(new_table))
            row_table=pages[p]["tables"][k]["rows"]
            col_table=pages[p]["tables"][k]["columns"]
            b=np.zeros((row_table,col_table))
            b=pd.DataFrame(b)
            s=0
            for i,j in zip(new_table["rowIndex"],new_table["columnIndex"]):
                b.loc[i,j]=new_table.loc[new_table.loc[s,"rownum"],"text"]
                s=s+1
    
    
  7. Наконец, последний блок кода отправляет извлеченную таблицу и текстовые данные в элемент хранилища BLOB-объектов.

        # Here is the upload to the blob storage
        tab1_csv=b.to_csv(header=False,index=False,mode='w')
        name1=(os.path.splitext(text1)[0]) +'.csv'
        container_client.upload_blob(name=name1,data=tab1_csv)
    

Выполнение функции

  1. Нажмите клавишу F5, чтобы запустить функцию повторно.

  2. Используйте Обозреватель службы хранилища Azure для отправки образца формы PDF в контейнер хранилища input. Это действие должно активировать скрипт, и в контейнере output должен отобразиться полученный CSV-файл (в виде таблицы).

Этот контейнер можно подключить к Power BI для создания полнофункциональных визуализаций содержащихся в нем данных.

Следующие шаги

Из этого учебника вы узнали, как использовать Функцию Azure, написанную на языке Python, для автоматической обработки отправленных PDF-документов и вывода их содержимого в более понятном формате. Далее вы узнаете, как использовать Power BI для отображения данных.