Rövid útmutató: az ügyféloldali kódtár vagy az ügyféloldali kódtár-REST API

Az Azure Form Recognizer használatának első lépések a választott programozási nyelvvel. Az Azure Form Recognizer egy Azure-beli alkalmazott AI-szolgáltatás, amellyel automatizált adatfeldolgozási szoftvereket építhet gépi tanulási technológiával. Azonosíthat és kinyerhet szövegeket, kulcs/érték párokat, kijelölési jeleket, táblaadatokat stb. az űrlapdokumentumok közül. A szolgáltatás strukturált adatokat ad vissza, amelyek tartalmazzák az eredeti fájlban található — kapcsolatokat. A Form Recognizer az REST API SDK-n keresztül használhatja. Javasoljuk, hogy használja az ingyenes szolgáltatást, amikor a technológiát tanulja. Ne feledje, hogy az ingyenes oldalak száma havonta legfeljebb 500 lehet.

A következő API-k használatával fog strukturált adatokat kinyerni űrlapokból és dokumentumokból:

Fontos

  • Ez a rövid útmutató az SDK 3.1.1-es verzióját használja, és a 2.1-es API-verziót célozza meg.

  • A cikkben olvasható kód az egyszerűség kedvéért szinkron metódusokat és nem biztonságos hitelesítőadat-tárolót használ.

Referenciadokumentáció | Kódtár forráskódja | Package (NuGet) | Minták

A C# rövid útmutató teljes munkamintája a következő GitHub.

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • A Visual Studio IDE vagy a .NET Coreaktuális verziója.
  • Egy Azure Storage blobot tartalmaz, amely betanításadatokat tartalmaz. A betanítás adatkészletének összeállítására vonatkozó tippekért és lehetőségekért tekintse meg a betanítás adatkészletének összeállítása egyéni modellhez való összeállítását. Ebben a rövid útmutatóban a mintaadatkészlet Betanítás mappájában található fájlokat használhatja (töltse le és bontsa ki a sample_data.zip).
  • Az Azure-előfizetés létrehozása után hozzon létre egy Form Recognizer-erőforrást, Form Recognizer erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után kattintson az Erőforráshoz való ugrás elemre.
    • Szüksége lesz a létrehozott erőforrás kulcsának és végpontjának létrehozására, hogy az alkalmazást a Form Recognizer API-hoz. A kulcsot és a végpontot a rövid útmutató későbbi, alábbi kódába fogja beilleszteni.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szolgáltatási szintre F0 éles környezetben.

Beállítása

Egy konzolablakban (például cmd, PowerShell vagy Bash) az paranccsal hozzon létre egy új konzolalkalmazást dotnet new formrecognizer-quickstart néven. Ez a parancs egy egyszerű "Hello World" C#-projektet hoz létre egyetlen forrásfájllal: program.cs.

dotnet new console -n formrecognizer-quickstart

Módosítsa a könyvtárat az újonnan létrehozott alkalmazásmappába. Az alkalmazást a következővel építheti fel:

dotnet build

A build kimenete nem tartalmazhat figyelmeztetéseket vagy hibákat.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

Az ügyféloldali kódtár telepítése

Telepítse a .NET-hez Form Recognizer ügyféloldali kódtárat az alkalmazás könyvtárába a következő paranccsal:

dotnet add package Azure.AI.FormRecognizer --version 3.1.1

A projektkönyvtárból nyissa meg a Program.cs fájlt a kívánt szerkesztőben vagy IDE-ban. Adja hozzá a következő using irányelveket:

using Azure;
using Azure.AI.FormRecognizer;  
using Azure.AI.FormRecognizer.Models;
using Azure.AI.FormRecognizer.Training;

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

Az alkalmazás Program osztályában hozzon létre változókat az erőforrás kulcsához és végpontjához.

Fontos

Nyissa meg az Azure Portalt. Ha az Form Recognizer szakaszban létrehozott erőforrás sikeresen üzembe lett stb., kattintson az Erőforrás ugrás gombra a Következő lépések területen. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor végzett, és soha ne tegye közzé nyilvánosan. Éles környezetben használjon biztonságos módszereket a hitelesítő adatok tárolására és elérésére. További információt Cognitive Services biztonsági tudnivalókat az alábbi cikkben talál.

private static readonly string endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
private static readonly string apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(apiKey);

Az alkalmazás Main metódusában adjon hozzá egy hívást az ebben a rövid útmutatóban használt aszinkron feladatokhoz. Ezeket később fogja megvalósítani:

static void Main(string[] args) {
  // new code:
  var recognizeContent = RecognizeContent(recognizerClient);
  Task.WaitAll(recognizeContent);

  var analyzeReceipt = AnalyzeReceipt(recognizerClient, receiptUrl);
  Task.WaitAll(analyzeReceipt);

  var analyzeBusinessCard = AnalyzeBusinessCard(recognizerClient, bcUrl);
  Task.WaitAll(analyzeBusinessCard);

  var analyzeInvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeInvoice);

  var analyzeId = AnalyzeId(recognizerClient, idUrl);
  Task.WaitAll(analyzeId);

  var trainModel = TrainModel(trainingClient, trainingDataUrl);
  Task.WaitAll(trainModel);

  var trainModelWithLabels = TrainModelWithLabels(trainingClient, trainingDataUrl);
  Task.WaitAll(trainModel);

  var analyzeForm = AnalyzePdfForm(recognizerClient, modelId, formUrl);
  Task.WaitAll(analyzeForm);

  var manageModels = ManageModels(trainingClient, trainingDataUrl);
  Task.WaitAll(manageModels);

}

Objektummodell

A Form Recognizer két különböző ügyféltípust hozhat létre. Az első az űrlap felismert mezőinek és tartalmának lekérdezésére FormRecognizerClient használható. A második a segítségével hoz létre és kezel egyéni FormTrainingClient modelleket a felismerés javítása érdekében.

FormRecognizerClient

FormRecognizerClient A a következő műveleteket biztosítja:

  • Űrlapmezők és tartalmak felismerése az egyéni űrlapok elemzéséhez betanított egyéni modellekkel. Ezeket az értékeket objektumok gyűjteményében lehet RecognizedForm visszaadni. Lásd az Egyéni űrlapok elemzése példát.
  • Űrlaptartalmak, köztük táblák, vonalak és szavak felismerése modell betanítása nélkül. Az űrlap tartalma objektumgyűjteményben lesz FormPage visszaadva. Lásd az Elrendezés elemzése példát.
  • Gyakori mezők felismerése az EGYESÜLT Államok-nyugtákból, névjegykártyákból, számlákból és azonosító dokumentumokból egy előre betanított modellel a Form Recognizer szolgáltatásban.

FormTrainingClient

FormTrainingClient A a következő műveleteket biztosítja:

  • Egyéni modellek betanítása az egyéni űrlapokon található összes mező és érték elemzéséhez. A visszaadott érték a modell által elemzett űrlaptípusokat és az egyes űrlaptípusokhoz kinyert CustomFormModel mezőket jelzi.
  • Egyéni modellek betanítása adott mezők és értékek elemzéséhez az egyéni űrlapok címkézése segítségével. A visszaadott érték jelzi a modell által kinyert mezőket, valamint az egyes mezők becsült CustomFormModel pontosságát.
  • A fiókjában létrehozott modellek kezelése.
  • Egyéni modell másolása egyik erőforrásból Form Recognizer másikba.

Példák a Modell betanítása és az Egyéni modellek kezelése használatára.

Megjegyzés

A modellek grafikus felhasználói felülettel is betaníthatóak, például a Form Recognizer eszköz használatával.

Az ügyfél hitelesítése

A Main alatt hozzon létre egy nevű új metódust. AuthenticateClient Ezt más feladatokban is felhasználhatja a kérések hitelesítésére a Form Recognizer szolgáltatásban. Ez a metódus az objektumot használja, így szükség esetén új ügyfélobjektumok létrehozása nélkül frissítheti az AzureKeyCredential API-kulcsot.

Fontos

Szerezze be a kulcsot és a végpontot a Azure Portal. Ha az Form Recognizer szakaszban létrehozott erőforrás sikeresen üzembe lett stb., kattintson az Erőforrás ugrás gombra a Következő lépések területen. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor végzett, és soha ne tegye közzé nyilvánosan. Éles környezetben használjon biztonságos módszereket a hitelesítő adatok tárolására és elérésére. Például: Azure Key Vault.

private static FormRecognizerClient AuthenticateClient()
{
    var credential = new AzureKeyCredential(apiKey);
    var client = new FormRecognizerClient(new Uri(endpoint), credential);
    return client;
}

Ismételje meg a fenti lépéseket a betanító ügyfél hitelesítésére használt új metódussal is.

static private FormTrainingClient AuthenticateTrainingClient()
{
    var credential = new AzureKeyCredential(apiKey);
    var client = new FormTrainingClient(new Uri(endpoint), credential);
    return client;
}

Eszközök lekérte a teszteléshez

A betanítás és a tesztelési adatok URL-címére mutató hivatkozásokat is hozzá kell adni. Adja hozzá ezeket a Program osztály gyökerében.

    • Az egyéni modell betanítási adatainak SAS URL-címének lekéréséhez a tárerőforrást a Azure Portal válassza a Storage Explorer fület. Navigáljon a tárolóhoz, kattintson a jobb gombbal, és válassza a Közös hozzáférésű jogosultság jogosultsága begyűjtése lehetőséget. Fontos, hogy a tároló SAS-ét szerezze be, ne magát a tárfiókot. Győződjön meg arról, hogy az Olvasás, Írás, Törlés és Lista engedély be van jelölve, majd kattintson a Létrehozás gombra. Ezután másolja az URL szakaszban található értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

    SAS URL-lekérés

  • Ezután ismételje meg a fenti lépéseket, hogy lekérte egy adott dokumentum SAS URL-címét a Blob Storage-tárolóban. Mentse egy ideiglenes helyre is.

  • Végül mentse az alább szereplő mintakép(ek) URL-címét (amely szintén elérhető a GitHub).

string trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
string formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
string receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
string bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";

string idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg";

Elrendezés elemzése

A dokumentumokkal Form Recognizer, sorokat és szavakat elemezhet a dokumentumokban anélkül, hogy modellt kellene betanítanunk. A visszaadott érték a FormPage objektumok gyűjteménye: egy az elküldött dokumentum minden oldalához. Az elrendezéskinyerésről az Elrendezés fogalmi útmutatóban található további információ.

Egy adott URL-címen található fájl tartalmának elemzéséhez használja a StartRecognizeContentFromUri metódust.

private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
{
    var invoiceUri = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
    FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(invoiceUri))
        .WaitForCompletionAsync();

Tipp

Helyi fájlból is lekért tartalom. Lásd a FormRecognizerClient metódusokat, például a StartRecognizeContent metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A feladat további része a tartalominformációt a konzolon nyomtatja ki.

    foreach (FormPage page in formPages)
    {
        Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");

        for (int i = 0; i < page.Lines.Count; i++)
        {
            FormLine line = page.Lines[i];
            Console.WriteLine($"    Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
        }

        for (int i = 0; i < page.Tables.Count; i++)
        {
            FormTable table = page.Tables[i];
            Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
            foreach (FormTableCell cell in table.Cells)
            {
                Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
            }
        }
    }
}

Kimenet

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
    Line 7 has 1 word, and text: '99243'.
    Line 8 has 2 words, and text: 'Invoice Number'.
    Line 9 has 2 words, and text: 'Invoice Date'.
    Line 10 has 3 words, and text: 'Invoice Due Date'.
    Line 11 has 1 word, and text: 'Charges'.
    Line 12 has 2 words, and text: 'VAT ID'.
    Line 13 has 1 word, and text: '34278587'.
    Line 14 has 1 word, and text: '6/18/2017'.
    Line 15 has 1 word, and text: '6/24/2017'.
    Line 16 has 1 word, and text: '$56,651.49'.
    Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    Cell (0, 5) contains text: 'VAT ID'.
    Cell (1, 0) contains text: '34278587'.
    Cell (1, 1) contains text: '6/18/2017'.
    Cell (1, 2) contains text: '6/24/2017'.
    Cell (1, 3) contains text: '$56,651.49'.
    Cell (1, 5) contains text: 'PT'.

Nyugták elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki közös mezőket az USA-nak megfelelő nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért lásd a nyugták fogalmi útmutatóját.

Az URL-címről származó nyugták elemzéséhez használja a StartRecognizeReceiptsFromUri metódust.

private static async Task AnalyzeReceipt(
    FormRecognizerClient recognizerClient, string receiptUri)
{
    RecognizedFormCollection receipts = await recognizerClient.StartRecognizeReceiptsFromUri(new Uri(receiptUrl)).WaitForCompletionAsync();

Tipp

A helyi nyugták képeit is elemezheti. Lásd a FormRecognizerClient metódusokat, például a StartRecognizeReceipts metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A visszaadott érték objektumok gyűjteménye: egy az elküldött dokumentum minden RecognizedForm oldalához. A következő kód feldolgozza a nyugtát az adott URI-ban, és kinyomtatja a fő mezőket és értékeket a konzolon.

    foreach (RecognizedForm receipt in receipts)
    {
        FormField merchantNameField;
        if (receipt.Fields.TryGetValue("MerchantName", out merchantNameField))
        {
            if (merchantNameField.Value.ValueType == FieldValueType.String)
            {
                string merchantName = merchantNameField.Value.AsString();

                Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
            }
        }

        FormField transactionDateField;
        if (receipt.Fields.TryGetValue("TransactionDate", out transactionDateField))
        {
            if (transactionDateField.Value.ValueType == FieldValueType.Date)
            {
                DateTime transactionDate = transactionDateField.Value.AsDate();

                Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
            }
        }

        FormField itemsField;
        if (receipt.Fields.TryGetValue("Items", out itemsField))
        {
            if (itemsField.Value.ValueType == FieldValueType.List)
            {
                foreach (FormField itemField in itemsField.Value.AsList())
                {
                    Console.WriteLine("Item:");

                    if (itemField.Value.ValueType == FieldValueType.Dictionary)
                    {
                        IReadOnlyDictionary<string, FormField> itemFields = itemField.Value.AsDictionary();

                        FormField itemNameField;
                        if (itemFields.TryGetValue("Name", out itemNameField))
                        {
                            if (itemNameField.Value.ValueType == FieldValueType.String)
                            {
                                string itemName = itemNameField.Value.AsString();

                                Console.WriteLine($"    Name: '{itemName}', with confidence {itemNameField.Confidence}");
                            }
                        }

                        FormField itemTotalPriceField;
                        if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField))
                        {
                            if (itemTotalPriceField.Value.ValueType == FieldValueType.Float)
                            {
                                float itemTotalPrice = itemTotalPriceField.Value.AsFloat();

                                Console.WriteLine($"    Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                            }
                        }
                    }
                }
            }
        }
        FormField totalField;
        if (receipt.Fields.TryGetValue("Total", out totalField))
        {
            if (totalField.Value.ValueType == FieldValueType.Float)
            {
                float total = totalField.Value.AsFloat();

                Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
            }
        }
    }
}

Kimenet

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
    Line 7 has 1 word, and text: '99243'.
    Line 8 has 2 words, and text: 'Invoice Number'.
    Line 9 has 2 words, and text: 'Invoice Date'.
    Line 10 has 3 words, and text: 'Invoice Due Date'.
    Line 11 has 1 word, and text: 'Charges'.
    Line 12 has 2 words, and text: 'VAT ID'.
    Line 13 has 1 word, and text: '34278587'.
    Line 14 has 1 word, and text: '6/18/2017'.
    Line 15 has 1 word, and text: '6/24/2017'.
    Line 16 has 1 word, and text: '$56,651.49'.
    Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    Cell (0, 5) contains text: 'VAT ID'.
    Cell (1, 0) contains text: '34278587'.
    Cell (1, 1) contains text: '6/18/2017'.
    Cell (1, 2) contains text: '6/24/2017'.
    Cell (1, 3) contains text: '$56,651.49'.
    Cell (1, 5) contains text: 'PT'.
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki gyakori mezőket angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért lásd a névjegykártyák fogalmi útmutatóját.

A névjegykártyák URL-címből való elemzéséhez használja a StartRecognizeBusinessCardsFromUriAsync metódust.

private static async Task AnalyzeBusinessCard(
FormRecognizerClient recognizerClient, string bcUrl) {
  RecognizedFormCollection businessCards = await recognizerClient.StartRecognizeBusinessCardsFromUriAsync(bcUrl).WaitForCompletionAsync();

Tipp

A helyi nyugták rendszerképét is elemezheti. Lásd a FormRecognizerClient metódusokat, például a StartRecognizeBusinessCards metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot a következő oldalon: .

Az alábbi kód feldolgozza a névjegykártyát az adott URI-ban, és kiírja a fő mezőket és értékeket a konzolra.

  foreach(RecognizedForm businessCard in businessCards) {
    FormField ContactNamesField;
    if (businessCard.Fields.TryGetValue("ContactNames", out ContactNamesField)) {
      if (ContactNamesField.Value.ValueType == FieldValueType.List) {
        foreach(FormField contactNameField in ContactNamesField.Value.AsList()) {
          Console.WriteLine($ "Contact Name: {contactNameField.ValueData.Text}");

          if (contactNameField.Value.ValueType == FieldValueType.Dictionary) {
            IReadOnlyDictionary < string,
            FormField > contactNameFields = contactNameField.Value.AsDictionary();

            FormField firstNameField;
            if (contactNameFields.TryGetValue("FirstName", out firstNameField)) {
              if (firstNameField.Value.ValueType == FieldValueType.String) {
                string firstName = firstNameField.Value.AsString();

                Console.WriteLine($ "    First Name: '{firstName}', with confidence {firstNameField.Confidence}");
              }
            }

            FormField lastNameField;
            if (contactNameFields.TryGetValue("LastName", out lastNameField)) {
              if (lastNameField.Value.ValueType == FieldValueType.String) {
                string lastName = lastNameField.Value.AsString();

                Console.WriteLine($ "    Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
              }
            }
          }
        }
      }
    }

    FormField jobTitlesFields;
    if (businessCard.Fields.TryGetValue("JobTitles", out jobTitlesFields)) {
      if (jobTitlesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField jobTitleField in jobTitlesFields.Value.AsList()) {
          if (jobTitleField.Value.ValueType == FieldValueType.String) {
            string jobTitle = jobTitleField.Value.AsString();

            Console.WriteLine($ "  Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
          }
        }
      }
    }

    FormField departmentFields;
    if (businessCard.Fields.TryGetValue("Departments", out departmentFields)) {
      if (departmentFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField departmentField in departmentFields.Value.AsList()) {
          if (departmentField.Value.ValueType == FieldValueType.String) {
            string department = departmentField.Value.AsString();

            Console.WriteLine($ "  Department: '{department}', with confidence {departmentField.Confidence}");
          }
        }
      }
    }

    FormField emailFields;
    if (businessCard.Fields.TryGetValue("Emails", out emailFields)) {
      if (emailFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField emailField in emailFields.Value.AsList()) {
          if (emailField.Value.ValueType == FieldValueType.String) {
            string email = emailField.Value.AsString();

            Console.WriteLine($ "  Email: '{email}', with confidence {emailField.Confidence}");
          }
        }
      }
    }

    FormField websiteFields;
    if (businessCard.Fields.TryGetValue("Websites", out websiteFields)) {
      if (websiteFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField websiteField in websiteFields.Value.AsList()) {
          if (websiteField.Value.ValueType == FieldValueType.String) {
            string website = websiteField.Value.AsString();

            Console.WriteLine($ "  Website: '{website}', with confidence {websiteField.Confidence}");
          }
        }
      }
    }

    FormField mobilePhonesFields;
    if (businessCard.Fields.TryGetValue("MobilePhones", out mobilePhonesFields)) {
      if (mobilePhonesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField mobilePhoneField in mobilePhonesFields.Value.AsList()) {
          if (mobilePhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
            string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
          }
        }
      }
    }

    FormField otherPhonesFields;
    if (businessCard.Fields.TryGetValue("OtherPhones", out otherPhonesFields)) {
      if (otherPhonesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField otherPhoneField in otherPhonesFields.Value.AsList()) {
          if (otherPhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
            string otherPhone = otherPhoneField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Other phone number: '{otherPhone}', with confidence {otherPhoneField.Confidence}");
          }
        }
      }
    }

    FormField faxesFields;
    if (businessCard.Fields.TryGetValue("Faxes", out faxesFields)) {
      if (faxesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField faxField in faxesFields.Value.AsList()) {
          if (faxField.Value.ValueType == FieldValueType.PhoneNumber) {
            string fax = faxField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Fax phone number: '{fax}', with confidence {faxField.Confidence}");
          }
        }
      }
    }

    FormField addressesFields;
    if (businessCard.Fields.TryGetValue("Addresses", out addressesFields)) {
      if (addressesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField addressField in addressesFields.Value.AsList()) {
          if (addressField.Value.ValueType == FieldValueType.String) {
            string address = addressField.Value.AsString();

            Console.WriteLine($ "  Address: '{address}', with confidence {addressField.Confidence}");
          }
        }
      }
    }

    FormField companyNamesFields;
    if (businessCard.Fields.TryGetValue("CompanyNames", out companyNamesFields)) {
      if (companyNamesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField companyNameField in companyNamesFields.Value.AsList()) {
          if (companyNameField.Value.ValueType == FieldValueType.String) {
            string companyName = companyNameField.Value.AsString();

            Console.WriteLine($ "  Company name: '{companyName}', with confidence {companyNameField.Confidence}");
          }
        }
      }
    }
  }
}

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért lásd a számla fogalmi útmutatóját.

A számlák URL-címről való elemzéséhez használja a StartRecognizeInvoicesFromUriAsync metódust.

private static async Task AnalyzeInvoice(
FormRecognizerClient recognizerClient, string invoiceUrl) {
  var options = new RecognizeInvoicesOptions() {
    Locale = "en-US"
  };
  RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(invoiceUrl, options).WaitForCompletionAsync();

Tipp

Helyi számlaképeket is elemezhet. Lásd a FormRecognizerClient metódusokat, például a StartRecognizeInvoices metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot a következő oldalon: .

Az alábbi kód feldolgozza a számlát a megadott URI-ban, és kinyomtatja a fő mezőket és értékeket a konzolon.

  RecognizedForm invoice = invoices.Single();

  FormField invoiceIdField;
  if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
    if (invoiceIdField.Value.ValueType == FieldValueType.String) {
      string invoiceId = invoiceIdField.Value.AsString();
      Console.WriteLine($ "    Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
    }
  }

  FormField invoiceDateField;
  if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
    if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
      DateTime invoiceDate = invoiceDateField.Value.AsDate();
      Console.WriteLine($ "    Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
    }
  }

  FormField dueDateField;
  if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
    if (dueDateField.Value.ValueType == FieldValueType.Date) {
      DateTime dueDate = dueDateField.Value.AsDate();
      Console.WriteLine($ "    Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
    }
  }

  FormField vendorNameField;
  if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
    if (vendorNameField.Value.ValueType == FieldValueType.String) {
      string vendorName = vendorNameField.Value.AsString();
      Console.WriteLine($ "    Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
    }
  }

  FormField vendorAddressField;
  if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
    if (vendorAddressField.Value.ValueType == FieldValueType.String) {
      string vendorAddress = vendorAddressField.Value.AsString();
      Console.WriteLine($ "    Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
    }
  }

  FormField customerNameField;
  if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
    if (customerNameField.Value.ValueType == FieldValueType.String) {
      string customerName = customerNameField.Value.AsString();
      Console.WriteLine($ "    Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
    }
  }

  FormField customerAddressField;
  if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
    if (customerAddressField.Value.ValueType == FieldValueType.String) {
      string customerAddress = customerAddressField.Value.AsString();
      Console.WriteLine($ "    Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
    }
  }

  FormField customerAddressRecipientField;
  if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
    if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
      string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
      Console.WriteLine($ "    Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
    }
  }

  FormField invoiceTotalField;
  if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
    if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
      float invoiceTotal = invoiceTotalField.Value.AsFloat();
      Console.WriteLine($ "    Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
    }
  }
}

Azonosítódokumentumok elemzése

Ez a szakasz azt mutatja be, hogyan elemezheti és vonhat ki kulcsinformációkat a kormányzati jogú azonosítási dokumentumokból ( globális útlevelek és az Egyesült Államok sofőrlicencei) az Form Recognizer előre összeállított azonosító modell használatával. Az azonosító dokumentumok elemzésével kapcsolatos további információkért tekintse meg az előre összeállított azonosítási modell fogalmi útmutatóját.

Az azonosító dokumentumok URI-ból való elemzéséhez használja a StartRecognizeIdentityDocumentsFromUriAsync metódust.

private static async Task AnalyzeId(
FormRecognizerClient recognizerClient, string idUrl) {
  RecognizedFormCollection identityDocument = await recognizerClient.StartRecognizeIdDocumentsFromUriAsync(idUrl).WaitForCompletionAsync();

Tipp

Elemezheti a helyi azonosító dokumentum képeit is. Lásd a FormRecognizerClient metódusokat, például a StartRecognizeIdentityDocumentsAsync metódust. A helyi rendszerképeket érintő forgatókönyveket GitHub kódmintában is láthatja.

A következő kód feldolgozza az azonosító dokumentumot az adott URI-ban, és kiírja a fő mezőket és értékeket a konzolra.

RecognizedForm identityDocument = identityDocuments.Single();

if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
  if (addressField.Value.ValueType == FieldValueType.String) {
    string address = addressField.Value.AsString();
    Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
  if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
    string countryRegion = countryRegionField.Value.AsCountryRegion();
    Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
  if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
    DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
    Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
  if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
    DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
    Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
  if (documentNumberField.Value.ValueType == FieldValueType.String) {
    string documentNumber = documentNumberField.Value.AsString();
    Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
  }
  RecognizedForm identityDocument = identityDocuments.Single();

  if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
    if (addressField.Value.ValueType == FieldValueType.String) {
      string address = addressField.Value.AsString();
      Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
    if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
      string countryRegion = countryRegionField.Value.AsCountryRegion();
      Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
    if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
      DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
      Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
    if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
      DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
      Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
    if (documentNumberField.Value.ValueType == FieldValueType.String) {
      string documentNumber = documentNumberField.Value.AsString();
      Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("FirstName", out FormField firstNameField)) {
    if (firstNameField.Value.ValueType == FieldValueType.String) {
      string firstName = firstNameField.Value.AsString();
      Console.WriteLine($ "First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("LastName", out FormField lastNameField)) {
    if (lastNameField.Value.ValueType == FieldValueType.String) {
      string lastName = lastNameField.Value.AsString();
      Console.WriteLine($ "Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("Region", out FormField regionfield)) {
    if (regionfield.Value.ValueType == FieldValueType.String) {
      string region = regionfield.Value.AsString();
      Console.WriteLine($ "Region: '{region}', with confidence {regionfield.Confidence}");
    }
  }

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan betanítható egy modell a saját adataival. A betanított modell olyan strukturált adatokat képes kihozni, amelyek tartalmazzák az eredeti űrlapdokumentumban található kulcs/érték kapcsolatokat. A modell betanítása után tesztelheti és újra betaníthatja azt, és végül arra használhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapból.

Megjegyzés

Modelleket grafikus felhasználói felülettel, például a mintacímkéző eszközzel Form Recognizer betaníthat.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez a betanítás dokumentumainak manuális címkézése nélkül. Az alábbi metódus beképzett egy modellt egy adott dokumentumkészleten, és kiírja a modell állapotát a konzolra.

private static async Task<String> TrainModel(
    FormTrainingClient trainingClient, string trainingDataUrl)
{
    CustomFormModel model = await trainingClient
    .StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: false)
    .WaitForCompletionAsync();

    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {model.ModelId}");
    Console.WriteLine($"    Model Status: {model.Status}");
    Console.WriteLine($"    Training model started on: {model.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {model.TrainingCompletedOn}");

A visszaadott objektum információkat tartalmaz a modell által elemzett űrlaptípusokról és az egyes űrlaptípusokból CustomFormModel kinyerni kívánt mezőkről. A következő kódblokk kinyomtatja ezt az információt a konzolon.

foreach (CustomFormSubmodel submodel in model.Submodels)
{
    Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
    foreach (CustomFormModelField field in submodel.Fields.Values)
    {
        Console.Write($"    FieldName: {field.Name}");
        if (field.Label != null)
        {
            Console.Write($", FieldLabel: {field.Label}");
        }
        Console.WriteLine("");
    }
}

Végül adja vissza a betanított modell azonosítóját a későbbi lépésekben való használathoz.

    return model.ModelId;
}

Kimenet

Ez a válasz az olvashatóság érdekében csonkolva lett.

Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    ...
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    ...
Custom Model Info:
    Model Id: 95035721-f19d-40eb-8820-0c806b42798b
    Model Status: Ready
    Training model started on: 8/24/2020 6:36:44 PM +00:00
    Training model completed on: 8/24/2020 6:36:50 PM +00:00
Submodel Form Type: form-95035721-f19d-40eb-8820-0c806b42798b
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    ...
Custom Model Info:
    Model Id: e7a1181b-1fb7-40be-bfbe-1ee154183633
    Model Status: Ready
    Training model started on: 8/24/2020 6:36:44 PM +00:00
    Training model completed on: 8/24/2020 6:36:52 PM +00:00
Submodel Form Type: form-0
    FieldName: field-0, FieldLabel: Additional Notes:
    FieldName: field-1, FieldLabel: Address:
    FieldName: field-2, FieldLabel: Company Name:
    FieldName: field-3, FieldLabel: Company Phone:
    FieldName: field-4, FieldLabel: Dated As:
    FieldName: field-5, FieldLabel: Details
    FieldName: field-6, FieldLabel: Email:
    FieldName: field-7, FieldLabel: Hero Limited
    FieldName: field-8, FieldLabel: Name:
    FieldName: field-9, FieldLabel: Phone:
    ...

Modell betanítása címkékkel

Egyéni modelleket is betaníthat a betanítás dokumentumainak manuális címkézése által. A címkékkel való betanítás bizonyos helyzetekben jobb teljesítményt eredményez. A címkékkel való betanításhoz speciális címkeinformációs fájlokra () van szükség a Blob Storage-tárolóban a \<filename\>.pdf.labels.json betanítás dokumentumai mellett. A Form Recognizer mintacímkéző eszköz felhasználói felülettel segít létrehozni ezeket a címkefájlokat. Ha már megvan, a metódust a paraméter StartTrainingAsync értékével uselabels hívhatja true meg.

private static async Task<Guid> TrainModelWithLabelsAsync(
    FormRecognizerClient trainingClient, string trainingDataUrl)
{
    CustomFormModel model = await trainingClient
    .StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: true)
    .WaitForCompletionAsync();
    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {model.ModelId}");
    Console.WriteLine($"    Model Status: {model.Status}");
    Console.WriteLine($"    Training model started on: {model.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {model.TrainingCompletedOn}");

A visszaadott érték jelzi a modell által kinyerhető mezőket, valamint az egyes mezőkben található becsült CustomFormModel pontosságot. A következő kódblokk kinyomtatja ezt az információt a konzolon.

    foreach (CustomFormSubmodel submodel in model.Submodels)
    {
        Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
        foreach (CustomFormModelField field in submodel.Fields.Values)
        {
            Console.Write($"    FieldName: {field.Name}");
            if (field.Label != null)
            {
                Console.Write($", FieldLabel: {field.Label}");
            }
            Console.WriteLine("");
        }
    }
    return model.ModelId;
}

Kimenet

Ez a válasz az olvashatóság érdekében csonkolva lett.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    ...
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    ...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
    Model Id: 63c013e3-1cab-43eb-84b0-f4b20cb9214c
    Model Status: Ready
    Training model started on: 8/24/2020 6:42:54 PM +00:00
    Training model completed on: 8/24/2020 6:43:01 PM +00:00
Submodel Form Type: form-63c013e3-1cab-43eb-84b0-f4b20cb9214c
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    FieldName: DatedAs
    FieldName: Email
    FieldName: Merchant
    ...

Űrlapok elemzése egyéni modellel

Ez a szakasz azt mutatja be, hogyan lehet kulcs/érték információkat és egyéb tartalmakat kinyerni az egyéni űrlaptípusokból a saját űrlapokkal betanított modellek használatával.

Fontos

Ennek a forgatókönyvnek a megvalósításához már betanított egy modellt, hogy az azonosítóját az alábbi metódusnak tovább tudja adni.

A metódust fogja StartRecognizeCustomFormsFromUri használni.

// Analyze PDF form data
private static async Task AnalyzePdfForm(
    FormRecognizerClient recognizerClient, String modelId, string formUrl)
{
    RecognizedFormCollection forms = await recognizerClient
    .StartRecognizeCustomFormsFromUri(modelId, new Uri(formUrl))
    .WaitForCompletionAsync();

Tipp

Helyi fájlt is elemezhet. Lásd a FormRecognizerClient metódusokat, például a StartRecognizeCustomForms metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot a következő oldalon: .

A visszaadott érték objektumok gyűjteménye: egy az elküldött dokumentum minden RecognizedForm oldalához. Az alábbi kód kinyomtatja az elemzési eredményeket a konzolon. Kinyomtatja az egyes felismert mezőket és a hozzájuk tartozó értékeket, valamint egy megbízhatósági pontszámot.

    foreach (RecognizedForm form in forms)
    {
        Console.WriteLine($"Form of type: {form.FormType}");
        foreach (FormField field in form.Fields.Values)
        {
            Console.WriteLine($"Field '{field.Name}: ");

            if (field.LabelData != null)
            {
                Console.WriteLine($"    Label: '{field.LabelData.Text}");
            }

            Console.WriteLine($"    Value: '{field.ValueData.Text}");
            Console.WriteLine($"    Confidence: '{field.Confidence}");
        }
        Console.WriteLine("Table data:");
        foreach (FormPage page in form.Pages)
        {
            for (int i = 0; i < page.Tables.Count; i++)
            {
                FormTable table = page.Tables[i];
                Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
                foreach (FormTableCell cell in table.Cells)
                {
                    Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains {(cell.IsHeader ? "header" : "text")}: '{cell.Text}'");
                }
            }
        }
    }
}

Kimenet

Ez a válasz az olvashatóság érdekében csonkolva lett.

Custom Model Info:
    Model Id: 9b0108ee-65c8-450e-b527-bb309d054fc4
    Model Status: Ready
    Training model started on: 8/24/2020 7:00:31 PM +00:00
    Training model completed on: 8/24/2020 7:00:32 PM +00:00
Submodel Form Type: form-9b0108ee-65c8-450e-b527-bb309d054fc4
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    ...
Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    ...

Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    ...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
    Model Id: dc115156-ce0e-4202-bbe4-7426e7bee756
    Model Status: Ready
    Training model started on: 8/24/2020 7:00:31 PM +00:00
    Training model completed on: 8/24/2020 7:00:41 PM +00:00
Submodel Form Type: form-0
    FieldName: field-0, FieldLabel: Additional Notes:
    FieldName: field-1, FieldLabel: Address:
    FieldName: field-2, FieldLabel: Company Name:
    FieldName: field-3, FieldLabel: Company Phone:
    FieldName: field-4, FieldLabel: Dated As:
    ...
Form of type: custom:form
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: '$56,651.49
    Confidence: '0.249
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: 'PT
    Confidence: '0.245
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: '99243
    Confidence: '0.114
   ...

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket. A következő metóduson belül több műveletet is el kell majd végrehajtásához:

private static async Task ManageModels(
    FormTrainingClient trainingClient, string trainingFileUrl)
{

Ellenőrizze a modellek számát a FormRecognizer erőforrásfiókban

A következő kódblokk ellenőrzi, hogy hány modellt mentett a Form Recognizer, és összehasonlítja a fiókkorlátot.

// Check number of models in the FormRecognizer account, 
// and the maximum number of models that can be stored.
AccountProperties accountProperties = trainingClient.GetAccountProperties();
Console.WriteLine($"Account has {accountProperties.CustomModelCount} models.");
Console.WriteLine($"It can have at most {accountProperties.CustomModelLimit} models.");

Kimenet

Account has 20 models.
It can have at most 5000 models.

List the models currently stored in the resource account (Az erőforrásfiókban jelenleg tárolt modellek listása)

A következő kódblokk felsorolja a fiókjában lévő aktuális modelleket, és megjeleníti azok részleteit a konzolon.

Pageable<CustomFormModelInfo> models = trainingClient.GetCustomModels();

foreach (CustomFormModelInfo modelInfo in models)
{
    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {modelInfo.ModelId}");
    Console.WriteLine($"    Model Status: {modelInfo.Status}");
    Console.WriteLine($"    Training model started on: {modelInfo.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {modelInfo.TrainingCompletedOn}");
}

Kimenet

Ez a válasz az olvashatóság érdekében csonkolva lett.

Custom Model Info:
    Model Id: 05932d5a-a2f8-4030-a2ef-4e5ed7112515
    Model Status: Creating
    Training model started on: 8/24/2020 7:35:02 PM +00:00
    Training model completed on: 8/24/2020 7:35:02 PM +00:00
Custom Model Info:
    Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
    Model Status: Ready
    Training model started on: 8/24/2020 7:33:25 PM +00:00
    Training model completed on: 8/24/2020 7:33:27 PM +00:00
Custom Model Info:
    Model Id: 3303e9de-6cec-4dfb-9e68-36510a6ecbb2
    Model Status: Ready
    Training model started on: 8/24/2020 7:29:27 PM +00:00
    Training model completed on: 8/24/2020 7:29:36 PM +00:00

Egy adott modell lekért azonosítója a modell azonosítójával

Az alábbi kódblokk betanít egy új modellt (csakúgy, mint a Modell betanítása szakaszban), majd lekér egy második hivatkozást az azonosítójával.

// Create a new model to store in the account
CustomFormModel model = await trainingClient.StartTrainingAsync(
    new Uri(trainingFileUrl)).WaitForCompletionAsync();

// Get the model that was just created
CustomFormModel modelCopy = trainingClient.GetCustomModel(model.ModelId);

Console.WriteLine($"Custom Model {modelCopy.ModelId} recognizes the following form types:");

foreach (CustomFormSubmodel submodel in modelCopy.Submodels)
{
    Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
    foreach (CustomFormModelField field in submodel.Fields.Values)
    {
        Console.Write($"    FieldName: {field.Name}");
        if (field.Label != null)
        {
            Console.Write($", FieldLabel: {field.Label}");
        }
        Console.WriteLine("");
    }
}

Kimenet

Ez a válasz az olvashatóság érdekében csonkolva lett.

Custom Model Info:
    Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
    Model Status: Ready
    Training model started on: 8/24/2020 7:33:25 PM +00:00
    Training model completed on: 8/24/2020 7:33:27 PM +00:00
Submodel Form Type: form-150828c4-2eb2-487e-a728-60d5d504bd16
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    FieldName: DatedAs
    FieldName: Email
    FieldName: Merchant
    FieldName: PhoneNumber
    FieldName: PurchaseOrderNumber
    FieldName: Quantity
    FieldName: Signature
    FieldName: Subtotal
    FieldName: Tax
    FieldName: Total
    FieldName: VendorName
    FieldName: Website
...

Modell törlése az erőforrásfiókból

Az azonosítójára való hivatkozás segítségével törölheti is a modellt a fiókjából. Ez a lépés a metódust is bezárja.

    // Delete the model from the account.
    trainingClient.DeleteModel(model.ModelId);
}

Az alkalmazás futtatása

Futtassa az alkalmazást az alkalmazás könyvtárában az dotnet run paranccsal.

dotnet run

Az erőforrások eltávolítása

Ha törölni vagy eltávolítani szeretne egy Cognitive Services előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlésével a hozzá társított összes többi erőforrást is törli.

Hibaelhárítás

Ha az ügyféloldali kódtárat Cognitive Services Form Recognizer .NET SDK-val használja, a szolgáltatás által visszaadott hibák a következőt eredményezik: RequestFailedException . Ugyanazt a HTTP-állapotkódot tartalmazzák, amelyet egy kérés visszaadott REST API vissza.

Ha például érvénytelen URI-val küld egy nyugtaképet, a rendszer egy "Hibás kérés" 400 hibaüzenetet ad vissza.

try
{
    RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync();
}
catch (RequestFailedException e)
{
    Console.WriteLine(e.ToString());
}

Figyelje meg, hogy a rendszer további információkat, például a művelet ügyfélkérés-azonosítóját naplózza.


Message:
    Azure.RequestFailedException: Service request failed.
    Status: 400 (Bad Request)

Content:
    {"error":{"code":"FailedToDownloadImage","innerError":
    {"requestId":"8ca04feb-86db-4552-857c-fde903251518"},
    "message":"Failed to download image from input URL."}}

Headers:
    Transfer-Encoding: chunked
    x-envoy-upstream-service-time: REDACTED
    apim-request-id: REDACTED
    Strict-Transport-Security: REDACTED
    X-Content-Type-Options: REDACTED
    Date: Mon, 20 Apr 2020 22:48:35 GMT
    Content-Type: application/json; charset=utf-8

Következő lépések

Ebben a rövid útmutatóban a Form Recognizer .NET ügyféloldali kódtárat használta modellek betanítása és űrlapok különböző módon való elemzéséhez. Ezután tippeket tanulhat egy jobb betanítású adatkészlet létrehozásához és pontosabb modellek létrehozásához.

Fontos

  • Ez a rövid útmutató az SDK 3.1.1-es verzióját használja, és a 2.1-es API-verziót célozza meg.

  • A cikkben olvasható kód az egyszerűség kedvéért szinkron metódusokat és nem biztonságos hitelesítőadat-tárolót használ.

Referenciadokumentáció | Kódtár forráskódja | Csomag (Maven) | Minták

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • A Java fejlesztői készlet (JDK) aktuális verziója
  • A Gradle buildeszköz ,vagy egy másik függőségkezelő.
  • Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy Form Recognizer-erőforrást, Form Recognizer erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után kattintson az Erőforráshoz való ugrás gombra.
    • Szüksége lesz a létrehozott erőforrás kulcsra és végpontra ahhoz, hogy az alkalmazást a Form Recognizer API-hoz. A kulcsot és a végpontot a rövid útmutató későbbi, alábbi kódába fogja beilleszteni.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szolgáltatási szintre éles F0 környezetben.
  • Egy Azure Storage blobot tartalmaz, amely betanításadatok egy halmazát tartalmazza. A betanítás adatkészletének összeállítására vonatkozó tippekért és lehetőségekért tekintse meg a betanítás adatkészletének összeállítása egyéni modellhez való összeállítását. Ebben a rövid útmutatóban a mintaadatkészlet Train (Betanítás) mappájában található fájlokat használhatja (töltse le és bontsa ki a sample_data.zip).

Beállítása

Új Gradle-projekt létrehozása

Egy konzolablakban (például cmd, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, és keresse meg.

mkdir myapp && cd myapp

Futtassa gradle init a parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle-hez, beleértve a build.gradle.kts fájlt, amelyet futásidőben használ az alkalmazás létrehozásához és konfigurálásához.

gradle init --type basic

Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.

Az ügyféloldali kódtár telepítése

Ez a rövid útmutató a Gradle függőségkezelőt használja. Az ügyféloldali kódtárat és az egyéb függőségkezelőkre vonatkozó információkat a Maven központi adattárában találja.

A projekt build.gradle.kts fájljában utasításként foglalja bele az ügyféloldali kódtárat, valamint a szükséges beépülő modulokat implementation és beállításokat.

plugins {
    java
    application
}
application {
    mainClass.set("FormRecognizer")
}
repositories {
    mavenCentral()
}
dependencies {
    implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}

Java-fájl létrehozása

Futtassa a következő parancsot a munkakönyvtárban:

mkdir -p src/main/java

Lépjen az új mappába, és hozzon létre egy FormRecognizer.java nevű fájlt. Nyissa meg a kívánt szerkesztőben vagy IDE-ban, és adja hozzá a következő import utasításokat:

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.training.*;
import com.azure.ai.formrecognizer.models.*;
import com.azure.ai.formrecognizer.training.models.*;

import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;

Tipp

Ha a rövid útmutatóban található kódmintákkal a teljes fájlt meg szeretné tekinteni, a következő GitHub.

Az alkalmazás FormRecognizer osztályában hozzon létre változókat az erőforrás kulcsához és végpontjához.

static final String key = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

Fontos

Nyissa meg az Azure Portalt. Ha az Form Recognizer szakaszban létrehozott erőforrás sikeresen üzembe lett stb., kattintson a Következő lépések területen található Erőforrás ugrás gombra. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor végzett, és soha ne tegye közzé nyilvánosan. Éles környezetben használjon biztonságos módszereket a hitelesítő adatok tárolására és elérésére. További információt Cognitive Services biztonsági cikk tartalmaz.

Az alkalmazás fő metódusában adja hozzá az ebben a rövid útmutatóban használt metódusok hívásait. Ezeket később fogja definiálni. A betanítás és a tesztelési adatok URL-címére mutató hivatkozásokat is hozzá kell adni.

    • Az egyéni modell betanítási adatainak SAS URL-címének lekéréséhez a tárerőforrást a Azure Portal válassza a Storage Explorer fület. Navigáljon a tárolóhoz, kattintson a jobb gombbal, és válassza a Közös hozzáférésű jogosultság jogosultsága begyűjtése lehetőséget. Fontos, hogy a tároló SAS-ét szerezze be, ne magát a tárfiókot. Győződjön meg arról, hogy az Olvasás, Írás, Törlés és Lista engedély be van jelölve, majd kattintson a Létrehozás gombra. Ezután másolja az URL szakaszban található értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

    SAS URL-lekérés

  • A tesztelni kívánt űrlap URL-címének lekért url-címét a fenti lépésekkel lekértük egy adott dokumentum SAS URL-címét a Blob Storage-ban. Másik, ha egy máshol található dokumentum URL-címét veszi fel.

  • A fenti metódussal egy nyugtakép URL-címét is le kell kapnia.

String trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
String formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
String receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
String bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
String invoiceUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf";
String idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"
// Call Form Recognizer scenarios:
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);

System.out.println("Analyze receipt...");
AnalyzeReceipt(recognizerClient, receiptUrl);

System.out.println("Analyze business card...");
AnalyzeBusinessCard(recognizerClient, bcUrl);

System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);

System.out.println("Analyze id...");
AnalyzeId(recognizerClient, idUrl);

System.out.println("Train Model with training data...");
String modelId = TrainModel(trainingClient, trainingDataUrl);

System.out.println("Analyze PDF form...");
AnalyzePdfForm(recognizerClient, modelId, formUrl);

System.out.println("Manage models...");
ManageModels(trainingClient, trainingDataUrl);

Objektummodell

A Form Recognizer két különböző ügyféltípust hozhat létre. Az első az FormRecognizerClient űrlap felismert mezőinek és tartalmának lekérdezésére használható. A második a segítségével hoz létre és kezel egyéni FormTrainingClient modelleket a felismerés javítása érdekében.

FormRecognizerClient

FormRecognizerClient A a következő műveleteket biztosítja:

  • Űrlapmezők és tartalmak felismerése az egyéni űrlapok elemzéséhez betanított egyéni modellekkel. Ezeket az értékeket objektumgyűjtemények ják RecognizedForm vissza. Lásd az Egyéni űrlapok elemzése példát.
  • Űrlaptartalmak, köztük táblák, sorok és szavak felismerése modell betanítása nélkül. Az űrlap tartalma objektumgyűjteményben lesz FormPage visszaadva. Lásd az Elrendezés elemzése példát.
  • A közös mezők felismerése az USA-nyugtákból, névjegykártyákból, számlákból és azonosító dokumentumokból egy előre betanított modellel a Form Recognizer szolgáltatásban.

FormTrainingClient

FormTrainingClient A a következő műveleteket biztosítja:

  • Egyéni modellek betanítása az egyéni űrlapokon található összes mező és érték elemzéséhez. A visszaadott érték jelzi a modell által elemzett űrlaptípusokat és az egyes űrlaptípusokhoz CustomFormModel kinyert mezőket.
  • Egyéni modellek betanítása az egyéni űrlapok címkézése által megadott mezők és értékek elemzéséhez. A visszaadott érték jelzi a modell által kinyert mezőket, valamint az egyes mezők becsült CustomFormModel pontosságát.
  • A fiókjában létrehozott modellek kezelése.
  • Egyéni modell másolása egyik erőforrásból Form Recognizer másikba.

Megjegyzés

A modellek grafikus felhasználói felülettel, például a Form Recognizer eszközzel is betaníthatóak.

Az ügyfél hitelesítése

A fő metódus tetején adja hozzá a következő kódot. Itt két ügyfélobjektumot fog hitelesíteni a fent meghatározott előfizetési változók használatával. Egy AzureKeyCredential objektumot fog használni, így szükség esetén új ügyfélobjektumok létrehozása nélkül frissítheti az API-kulcsot.

FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
        .credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

FormTrainingClient trainingClient = new FormTrainingClientBuilder().credential(new AzureKeyCredential(key))
        .endpoint(endpoint).buildClient();

Elrendezés elemzése

A modell betanítása Form Recognizer nélkül elemezheti a táblákat, sorokat és szavakat a dokumentumokban. Az elrendezéskinyerésről az Elrendezés fogalmi útmutatóban található további információ.

Egy adott URL-címen található fájl tartalmának elemzéséhez használja a beginRecognizeContentFromUrl metódust.

private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
    String analyzeFilePath = invoiceUri;
    SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
            .beginRecognizeContentFromUrl(analyzeFilePath);

    List<FormPage> contentResult = recognizeContentPoller.getFinalResult();

Tipp

Helyi fájlból is lekért tartalom. Lásd a FormRecognizerClient metódusokat, például a beginRecognizeContent metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A visszaadott érték FormPage-objektumok gyűjteménye: egy az elküldött dokumentum minden oldalához. Az alábbi kód végig lépked ezeken az objektumokon, és kinyomtatja a kinyert kulcs/érték párokat és táblaadatokat.

    contentResult.forEach(formPage -> {
        // Table information
        System.out.println("----Recognizing content ----");
        System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
                formPage.getHeight(), formPage.getUnit());
        formPage.getTables().forEach(formTable -> {
            System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
                    formTable.getColumnCount());
            formTable.getCells().forEach(formTableCell -> {
                System.out.printf("Cell has text %s.%n", formTableCell.getText());
            });
            System.out.println();
        });
    });
}

Kimenet

Get form content...
----Recognizing content ----
Has width: 8.500000 and height: 11.000000, measured with unit: inch.
Table has 2 rows and 6 columns.
Cell has text Invoice Number.
Cell has text Invoice Date.
Cell has text Invoice Due Date.
Cell has text Charges.
Cell has text VAT ID.
Cell has text 458176.
Cell has text 3/28/2018.
Cell has text 4/16/2018.
Cell has text $89,024.34.
Cell has text ET.

Nyugták elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki közös mezőket az USA-nyugtákból egy előre betanított nyugtamodell használatával. A nyugták elemzésével kapcsolatos további információkért lásd a nyugták fogalmi útmutatóját.

Egy URI-ból származó nyugták elemzéséhez használja a beginRecognizeReceiptsFromUrl metódust.

private static void AnalyzeReceipt(FormRecognizerClient recognizerClient, String receiptUri) {
    SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> syncPoller = recognizerClient
            .beginRecognizeReceiptsFromUrl(receiptUri);
    List<RecognizedForm> receiptPageResults = syncPoller.getFinalResult();

Tipp

A helyi nyugták rendszerképét is elemezheti. Lásd a FormRecognizerClient metódusokat, például a beginRecognizeReceipts metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A visszaadott érték RecognizedReceipt objektumok gyűjteménye: egy az elküldött dokumentum minden oldalához. A következő kódblokk végigveszi a nyugtákat, és kinyomtatja a részleteket a konzolon.

for (int i = 0; i < receiptPageResults.size(); i++) {
    RecognizedForm recognizedForm = receiptPageResults.get(i);
    Map<String, FormField> recognizedFields = recognizedForm.getFields();
    System.out.printf("----------- Recognized Receipt page %d -----------%n", i);
    FormField merchantNameField = recognizedFields.get("MerchantName");
    if (merchantNameField != null) {
        if (FieldValueType.STRING == merchantNameField.getValue().getValueType()) {
            String merchantName = merchantNameField.getValue().asString();
            System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName,
                    merchantNameField.getConfidence());
        }
    }
    FormField merchantAddressField = recognizedFields.get("MerchantAddress");
    if (merchantAddressField != null) {
        if (FieldValueType.STRING == merchantAddressField.getValue().getValueType()) {
            String merchantAddress = merchantAddressField.getValue().asString();
            System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress,
                    merchantAddressField.getConfidence());
        }
    }
    FormField transactionDateField = recognizedFields.get("TransactionDate");
    if (transactionDateField != null) {
        if (FieldValueType.DATE == transactionDateField.getValue().getValueType()) {
            LocalDate transactionDate = transactionDateField.getValue().asDate();
            System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate,
                    transactionDateField.getConfidence());
        }
    }

A következő kódblokk végigveszi a nyugtán észlelt egyes elemeket, és kiírja a részleteket a konzolra.

        FormField receiptItemsField = recognizedFields.get("Items");
        if (receiptItemsField != null) {
            System.out.printf("Receipt Items: %n");
            if (FieldValueType.LIST == receiptItemsField.getValue().getValueType()) {
                List<FormField> receiptItems = receiptItemsField.getValue().asList();
                receiptItems.stream()
                        .filter(receiptItem -> FieldValueType.MAP == receiptItem.getValue().getValueType())
                        .map(formField -> formField.getValue().asMap())
                        .forEach(formFieldMap -> formFieldMap.forEach((key, formField) -> {
                            if ("Name".equals(key)) {
                                if (FieldValueType.STRING == formField.getValue().getValueType()) {
                                    String name = formField.getValue().asString();
                                    System.out.printf("Name: %s, confidence: %.2fs%n", name,
                                            formField.getConfidence());
                                }
                            }
                            if ("Quantity".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float quantity = formField.getValue().asFloat();
                                    System.out.printf("Quantity: %f, confidence: %.2f%n", quantity,
                                            formField.getConfidence());
                                }
                            }
                            if ("Price".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float price = formField.getValue().asFloat();
                                    System.out.printf("Price: %f, confidence: %.2f%n", price,
                                            formField.getConfidence());
                                }
                            }
                            if ("TotalPrice".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float totalPrice = formField.getValue().asFloat();
                                    System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice,
                                            formField.getConfidence());
                                }
                            }
                        }));
            }
        }
    }
}

Kimenet

Analyze receipt...
----------- Recognized Receipt page 0 -----------
Merchant Name: Contoso Contoso, confidence: 0.62
Merchant Address: 123 Main Street Redmond, WA 98052, confidence: 0.99
Transaction Date: 2020-06-10, confidence: 0.90
Receipt Items:
Name: Cappuccino, confidence: 0.96s
Quantity: null, confidence: 0.957s]
Total Price: 2.200000, confidence: 0.95
Name: BACON & EGGS, confidence: 0.94s
Quantity: null, confidence: 0.927s]
Total Price: null, confidence: 0.93

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki általános mezőket angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért lásd a névjegykártyák fogalmi útmutatóját.

A névjegykártyák URL-címből való elemzéséhez használja a beginRecognizeBusinessCardsFromUrl metódust.

private static void AnalyzeBusinessCard(FormRecognizerClient recognizerClient, String bcUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> recognizeBusinessCardPoller = client.beginRecognizeBusinessCardsFromUrl(businessCardUrl);

    List < RecognizedForm > businessCardPageResults = recognizeBusinessCardPoller.getFinalResult();

Tipp

Helyi névjegykártya-képeket is elemezhet. Lásd a FormRecognizerClient metódusokat, például a beginRecognizeBusinessCards metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A visszaadott érték RecognizedForm-objektumok gyűjteménye: a dokumentum minden kártyája egy-egy. A következő kód feldolgozza a névjegykártyát az adott URI-ban, és kiírja a fő mezőket és értékeket a konzolra.

    for (int i = 0; i < businessCardPageResults.size(); i++) {
        RecognizedForm recognizedForm = businessCardPageResults.get(i);
        Map < String,
        FormField > recognizedFields = recognizedForm.getFields();
        System.out.printf("----------- Recognized business card info for page %d -----------%n", i);
        FormField contactNamesFormField = recognizedFields.get("ContactNames");
        if (contactNamesFormField != null) {
            if (FieldValueType.LIST == contactNamesFormField.getValue().getValueType()) {
                List < FormField > contactNamesList = contactNamesFormField.getValue().asList();
                contactNamesList.stream().filter(contactName - >FieldValueType.MAP == contactName.getValue().getValueType()).map(contactName - >{
                    System.out.printf("Contact name: %s%n", contactName.getValueData().getText());
                    return contactName.getValue().asMap();
                }).forEach(contactNamesMap - >contactNamesMap.forEach((key, contactName) - >{
                    if ("FirstName".equals(key)) {
                        if (FieldValueType.STRING == contactName.getValue().getValueType()) {
                            String firstName = contactName.getValue().asString();
                            System.out.printf("\tFirst Name: %s, confidence: %.2f%n", firstName, contactName.getConfidence());
                        }
                    }
                    if ("LastName".equals(key)) {
                        if (FieldValueType.STRING == contactName.getValue().getValueType()) {
                            String lastName = contactName.getValue().asString();
                            System.out.printf("\tLast Name: %s, confidence: %.2f%n", lastName, contactName.getConfidence());
                        }
                    }
                }));
            }
        }

        FormField jobTitles = recognizedFields.get("JobTitles");
        if (jobTitles != null) {
            if (FieldValueType.LIST == jobTitles.getValue().getValueType()) {
                List < FormField > jobTitlesItems = jobTitles.getValue().asList();
                jobTitlesItems.stream().forEach(jobTitlesItem - >{
                    if (FieldValueType.STRING == jobTitlesItem.getValue().getValueType()) {
                        String jobTitle = jobTitlesItem.getValue().asString();
                        System.out.printf("Job Title: %s, confidence: %.2f%n", jobTitle, jobTitlesItem.getConfidence());
                    }
                });
            }
        }

        FormField departments = recognizedFields.get("Departments");
        if (departments != null) {
            if (FieldValueType.LIST == departments.getValue().getValueType()) {
                List < FormField > departmentsItems = departments.getValue().asList();
                departmentsItems.stream().forEach(departmentsItem - >{
                    if (FieldValueType.STRING == departmentsItem.getValue().getValueType()) {
                        String department = departmentsItem.getValue().asString();
                        System.out.printf("Department: %s, confidence: %.2f%n", department, departmentsItem.getConfidence());
                    }
                });
            }
        }

        FormField emails = recognizedFields.get("Emails");
        if (emails != null) {
            if (FieldValueType.LIST == emails.getValue().getValueType()) {
                List < FormField > emailsItems = emails.getValue().asList();
                emailsItems.stream().forEach(emailsItem - >{
                    if (FieldValueType.STRING == emailsItem.getValue().getValueType()) {
                        String email = emailsItem.getValue().asString();
                        System.out.printf("Email: %s, confidence: %.2f%n", email, emailsItem.getConfidence());
                    }
                });
            }
        }

        FormField websites = recognizedFields.get("Websites");
        if (websites != null) {
            if (FieldValueType.LIST == websites.getValue().getValueType()) {
                List < FormField > websitesItems = websites.getValue().asList();
                websitesItems.stream().forEach(websitesItem - >{
                    if (FieldValueType.STRING == websitesItem.getValue().getValueType()) {
                        String website = websitesItem.getValue().asString();
                        System.out.printf("Web site: %s, confidence: %.2f%n", website, websitesItem.getConfidence());
                    }
                });
            }
        }

        FormField mobilePhones = recognizedFields.get("MobilePhones");
        if (mobilePhones != null) {
            if (FieldValueType.LIST == mobilePhones.getValue().getValueType()) {
                List < FormField > mobilePhonesItems = mobilePhones.getValue().asList();
                mobilePhonesItems.stream().forEach(mobilePhonesItem - >{
                    if (FieldValueType.PHONE_NUMBER == mobilePhonesItem.getValue().getValueType()) {
                        String mobilePhoneNumber = mobilePhonesItem.getValue().asPhoneNumber();
                        System.out.printf("Mobile phone number: %s, confidence: %.2f%n", mobilePhoneNumber, mobilePhonesItem.getConfidence());
                    }
                });
            }
        }

        FormField otherPhones = recognizedFields.get("OtherPhones");
        if (otherPhones != null) {
            if (FieldValueType.LIST == otherPhones.getValue().getValueType()) {
                List < FormField > otherPhonesItems = otherPhones.getValue().asList();
                otherPhonesItems.stream().forEach(otherPhonesItem - >{
                    if (FieldValueType.PHONE_NUMBER == otherPhonesItem.getValue().getValueType()) {
                        String otherPhoneNumber = otherPhonesItem.getValue().asPhoneNumber();
                        System.out.printf("Other phone number: %s, confidence: %.2f%n", otherPhoneNumber, otherPhonesItem.getConfidence());
                    }
                });
            }
        }

        FormField faxes = recognizedFields.get("Faxes");
        if (faxes != null) {
            if (FieldValueType.LIST == faxes.getValue().getValueType()) {
                List < FormField > faxesItems = faxes.getValue().asList();
                faxesItems.stream().forEach(faxesItem - >{
                    if (FieldValueType.PHONE_NUMBER == faxesItem.getValue().getValueType()) {
                        String faxPhoneNumber = faxesItem.getValue().asPhoneNumber();
                        System.out.printf("Fax phone number: %s, confidence: %.2f%n", faxPhoneNumber, faxesItem.getConfidence());
                    }
                });
            }
        }

        FormField addresses = recognizedFields.get("Addresses");
        if (addresses != null) {
            if (FieldValueType.LIST == addresses.getValue().getValueType()) {
                List < FormField > addressesItems = addresses.getValue().asList();
                addressesItems.stream().forEach(addressesItem - >{
                    if (FieldValueType.STRING == addressesItem.getValue().getValueType()) {
                        String address = addressesItem.getValue().asString();
                        System.out.printf("Address: %s, confidence: %.2f%n", address, addressesItem.getConfidence());
                    }
                });
            }
        }

        FormField companyName = recognizedFields.get("CompanyNames");
        if (companyName != null) {
            if (FieldValueType.LIST == companyName.getValue().getValueType()) {
                List < FormField > companyNameItems = companyName.getValue().asList();
                companyNameItems.stream().forEach(companyNameItem - >{
                    if (FieldValueType.STRING == companyNameItem.getValue().getValueType()) {
                        String companyNameValue = companyNameItem.getValue().asString();
                        System.out.printf("Company name: %s, confidence: %.2f%n", companyNameValue, companyNameItem.getConfidence());
                    }
                });
            }
        }
    }
}

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért lásd a számla fogalmi útmutatóját.

A számlák URL-címről való elemzéséhez használja a beginRecognizeInvoicesFromUrl metódust.

private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> recognizeInvoicesPoller = client.beginRecognizeInvoicesFromUrl(invoiceUrl);

    List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();

Tipp

A helyi számlákat is elemezheti. Lásd a FormRecognizerClient metódusokat, például a beginRecognizeInvoices metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A visszaadott érték RecognizedForm-objektumok gyűjteménye: egyet a dokumentum minden egyes számlájához. A következő kód feldolgozza a számlát az adott URI-ban, és kinyomtatja a fő mezőket és értékeket a konzolon.

    for (int i = 0; i < recognizedInvoices.size(); i++) {
        RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
        Map < String,
        FormField > recognizedFields = recognizedInvoice.getFields();
        System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
        FormField vendorNameField = recognizedFields.get("VendorName");
        if (vendorNameField != null) {
            if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
                String merchantName = vendorNameField.getValue().asString();
                System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
            }
        }

        FormField vendorAddressField = recognizedFields.get("VendorAddress");
        if (vendorAddressField != null) {
            if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
                String merchantAddress = vendorAddressField.getValue().asString();
                System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
            }
        }

        FormField customerNameField = recognizedFields.get("CustomerName");
        if (customerNameField != null) {
            if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
                String merchantAddress = customerNameField.getValue().asString();
                System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
            }
        }

        FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
                String customerAddr = customerAddressRecipientField.getValue().asString();
                System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
            }
        }

        FormField invoiceIdField = recognizedFields.get("InvoiceId");
        if (invoiceIdField != null) {
            if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
                String invoiceId = invoiceIdField.getValue().asString();
                System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
            }
        }

        FormField invoiceDateField = recognizedFields.get("InvoiceDate");
        if (customerNameField != null) {
            if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
                LocalDate invoiceDate = invoiceDateField.getValue().asDate();
                System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
            }
        }

        FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
                Float invoiceTotal = invoiceTotalField.getValue().asFloat();
                System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
            }
        }
    }
}

Azonosítódokumentumok elemzése

Ez a szakasz azt mutatja be, hogyan elemezheti és vonhat ki kulcsfontosságú információkat a kormány által kiadott azonosítási dokumentumokból ( globális passportok és az Egyesült Államok sofőrlicencei) az Form Recognizer előre összeállított azonosító modell használatával. Az azonosító dokumentumelemzéssel kapcsolatos további információkért tekintse meg az előre összeállított azonosítási modell fogalmi útmutatóját.

Az azonosító dokumentumok URI-ból való elemzéséhez használja a beginRecognizeIdentityDocumentsFromUrl metódust.

private static void AnalyzeId(FormRecognizerClient client, String idUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> analyzeIdentityDocumentPoller = client.beginRecognizeIdentityDocumentsFromUrl(licenseDocumentUrl);

    List < RecognizedForm > identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult();

Tipp

A helyi azonosító dokumentumképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például a beginRecognizeIdentityDocuments metódust. A helyi rendszerképeket érintő forgatókönyveket GitHub kódmintában is láthatja.

A következő kód feldolgozza az azonosító dokumentumot az adott URI-ban, és kiírja a fő mezőket és értékeket a konzolra.

for (int i = 0; i < identityDocumentResults.size(); i++) {
    RecognizedForm recognizedForm = identityDocumentResults.get(i);
    Map < String,
    FormField > recognizedFields = recognizedForm.getFields();
    System.out.printf("----------- Recognized license info for page %d -----------%n", i);
    FormField addressField = recognizedFields.get("Address");
    if (addressField != null) {
        if (FieldValueType.STRING == addressField.getValue().getValueType()) {
            String address = addressField.getValue().asString();
            System.out.printf("Address: %s, confidence: %.2f%n", address, addressField.getConfidence());
        }
    }

    FormField countryRegionFormField = recognizedFields.get("CountryRegion");
    if (countryRegionFormField != null) {
        if (FieldValueType.STRING == countryRegionFormField.getValue().getValueType()) {
            String countryRegion = countryRegionFormField.getValue().asCountryRegion();
            System.out.printf("Country or region: %s, confidence: %.2f%n", countryRegion, countryRegionFormField.getConfidence());
        }
    }

    FormField dateOfBirthField = recognizedFields.get("DateOfBirth");
    if (dateOfBirthField != null) {
        if (FieldValueType.DATE == dateOfBirthField.getValue().getValueType()) {
            LocalDate dateOfBirth = dateOfBirthField.getValue().asDate();
            System.out.printf("Date of Birth: %s, confidence: %.2f%n", dateOfBirth, dateOfBirthField.getConfidence());
        }
    }

    FormField dateOfExpirationField = recognizedFields.get("DateOfExpiration");
    if (dateOfExpirationField != null) {
        if (FieldValueType.DATE == dateOfExpirationField.getValue().getValueType()) {
            LocalDate expirationDate = dateOfExpirationField.getValue().asDate();
            System.out.printf("Document date of expiration: %s, confidence: %.2f%n", expirationDate, dateOfExpirationField.getConfidence());
        }
    }

    FormField documentNumberField = recognizedFields.get("DocumentNumber");
    if (documentNumberField != null) {
        if (FieldValueType.STRING == documentNumberField.getValue().getValueType()) {
            String documentNumber = documentNumberField.getValue().asString();
            System.out.printf("Document number: %s, confidence: %.2f%n", documentNumber, documentNumberField.getConfidence());
        }
    }

    FormField firstNameField = recognizedFields.get("FirstName");
    if (firstNameField != null) {
        if (FieldValueType.STRING == firstNameField.getValue().getValueType()) {
            String firstName = firstNameField.getValue().asString();
            System.out.printf("First Name: %s, confidence: %.2f%n", firstName, documentNumberField.getConfidence());
        }
    }

    FormField lastNameField = recognizedFields.get("LastName");
    if (lastNameField != null) {
        if (FieldValueType.STRING == lastNameField.getValue().getValueType()) {
            String lastName = lastNameField.getValue().asString();
            System.out.printf("Last name: %s, confidence: %.2f%n", lastName, lastNameField.getConfidence());
        }
    }

    FormField regionField = recognizedFields.get("Region");
    if (regionField != null) {
        if (FieldValueType.STRING == regionField.getValue().getValueType()) {
            String region = regionField.getValue().asString();
            System.out.printf("Region: %s, confidence: %.2f%n", region, regionField.getConfidence());
        }
    }
}

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan betanítható egy modell a saját adataival. A betanított modell olyan strukturált adatokat képes kihozni, amelyek tartalmazzák a kulcs/érték kapcsolatokat az eredeti űrlapdokumentumban. A modell betanítása után tesztelheti és újra betaníthatja, majd végül arra használhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapról.

Megjegyzés

A modelleket grafikus felhasználói felülettel is betaníthatja, például a Form Recognizer eszköz használatával.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokon található összes mező és érték elemzésére a betanító dokumentumok manuális címkézése nélkül.

Az alábbi metódus egy adott dokumentumkészleten keresztül készíti be a modellt, majd a konzolon kinyomtatja a modell állapotát.

private static String TrainModel(FormTrainingClient trainingClient, String trainingDataUrl) {
    SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
            .beginTraining(trainingDataUrl, false);

    CustomFormModel customFormModel = trainingPoller.getFinalResult();

    // Model Info
    System.out.printf("Model Id: %s%n", customFormModel.getModelId());
    System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());

A visszaadott CustomFormModel objektum információkat tartalmaz a modell által elemzható űrlaptípusokról és az egyes űrlaptípusokból kinyerni kívánt mezőkről. A következő kódblokk ezt az információt a konzolon nyomtatja ki.

System.out.println("Recognized Fields:");
// looping through the subModels, which contains the fields they were trained on
// Since the given training documents are unlabeled, we still group them but
// they do not have a label.
customFormModel.getSubmodels().forEach(customFormSubmodel -> {
    // Since the training data is unlabeled, we are unable to return the accuracy of
    // this model
    System.out.printf("The subModel has form type %s%n", customFormSubmodel.getFormType());
    customFormSubmodel.getFields().forEach((field, customFormModelField) -> System.out
            .printf("The model found field '%s' with label: %s%n", field, customFormModelField.getLabel()));
});

Végül ez a metódus a modell egyedi azonosítóját adja vissza.

    return customFormModel.getModelId();
}

Kimenet

Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z

Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID

Modell betanítása címkékkel

Egyéni modelleket is betaníthat a betanítás dokumentumainak manuális címkézése által. A címkékkel való betanítás bizonyos helyzetekben jobb teljesítményt eredményez. A címkékkel való betanításhoz speciális címkeinformációs fájlokra <filename> (.pdf.labels.json) van szükség a blobtárolóban a betanítás dokumentumai mellett. A Form Recognizer mintacímkéző eszköz felhasználói felületet biztosít a címkefájlok létrehozásához. Ha már megvan, a beginTraining metódust a useTrainingLabels paraméter értékével hívhatja true meg.

private static String TrainModelWithLabels(FormTrainingClient trainingClient, String trainingDataUrl) {
    // Train custom model
    String trainingSetSource = trainingDataUrl;
    SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
            .beginTraining(trainingSetSource, true);

    CustomFormModel customFormModel = trainingPoller.getFinalResult();

    // Model Info
    System.out.printf("Model Id: %s%n", customFormModel.getModelId());
    System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());

A visszaadott CustomFormModel a modell által kinyerhető mezőket, valamint az egyes mezőkben található becsült pontosságot jelzi. A következő kódblokk ezt az információt a konzolon nyomtatja ki.

    // looping through the subModels, which contains the fields they were trained on
    // The labels are based on the ones you gave the training document.
    System.out.println("Recognized Fields:");
    // Since the data is labeled, we are able to return the accuracy of the model
    customFormModel.getSubmodels().forEach(customFormSubmodel -> {
        System.out.printf("The subModel with form type %s has accuracy: %.2f%n", customFormSubmodel.getFormType(),
                customFormSubmodel.getAccuracy());
        customFormSubmodel.getFields()
                .forEach((label, customFormModelField) -> System.out.printf(
                        "The model found field '%s' to have name: %s with an accuracy: %.2f%n", label,
                        customFormModelField.getName(), customFormModelField.getAccuracy()));
    });
    return customFormModel.getModelId();
}

Kimenet

Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z

Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID

Űrlapok elemzése egyéni modellel

Ez a szakasz azt mutatja be, hogyan lehet kulcs/érték információkat és egyéb tartalmakat kinyerni az egyéni űrlaptípusokból a saját űrlapokkal betanított modellek használatával.

Fontos

Ennek a forgatókönyvnek a megvalósításához már be kell tanítania egy modellt, hogy az azonosítóját az alábbi metódusnak tovább tudja adni. Lásd a Modell betanítás szakaszát.

A beginRecognizeCustomFormsFromUrl metódust fogja használni.

// Analyze PDF form data
private static void AnalyzePdfForm(FormRecognizerClient formClient, String modelId, String pdfFormUrl) {
    SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> recognizeFormPoller = formClient
            .beginRecognizeCustomFormsFromUrl(modelId, pdfFormUrl);

    List<RecognizedForm> recognizedForms = recognizeFormPoller.getFinalResult();

Tipp

Helyi fájlokat is elemezhet. Lásd a FormRecognizerClient metódusokat, például a beginRecognizeCustomForms metódust. Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot.

A visszaadott érték RecognizedForm-objektumok gyűjteménye: egy az elküldött dokumentum minden oldalához. A következő kód kinyomtatja az elemzési eredményeket a konzolon. Kinyomtatja az egyes felismert mezőket és a hozzájuk tartozó értékeket, valamint egy megbízhatósági pontszámot.

    for (int i = 0; i < recognizedForms.size(); i++) {
        final RecognizedForm form = recognizedForms.get(i);
        System.out.printf("----------- Recognized custom form info for page %d -----------%n", i);
        System.out.printf("Form type: %s%n", form.getFormType());
        form.getFields().forEach((label, formField) ->
        // label data is populated if you are using a model trained with unlabeled data,
        // since the service needs to make predictions for labels if not explicitly
        // given to it.
        System.out.printf("Field '%s' has label '%s' with a confidence " + "score of %.2f.%n", label,
                formField.getLabelData().getText(), formField.getConfidence()));
    }
}

Kimenet

Analyze PDF form...
----------- Recognized custom form info for page 0 -----------
Form type: form-0
Field 'field-0' has label 'Address:' with a confidence score of 0.91.
Field 'field-1' has label 'Invoice For:' with a confidence score of 1.00.
Field 'field-2' has label 'Invoice Number' with a confidence score of 1.00.
Field 'field-3' has label 'Invoice Date' with a confidence score of 1.00.
Field 'field-4' has label 'Invoice Due Date' with a confidence score of 1.00.
Field 'field-5' has label 'Charges' with a confidence score of 1.00.
Field 'field-6' has label 'VAT ID' with a confidence score of 1.00.

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket. Az alábbi kód az összes modellkezelési feladatot egyetlen metódusban, példaként használja. Először másolja ki az alábbi metódus-aláírást:

private static void ManageModels(FormTrainingClient trainingClient, String trainingFileUrl) {

Ellenőrizze a modellek számát a FormRecognizer erőforrásfiókban

A következő kódblokk ellenőrzi, hogy hány modellt mentett a Form Recognizer-fiókjába, és összehasonlítja azt a fiókkorlátkal.

AtomicReference<String> modelId = new AtomicReference<>();

// First, we see how many custom models we have, and what our limit is
AccountProperties accountProperties = trainingClient.getAccountProperties();
System.out.printf("The account has %s custom models, and we can have at most %s custom models",
        accountProperties.getCustomModelCount(), accountProperties.getCustomModelLimit());

Kimenet

The account has 12 custom models, and we can have at most 250 custom models

Az erőforrásfiókban jelenleg tárolt modellek felsorolása

A következő kódblokk felsorolja a fiók aktuális modelljeit, és megjeleníti azok részleteit a konzolon.

// Next, we get a paged list of all of our custom models
PagedIterable<CustomFormModelInfo> customModels = trainingClient.listCustomModels();
System.out.println("We have following models in the account:");
customModels.forEach(customFormModelInfo -> {
    System.out.printf("Model Id: %s%n", customFormModelInfo.getModelId());
    // get custom model info
    modelId.set(customFormModelInfo.getModelId());
    CustomFormModel customModel = trainingClient.getCustomModel(customFormModelInfo.getModelId());
    System.out.printf("Model Id: %s%n", customModel.getModelId());
    System.out.printf("Model Status: %s%n", customModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n", customModel.getTrainingCompletedOn());
    customModel.getSubmodels().forEach(customFormSubmodel -> {
        System.out.printf("Custom Model Form type: %s%n", customFormSubmodel.getFormType());
        System.out.printf("Custom Model Accuracy: %.2f%n", customFormSubmodel.getAccuracy());
        if (customFormSubmodel.getFields() != null) {
            customFormSubmodel.getFields().forEach((fieldText, customFormModelField) -> {
                System.out.printf("Field Text: %s%n", fieldText);
                System.out.printf("Field Accuracy: %.2f%n", customFormModelField.getAccuracy());
            });
        }
    });
});

Kimenet

Ez a válasz le lett csonkolva az olvashatóság érdekében.

We have following models in the account:
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Status: ready
Training started on: 2020-06-04T18:33:08Z
Training completed on: 2020-06-04T18:33:10Z
Custom Model Form type: form-0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Custom Model Accuracy: 1.00
Field Text: invoice date
Field Accuracy: 1.00
Field Text: invoice number
Field Accuracy: 1.00
...

Modell törlése az erőforrásfiókból

A modell a fiókjából is törölhető, ha az azonosítójára hivatkozik.

    // Delete Custom Model
    System.out.printf("Deleted model with model Id: %s, operation completed with status: %s%n", modelId.get(),
            trainingClient.deleteModelWithResponse(modelId.get(), Context.NONE).getStatusCode());
}

Az alkalmazás futtatása

Lépjen vissza a projekt fő könyvtárába. Ezután készítse el az alkalmazást a következő paranccsal:

gradle build

Futtassa az alkalmazást a következő run céllal:

gradle run

Az erőforrások eltávolítása

Ha törölni vagy eltávolítani szeretne egy Cognitive Services előfizetést, törölheti az erőforrást vagy erőforráscsoportot. Az erőforráscsoport törlésével a hozzá társított összes többi erőforrást is törli.

Hibaelhárítás

A Recognizer-ügyfelek ErrorResponseException kivételeket képeznek. Ha például érvénytelen fájlforrás URL-címet próbál meg adni, a hibát jelző hibaüzenet ErrorResponseException jelenik meg. Az alábbi kódrészletben a hibát a rendszer elegánsan kezeli a kivétel elfogása és a hibával kapcsolatos további információk megjelenítése által.

try {
    formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl");
} catch (ErrorResponseException e) {
    System.out.println(e.getMessage());
}

Ügyfélnaplózás engedélyezése

A Javához való Azure SDK-k konzisztens naplózási történetet kínálnak, amely segít az alkalmazáshibák elhárításában és a megoldásuk felgyorsításában. Az előállított naplók rögzítik az alkalmazás áramlását, mielőtt elérnék a terminál állapotát, hogy segítsenek a probléma gyökerének megtalálásában. A naplózás engedélyezésével kapcsolatos útmutatásért tekintse meg a naplózási wikit.

Következő lépések

Ebben a rövid útmutatóban a Form Recognizer Java ügyféloldali kódtárat használta modellek betanítása és űrlapok különböző módon való elemzéséhez. Ezután megtudhatja, hogyan hozhat létre egy jobb betanítású adatkészletet, és készíthet pontosabb modelleket.

Fontos

  • Ez a rövid útmutató az SDK 3.1.1-es verzióját használja, és a 2.1-es API-verziót célozza meg.

  • A cikkben olvasható kód az egyszerűség kedvéért szinkron metódusokat és nem biztonságos hitelesítőadat-tárolót használ. Tekintse meg az alábbi referenciadokumentációt.

Referenciadokumentáció | Kódtár forráskódja | Csomag (npm) | Minták

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • ANode.js
  • Egy Azure Storage blobot tartalmaz, amely betanításadatok egy halmazát tartalmazza. A betanítás adatkészletének összeállítására vonatkozó tippekért és lehetőségekért tekintse meg a betanítás adatkészletének összeállítása egyéni modellhez való összeállítását. Ebben a rövid útmutatóban a mintaadatkészlet Train (Betanítás) mappájában található fájlokat használhatja (töltse le és bontsa ki a sample_data.zip).
  • Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy Form Recognizer-erőforrást, Form Recognizer erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után válassza az Erőforráshoz ugrás lehetőséget.
    • Szüksége lesz a létrehozott erőforrás kulcsra és végpontra ahhoz, hogy az alkalmazást a Form Recognizer API-hoz. A kulcsot és a végpontot a rövid útmutató későbbi, alábbi kódába fogja beilleszteni.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szolgáltatási szintre éles F0 környezetben.

Beállítása

Új Node.js-alkalmazás létrehozása

Egy konzolablakban (például cmd, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, és keresse meg.

mkdir myapp && cd myapp

Az parancs npm init futtatásával hozzon létre egy node-alkalmazást egy package.json fájllal.

npm init

Az ügyféloldali kódtár telepítése

Telepítse az ai-form-recognizer NPM-csomagot:

npm install @azure/ai-form-recognizer

Az alkalmazás package.json fájlja frissül a függőségekkel.

Hozzon létre egy nevű index.js fájlt, nyissa meg, és importálja a következő kódtárakat:

const { FormRecognizerClient, FormTrainingClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
const fs = require("fs");

Hozzon létre változókat az erőforrás Azure-végpontja és kulcsa számára.

const apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

Fontos

Nyissa meg az Azure Portalt. Ha az Form Recognizer szakaszban létrehozott erőforrás sikeresen üzembe lett stb., kattintson a Következő lépések területen található Erőforrás ugrás gombra. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor végzett, és soha ne tegye közzé nyilvánosan. Éles környezetben használjon biztonságos módszereket a hitelesítő adatok tárolására és elérésére. További információt Cognitive Services biztonsági cikk tartalmaz.

Objektummodell

A Form Recognizer két különböző ügyféltípust hozhat létre. Az első az FormRecognizerClient űrlap felismert mezőinek és tartalmának lekérdezésére használható. A második az FormTrainingClient egyéni modellek létrehozására és kezelésére használható a felismerés javítása érdekében.

FormRecognizerClient

FormRecognizerClient A a következő műveleteket biztosítja:

  • Űrlapmezők és tartalmak felismerése az egyéni űrlapok elemzéséhez betanított egyéni modellekkel. Ezeket az értékeket objektumgyűjtemények ják RecognizedForm vissza.
  • Űrlaptartalmak, köztük táblák, sorok és szavak felismerése modell betanítása nélkül. Az űrlap tartalma objektumgyűjteményben lesz FormPage visszaadva.
  • A közös mezők felismerése az USA-nyugtákból, névjegykártyákból, számlákból és azonosító dokumentumokból egy előre betanított modellel a Form Recognizer szolgáltatásban.

FormTrainingClient

FormTrainingClient A a következő műveleteket biztosítja:

  • Egyéni modellek betanítása az egyéni űrlapokon található összes mező és érték elemzéséhez. A visszaadott érték jelzi a modell által elemzett űrlaptípusokat és az egyes űrlaptípusokhoz CustomFormModel kinyert mezőket. További részletekért tekintse meg a szolgáltatás címkézetlen modellbeképező dokumentációját.
  • Egyéni modellek betanítása az egyéni űrlapok címkézése által megadott mezők és értékek elemzéséhez. A visszaadott érték jelzi a modell által kinyert mezőket, valamint az egyes mezők becsült CustomFormModel pontosságát. A címkék betanítás adatkészletre való alkalmazásának részletesebb magyarázatát a címkézett modell betanítása szolgáltatásdokumentációban találhatja meg.
  • A fiókjában létrehozott modellek kezelése.
  • Egyéni modell másolása egyik erőforrásból Form Recognizer másikba.

Megjegyzés

A modellek grafikus felhasználói felülettel, például a Form Recognizer eszközzel is betaníthatóak.

Az ügyfél hitelesítése

Hitelesítsen egy ügyfélobjektumot a megadott előfizetési változók használatával. Egy objektumot fog használni, így ha szükséges, új ügyfélobjektumok létrehozása nélkül frissítheti az AzureKeyCredential API-kulcsot. Létre fog hozni egy betanítás ügyfélobjektumot is.

const trainingClient = new FormTrainingClient(endpoint, new AzureKeyCredential(apiKey));
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(apiKey));

Eszközök lekérte a teszteléshez

A betanítás és a tesztelési adatok URL-címére mutató hivatkozásokat is hozzá kell adni.

    • Az egyéni modell betanítási adatainak SAS URL-címének lekéréséhez a tárerőforrást a Azure Portal válassza a Storage Explorer fület. Navigáljon a tárolóhoz, kattintson a jobb gombbal, és válassza a Közös hozzáférésű jogosultság jogosultsága begyűjtése lehetőséget. Fontos, hogy a tároló SAS-ét szerezze be, ne magát a tárfiókot. Győződjön meg arról, hogy az Olvasás, Írás, Törlés és Lista engedély be van jelölve, majd kattintson a Létrehozás gombra. Ezután másolja az URL szakaszban található értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

    SAS URL-lekérés

  • Használja az alábbi mintákban található (szintén a GitHub-benis elérhető) mintaképeit és nyugtaképeit, vagy a fenti lépésekkel lekérhetők egy adott dokumentum SAS URL-címei a Blob Storage-ban.

Elrendezés elemzése

A modell betanítása Form Recognizer nélkül elemezheti a táblákat, sorokat és szavakat a dokumentumokban. Az elrendezéskinyerésről az Elrendezés fogalmi útmutatóban található további információ. Egy adott URI-fájl tartalmának elemzéséhez használja a beginRecognizeContentFromUrl metódust.

async function recognizeContent() {
    const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
    const poller = await client.beginRecognizeContentFromUrl(formUrl);
    const pages = await poller.pollUntilDone();

    if (!pages || pages.length === 0) {
        throw new Error("Expecting non-empty list of pages!");
    }

    for (const page of pages) {
        console.log(
            `Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
        );
        for (const table of page.tables) {
            for (const cell of table.cells) {
                console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
            }
        }
    }
}

recognizeContent().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Tipp

FormRecognizerClient metódusokkal is lekért tartalom egy helyi fájlból, például: beginRecognizeContent.

Kimenet

Page 1: width 8.5 and height 11 with unit inch
cell [0,0] has text Invoice Number
cell [0,1] has text Invoice Date
cell [0,2] has text Invoice Due Date
cell [0,3] has text Charges
cell [0,5] has text VAT ID
cell [1,0] has text 34278587
cell [1,1] has text 6/18/2017
cell [1,2] has text 6/24/2017
cell [1,3] has text $56,651.49
cell [1,5] has text PT

Nyugták elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki közös mezőket az USA-nyugtákból egy előre betanított nyugtamodell használatával. A nyugták elemzésével kapcsolatos további információkért lásd a nyugták fogalmi útmutatóját.

Az URI-ból származó nyugták elemzéséhez használja a beginRecognizeReceiptsFromUrl metódust. Az alábbi kód feldolgoz egy nyugtát az adott URI-ban, és kiírja a fő mezőket és értékeket a konzolra.

async function recognizeReceipt() {
    receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png";
    const poller = await client.beginRecognizeReceiptsFromUrl(receiptUrl, {
        onProgress: (state) => { console.log(`status: ${state.status}`); }
    });

    const receipts = await poller.pollUntilDone();

    if (!receipts || receipts.length <= 0) {
        throw new Error("Expecting at lease one receipt in analysis result");
    }

    const receipt = receipts[0];
    console.log("First receipt:");
    const receiptTypeField = receipt.fields["ReceiptType"];
    if (receiptTypeField.valueType === "string") {
        console.log(`  Receipt Type: '${receiptTypeField.value || "<missing>"}', with confidence of ${receiptTypeField.confidence}`);
    }
    const merchantNameField = receipt.fields["MerchantName"];
    if (merchantNameField.valueType === "string") {
        console.log(`  Merchant Name: '${merchantNameField.value || "<missing>"}', with confidence of ${merchantNameField.confidence}`);
    }
    const transactionDate = receipt.fields["TransactionDate"];
    if (transactionDate.valueType === "date") {
        console.log(`  Transaction Date: '${transactionDate.value || "<missing>"}', with confidence of ${transactionDate.confidence}`);
    }
    const itemsField = receipt.fields["Items"];
    if (itemsField.valueType === "array") {
        for (const itemField of itemsField.value || []) {
            if (itemField.valueType === "object") {
                const itemNameField = itemField.value["Name"];
                if (itemNameField.valueType === "string") {
                    console.log(`    Item Name: '${itemNameField.value || "<missing>"}', with confidence of ${itemNameField.confidence}`);
                }
            }
        }
    }
    const totalField = receipt.fields["Total"];
    if (totalField.valueType === "number") {
        console.log(`  Total: '${totalField.value || "<missing>"}', with confidence of ${totalField.confidence}`);
    }
}

recognizeReceipt().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Tipp

A helyi nyugták képeit a FormRecognizerClient metódusokkal is elemezheti, például a beginRecognizeReceipts metódussal.

Kimenet

status: notStarted
status: running
status: succeeded
First receipt:
  Receipt Type: 'Itemized', with confidence of 0.659
  Merchant Name: 'Contoso Contoso', with confidence of 0.516
  Transaction Date: 'Sun Jun 09 2019 17:00:00 GMT-0700 (Pacific Daylight Time)', with confidence of 0.985
    Item Name: '8GB RAM (Black)', with confidence of 0.916
    Item Name: 'SurfacePen', with confidence of 0.858
  Total: '1203.39', with confidence of 0.774

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki általános mezőket angol nyelvű névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért lásd a névjegykártyák fogalmi útmutatóját.

A névjegykártyák URL-címből való elemzéséhez használja a beginRecognizeBusinessCardsFromURL metódust.

async function recognizeBusinessCards() {
    bcUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/businessCard.png";
    const poller = await client.beginRecognizeBusinessCardsFromUrl(bcUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [businessCard] = await poller.pollUntilDone();

    if (businessCard === undefined) {
        throw new Error("Failed to extract data from at least one business card.");
    }

    const contactNames = businessCard.fields["ContactNames"].value;
    if (Array.isArray(contactNames)) {
        console.log("- Contact Names:");
        for (const contactName of contactNames) {
            if (contactName.valueType === "object") {
                const firstName = contactName.value?.["FirstName"].value ?? "<no first name>";
                const lastName = contactName.value?.["LastName"].value ?? "<no last name>";
                console.log(`  - ${firstName} ${lastName} (${contactName.confidence} confidence)`);
            }
        }
    }

    printSimpleArrayField(businessCard, "CompanyNames");
    printSimpleArrayField(businessCard, "Departments");
    printSimpleArrayField(businessCard, "JobTitles");
    printSimpleArrayField(businessCard, "Emails");
    printSimpleArrayField(businessCard, "Websites");
    printSimpleArrayField(businessCard, "Addresses");
    printSimpleArrayField(businessCard, "MobilePhones");
    printSimpleArrayField(businessCard, "Faxes");
    printSimpleArrayField(businessCard, "WorkPhones");
    printSimpleArrayField(businessCard, "OtherPhones");
}

// Helper function to print array field values. 
function printSimpleArrayField(businessCard, fieldName) {
    const fieldValues = businessCard.fields[fieldName]?.value;
    if (Array.isArray(fieldValues)) {
        console.log(`- ${fieldName}:`);
        for (const item of fieldValues) {
            console.log(`  - ${item.value ?? "<no value>"} (${item.confidence} confidence)`);
        }
    } else if (fieldValues === undefined) {
        console.log(`No ${fieldName} were found in the document.`);
    } else {
        console.error(
            `Error: expected field "${fieldName}" to be an Array, but it was a(n) ${businessCard.fields[fieldName].valueType}`
        );
    }
}

recognizeBusinessCards().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Tipp

A helyi névjegykártya-rendszerképeket a FormRecognizerClient metódusokkal is elemezheti, például a beginRecognizeBusinessCards metódussal.

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért lásd a számla fogalmi útmutatóját.

A számlák URL-címről való elemzéséhez használja a beginRecognizeInvoicesFromUrl metódust.

async function recognizeInvoices() {
    invoiceUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/invoice_sample.jpg";

    const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [invoice] = await poller.pollUntilDone();
    if (invoice === undefined) {
        throw new Error("Failed to extract data from at least one invoice.");
    }

    // Helper function to print fields.
    function fieldToString(field) {
        const {
            name,
            valueType,
            value,
            confidence
        } = field;
        return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
    }

    console.log("Invoice fields:");

    for (const [name, field] of Object.entries(invoice.fields)) {
        if (field.valueType !== "array" && field.valueType !== "object") {
            console.log(`- ${name} ${fieldToString(field)}`);
        }
    }

    let idx = 0;

    console.log("- Items:");

    const items = invoice.fields["Items"]?.value;
    for (const item of items ?? []) {
        const value = item.value;

        const subFields = [
            "Description",
            "Quantity",
            "Unit",
            "UnitPrice",
            "ProductCode",
            "Date",
            "Tax",
            "Amount"
        ]
            .map((fieldName) => value[fieldName])
            .filter((field) => field !== undefined);

        console.log(
            [
                `  - Item #${idx}`,
                // Now we will convert those fields into strings to display
                ...subFields.map((field) => `    - ${fieldToString(field)}`)
            ].join("\n")
        );
    }
}

recognizeInvoices().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Tipp

A helyi nyugták képeit a FormRecognizerClient metódusokkal is elemezheti, például a beginRecognizeInvoices metódussal.

Azonosítódokumentumok elemzése

Ez a szakasz azt mutatja be, hogyan elemezheti és vonhat ki kulcsinformációkat a kormányzati jogú azonosítási dokumentumokból ( globális útlevelek és az Egyesült Államok sofőrlicencei) az Form Recognizer előre összeállított azonosító modell használatával. Az azonosító dokumentumok elemzésével kapcsolatos további információkért tekintse meg az előre összeállított azonosítási modell fogalmi útmutatóját.

Az URL-címből származó azonosító dokumentumok elemzéséhez használja a beginRecognizeIdDocumentsFromUrl metódust.

async function recognizeIdDocuments() {
    idUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/id-license.jpg";
    const poller = await client.beginRecognizeIdDocumentsFromUrl(idUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [idDocument] = await poller.pollUntilDone();

    if (idDocument === undefined) {
        throw new Error("Failed to extract data from at least one identity document.");
    }

    console.log("Document Type:", idDocument.formType);

    console.log("Identity Document Fields:");

    function printField(fieldName) {
        // Fields are extracted from the `fields` property of the document result
        const field = idDocument.fields[fieldName];
        console.log(
            `- ${fieldName} (${field?.valueType}): '${field?.value ?? "<missing>"}', with confidence ${field?.confidence
            }`
        );
    }

    printField("FirstName");
    printField("LastName");
    printField("DocumentNumber");
    printField("DateOfBirth");
    printField("DateOfExpiration");
    printField("Sex");
    printField("Address");
    printField("Country");
    printField("Region");
}

recognizeIdDocuments().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan betanítható egy modell a saját adataival. A betanított modell olyan strukturált adatokat képes kihozni, amelyek tartalmazzák az eredeti űrlapdokumentumban található kulcs/érték kapcsolatokat. A modell betanítása után tesztelheti és újra betaníthatja azt, és végül arra használhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapból.

Megjegyzés

Modelleket grafikus felhasználói felülettel (GUI) is betaníthat, mint például a Form Recognizer eszköz.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez a betanítás dokumentumainak manuális címkézése nélkül.

Az alábbi függvény egy adott dokumentumkészleten található modellt saját maga készít be, és a modell állapotát a konzolon nyomtatja ki.

async function trainModel() {

    const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";

    const poller = await trainingClient.beginTraining(containerSasUrl, false, {
        onProgress: (state) => { console.log(`training status: ${state.status}`); }
    });
    const model = await poller.pollUntilDone();

    if (!model) {
        throw new Error("Expecting valid training result!");
    }

    console.log(`Model ID: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log(`Training started on: ${model.trainingStartedOn}`);
    console.log(`Training completed on: ${model.trainingCompletedOn}`);

    if (model.submodels) {
        for (const submodel of model.submodels) {
            // since the training data is unlabeled, we are unable to return the accuracy of this model
            console.log("We have recognized the following fields");
            for (const key in submodel.fields) {
                const field = submodel.fields[key];
                console.log(`The model found field '${field.name}'`);
            }
        }
    }
    // Training document information
    if (model.trainingDocuments) {
        for (const doc of model.trainingDocuments) {
            console.log(`Document name: ${doc.name}`);
            console.log(`Document status: ${doc.status}`);
            console.log(`Document page count: ${doc.pageCount}`);
            console.log(`Document errors: ${doc.errors}`);
        }
    }
}

trainModel().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Kimenet

Ez a JavaScript SDK-ból elérhető betanításadatokkal betanított modell kimenete. Ez a mintakimenet csonkolva lett az olvashatóság érdekében.

training status: creating
training status: ready
Model ID: 9d893595-1690-4cf2-a4b1-fbac0fb11909
Status: ready
Training started on: Thu Aug 20 2020 20:27:26 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:27:37 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'field-0'
The model found field 'field-1'
The model found field 'field-2'
The model found field 'field-3'
The model found field 'field-4'
The model found field 'field-5'
The model found field 'field-6'
The model found field 'field-7'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors:
...

Modell betanítása címkékkel

Egyéni modelleket is betaníthat a betanítás dokumentumainak manuális címkézése által. A címkékkel való betanítás bizonyos helyzetekben jobb teljesítményt eredményez. A címkékkel való betanításhoz speciális címkeinformációs fájlokra () van szükség a Blob Storage-tárolóban a \<filename\>.pdf.labels.json betanítás dokumentumai mellett. A Form Recognizer mintacímkéző eszköz felhasználói felülettel segít létrehozni ezeket a címkefájlokat. Ha már megvan, a metódust a paraméter beginTraining értékével uselabels hívhatja true meg.

async function trainModelLabels() {

    const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";

    const poller = await trainingClient.beginTraining(containerSasUrl, true, {
        onProgress: (state) => { console.log(`training status: ${state.status}`); }
    });
    const model = await poller.pollUntilDone();

    if (!model) {
        throw new Error("Expecting valid training result!");
    }

    console.log(`Model ID: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log(`Training started on: ${model.trainingStartedOn}`);
    console.log(`Training completed on: ${model.trainingCompletedOn}`);

    if (model.submodels) {
        for (const submodel of model.submodels) {
            // since the training data is unlabeled, we are unable to return the accuracy of this model
            console.log("We have recognized the following fields");
            for (const key in submodel.fields) {
                const field = submodel.fields[key];
                console.log(`The model found field '${field.name}'`);
            }
        }
    }
    // Training document information
    if (model.trainingDocuments) {
        for (const doc of model.trainingDocuments) {
            console.log(`Document name: ${doc.name}`);
            console.log(`Document status: ${doc.status}`);
            console.log(`Document page count: ${doc.pageCount}`);
            console.log(`Document errors: ${doc.errors}`);
        }
    }
}

trainModelLabels().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Kimenet

Ez a JavaScript SDK-ból elérhető betanításadatokkal betanított modell kimenete. Ez a mintakimenet csonkolva lett az olvashatóság érdekében.

training status: creating
training status: ready
Model ID: 789b1b37-4cc3-4e36-8665-9dde68618072
Status: ready
Training started on: Thu Aug 20 2020 20:30:37 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:30:43 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'CompanyAddress'
The model found field 'CompanyName'
The model found field 'CompanyPhoneNumber'
The model found field 'DatedAs'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
...

Űrlapok elemzése egyéni modellel

Ez a szakasz azt mutatja be, hogyan lehet kulcs/érték információkat és egyéb tartalmakat kinyerni az egyéni űrlaptípusokból a saját űrlapokkal betanított modellek használatával.

Fontos

Ennek a forgatókönyvnek a megvalósításához már betanított egy modellt, hogy az azonosítóját az alábbi metódusnak adja át. Lásd a Modell betanítás szakaszát.

A metódust fogja beginRecognizeCustomFormsFromUrl használni. A visszaadott érték objektumok gyűjteménye: egy az elküldött dokumentum minden RecognizedForm oldalához.

async function recognizeCustom() {
    // Model ID from when you trained your model.
    const modelId = "<modelId>";
    const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";

    const poller = await client.beginRecognizeCustomForms(modelId, formUrl, {
        onProgress: (state) => { console.log(`status: ${state.status}`); }
    });
    const forms = await poller.pollUntilDone();

    console.log("Forms:");
    for (const form of forms || []) {
        console.log(`${form.formType}, page range: ${form.pageRange}`);
        console.log("Pages:");
        for (const page of form.pages || []) {
            console.log(`Page number: ${page.pageNumber}`);
            console.log("Tables");
            for (const table of page.tables || []) {
                for (const cell of table.cells) {
                    console.log(`cell (${cell.rowIndex},${cell.columnIndex}) ${cell.text}`);
                }
            }
        }

        console.log("Fields:");
        for (const fieldName in form.fields) {
            // each field is of type FormField
            const field = form.fields[fieldName];
            console.log(
                `Field ${fieldName} has value '${field.value}' with a confidence score of ${field.confidence}`
            );
        }
    }
}

recognizeCustom().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Tipp

A helyi fájlokat a FormRecognizerClient metódusokkal is elemezheti, például a beginRecognizeCustomForms metódussal.

Kimenet

status: notStarted
status: succeeded
Forms:
custom:form, page range: [object Object]
Pages:
Page number: 1
Tables
cell (0,0) Invoice Number
cell (0,1) Invoice Date
cell (0,2) Invoice Due Date
cell (0,3) Charges
cell (0,5) VAT ID
cell (1,0) 34278587
cell (1,1) 6/18/2017
cell (1,2) 6/24/2017
cell (1,3) $56,651.49
cell (1,5) PT
Fields:
Field Merchant has value 'Invoice For:' with a confidence score of 0.116
Field CompanyPhoneNumber has value '$56,651.49' with a confidence score of 0.249
Field VendorName has value 'Charges' with a confidence score of 0.145
Field CompanyAddress has value '1 Redmond way Suite 6000 Redmond, WA' with a confidence score of 0.258
Field CompanyName has value 'PT' with a confidence score of 0.245
Field Website has value '99243' with a confidence score of 0.114
Field DatedAs has value 'undefined' with a confidence score of undefined
Field Email has value 'undefined' with a confidence score of undefined
Field PhoneNumber has value 'undefined' with a confidence score of undefined
Field PurchaseOrderNumber has value 'undefined' with a confidence score of undefined
Field Quantity has value 'undefined' with a confidence score of undefined
Field Signature has value 'undefined' with a confidence score of undefined
Field Subtotal has value 'undefined' with a confidence score of undefined
Field Tax has value 'undefined' with a confidence score of undefined
Field Total has value 'undefined' with a confidence score of undefined

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket. Az alábbi kód az összes modellkezelési feladatot egyetlen függvényben, példaként használja.

Modellek számának lekért száma

Az alábbi kódblokk a fiókban jelenleg található modellek számát tartalmazza.

async function countModels() {
    // First, we see how many custom models we have, and what our limit is
    const accountProperties = await trainingClient.getAccountProperties();
    console.log(
        `Our account has ${accountProperties.customModelCount} custom models, and we can have at most ${accountProperties.customModelLimit} custom models`
    );
}
countModels().catch((err) => {
    console.error("The sample encountered an error:", err);
});

A fiókban található modellek listájának lekért listája

A következő kódblokk a fiókban elérhető modellek teljes listáját tartalmazza, beleértve a modell létrehozási dátumával és aktuális állapotával kapcsolatos információkat.

async function listModels() {

    // returns an async iteratable iterator that supports paging
    const result = trainingClient.listCustomModels();
    let i = 0;
    for await (const modelInfo of result) {
        console.log(`model ${i++}:`);
        console.log(modelInfo);
    }
}

listModels().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Kimenet

model 0:
{
  modelId: '453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e',
  status: 'invalid',
  trainingStartedOn: 2020-08-20T22:28:52.000Z,
  trainingCompletedOn: 2020-08-20T22:28:53.000Z
}
model 1:
{
  modelId: '628739de-779c-473d-8214-d35c72d3d4f7',
  status: 'ready',
  trainingStartedOn: 2020-08-20T23:16:51.000Z,
  trainingCompletedOn: 2020-08-20T23:16:59.000Z
}
model 2:
{
  modelId: '789b1b37-4cc3-4e36-8665-9dde68618072',
  status: 'ready',
  trainingStartedOn: 2020-08-21T03:30:37.000Z,
  trainingCompletedOn: 2020-08-21T03:30:43.000Z
}
model 3:
{
  modelId: '9d893595-1690-4cf2-a4b1-fbac0fb11909',
  status: 'ready',
  trainingStartedOn: 2020-08-21T03:27:26.000Z,
  trainingCompletedOn: 2020-08-21T03:27:37.000Z
}

Modell-adattitkok lapról lapra lekért listája

Ez a kódblokk a modellek és a modell-adattitkok lapszámozott listáját tartalmazza.

async function listModelsByPage() {
    // using `byPage()`
    i = 1;
    for await (const response of trainingClient.listCustomModels().byPage()) {
        for (const modelInfo of response.modelList) {
            console.log(`model ${i++}: ${modelInfo.modelId}`);
        }
    }
}
listModelsByPage().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Kimenet

model 1: 453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
model 2: 628739de-779c-473d-8214-d35c72d3d4f7
model 3: 789b1b37-4cc3-4e36-8665-9dde68618072

Modell lekérte azonosító alapján

Az alábbi függvény egy modellazonosítót vesz fel, és lekérte az egyező modellobjektumot. Ezt a függvényt a rendszer alapértelmezés szerint nem hívja meg.

async function getModel(modelId) {
    // Now we'll get the first custom model in the paged list
    const model = await client.getCustomModel(modelId);
    console.log("--- First Custom Model ---");
    console.log(`Model Id: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log("Documents used in training:");
    for (const doc of model.trainingDocuments || []) {
        console.log(`- ${doc.name}`);
    }
}

Modell törlése az erőforrásfiókból

Az azonosítójára való hivatkozás segítségével törölheti is a modellt a fiókjából. Ez a függvény törli a modellt a megadott azonosítóval. Ezt a függvényt a rendszer alapértelmezés szerint nem hívja meg.

async function deleteModel(modelId) {
    await client.deleteModel(modelId);
    try {
        const deleted = await client.getCustomModel(modelId);
        console.log(deleted);
    } catch (err) {
        // Expected
        console.log(`Model with id ${modelId} has been deleted`);
    }
}

Kimenet

Model with id 789b1b37-4cc3-4e36-8665-9dde68618072 has been deleted

Az alkalmazás futtatása

Futtassa az alkalmazást az node paranccsal a gyorsindítási fájlban.

node index.js

Az erőforrások eltávolítása

Ha törölni vagy eltávolítani szeretne egy Cognitive Services előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlésével a hozzá társított összes többi erőforrást is törli.

Hibaelhárítás

Naplók engedélyezése

A következő környezeti változóval láthatja a hibakeresési naplókat a kódtár használata során.

export DEBUG=azure*

A naplók engedélyezésére vonatkozó részletes útmutatásért tekintse meg a @azure/logger csomagokat.

Következő lépések

Ebben a rövid útmutatóban a Form Recognizer JavaScript ügyféloldali kódtár használatával betanított modelleket és különböző módokon elemezte az űrlapokat. Ezután tippeket tanulhat egy jobb betanítású adatkészlet létrehozásához és pontosabb modellek létrehozásához.

Lásd még

Fontos

  • Ez a rövid útmutató az SDK 3.1.1-es verzióját használja, és a 2.1-es API-verziót célozza meg.

  • A cikkben olvasható kód az egyszerűség kedvéért szinkron metódusokat és nem biztonságos hitelesítőadat-tárolót használ. Tekintse meg az alábbi referenciadokumentációt.

Referenciadokumentáció | Kódtár forráskódja | Csomag (PyPi) | Minták

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • Python 3.x
    • A Python-telepítésnek tartalmaznia kell a pip et. A parancssorban futtatva ellenőrizheti, hogy telepítve pip --version van-e a pip. A pip lekért használatához telepítse a Python legújabb verzióját.
  • Egy Azure Storage blobot tartalmaz, amely betanításadatokat tartalmaz. A betanítás adatkészletének összeállítására vonatkozó tippekért és lehetőségekért tekintse meg a betanítás adatkészletének összeállítása egyéni modellhez való összeállítását. Ebben a rövid útmutatóban a mintaadatkészlet Betanítás mappájában található fájlokat használhatja (töltse le és bontsa ki a sample_data.zip).
  • Az Azure-előfizetés létrehozása után hozzon létre egy Form Recognizer-erőforrást, Form Recognizer erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után kattintson az Erőforráshoz való ugrás gombra.
    • Szüksége lesz a létrehozott erőforrás kulcsának és végpontjának létrehozására, hogy az alkalmazást a Form Recognizer API-hoz. A rövid útmutató későbbi felében beilleszti a kulcsot és a végpontot az alábbi kódba.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szolgáltatási szintre F0 éles környezetben.

Beállítása

Az ügyféloldali kódtár telepítése

A Python telepítése után a következővel telepítheti Form Recognizer ügyféloldali kódtár legújabb verzióját:

pip install azure-ai-formrecognizer 

Új Python-alkalmazás létrehozása

Hozzon létre egy új Python-alkalmazást a kívánt szerkesztőben vagy IDE-ban. Ezután importálja a következő kódtárakat.

import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import FormRecognizerClient
from azure.ai.formrecognizer import FormTrainingClient
from azure.core.credentials import AzureKeyCredential

Tipp

Ha a rövid útmutatóban található kódmintákkal együtt a teljes fájlt meg szeretné tekinteni, a következő GitHub.

Hozzon létre változókat az erőforrás Azure-végpontja és kulcsa számára.

endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
key = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE"

Objektummodell

A Form Recognizer két különböző ügyféltípust hozhat létre. Az első a form_recognizer_client használatával lekérdezi a szolgáltatást az űrlapmezők és -tartalmak felismeréséhez. A második az form_training_client egyéni modellek létrehozására és kezelésére használható a felismerés javítása érdekében.

FormRecognizerClient

form_recognizer_client A a következő műveleteket biztosítja:

  • Űrlapmezők és tartalmak felismerése az egyéni űrlapok elemzéséhez betanított egyéni modellekkel.
  • Űrlaptartalmak, köztük táblák, vonalak és szavak felismerése modell betanítása nélkül.
  • Közös mezők felismerése nyugtákból egy előre betanított nyugtamodell használatával a Form Recognizer szolgáltatásban.

FormTrainingClient

form_training_client A a következő műveleteket biztosítja:

  • Egyéni modellek betanítása az egyéni űrlapokon található összes mező és érték elemzéséhez. A betanítási adatkészletek létrehozásának részletesebb magyarázatát a szolgáltatás címkézetlen modellek betanítási dokumentációjában találhatja meg.
  • Egyéni modellek betanítása adott mezők és értékek elemzéséhez az egyéni űrlapok címkézése segítségével. A címkék betanítás adatkészletre való alkalmazásának részletesebb magyarázatát a szolgáltatás címkézett modellek betanítása dokumentációjában találhatja meg.
  • A fiókjában létrehozott modellek kezelése.
  • Egyéni modell másolása egyik erőforrásból Form Recognizer másikba.

Megjegyzés

A modellek grafikus felhasználói felülettel is betaníthatóak, például a Form Recognizer eszköz használatával.

Az ügyfél hitelesítése

Itt két ügyfélobjektumot fog hitelesíteni a fent meghatározott előfizetési változók használatával. Egy AzureKeyCredential objektumot fog használni, így szükség esetén új ügyfélobjektumok létrehozása nélkül frissítheti az API-kulcsot.

form_recognizer_client = FormRecognizerClient(endpoint, AzureKeyCredential(key))
form_training_client = FormTrainingClient(endpoint, AzureKeyCredential(key))

Eszközök lekérte a teszteléshez

A betanítás és a tesztelési adatok URL-címére mutató hivatkozásokat kell hozzáadnia.

    • Az egyéni modell betanítási adatainak SAS URL-címének lekéréséhez a tárerőforrást a Azure Portal válassza a Storage Explorer fület. Navigáljon a tárolóhoz, kattintson a jobb gombbal, és válassza a Közös hozzáférésű jogosultság jogosultsága begyűjtése lehetőséget. Fontos, hogy a tároló SAS-ét szerezze be, ne magát a tárfiókot. Győződjön meg arról, hogy az Olvasás, Írás, Törlés és Lista engedély be van jelölve, majd kattintson a Létrehozás gombra. Ezután másolja az URL szakaszban található értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

    SAS URL-lekérés

  • Használja az alábbi mintákban szereplő mintaűrlapokat és nyugtaképeket (amelyek szintén elérhetők GitHub, vagy a fenti lépésekkel lekérhetők egy adott dokumentum SAS URL-címei a Blob Storage-ban.

Megjegyzés

Az útmutatóban a kódrészletek URL-címek által elért távoli űrlapokat használnak. Ha inkább helyi űrlapdokumentumokat szeretne feldolgozni, tekintse meg a kapcsolódó metódusokat a referenciadokumentációban és példákban.

Elrendezés elemzése

A dokumentumokkal Form Recognizer, sorokat és szavakat elemezhet a dokumentumokban anélkül, hogy modellt kellene betanítanunk. Az elrendezéskinyerésről az Elrendezés fogalmi útmutatóban található további információ.

Egy adott URL-címen található fájl tartalmának elemzéséhez használja a begin_recognize_content_from_url metódust. A visszaadott érték objektumok gyűjteménye: egy az elküldött dokumentum minden FormPage oldalához. A következő kód végigveszi ezeket az objektumokat, és kinyomtatja a kinyert kulcs/érték párokat és táblaadatokat.

formUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/forms/Form_1.jpg"

poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
page = poller.result()

table = page[0].tables[0] # page 1, table 1
print("Table found on page {}:".format(table.page_number))
for cell in table.cells:
    print("Cell text: {}".format(cell.text))
    print("Location: {}".format(cell.bounding_box))
    print("Confidence score: {}\n".format(cell.confidence))

Tipp

A FormRecognizerClient metódusokkal is lekért tartalom helyi képekről, például: begin_recognize_content .

Kimenet

Table found on page 1:
Cell text: Invoice Number
Location: [Point(x=0.5075, y=2.8088), Point(x=1.9061, y=2.8088), Point(x=1.9061, y=3.3219), Point(x=0.5075, y=3.3219)]
Confidence score: 1.0

Cell text: Invoice Date
Location: [Point(x=1.9061, y=2.8088), Point(x=3.3074, y=2.8088), Point(x=3.3074, y=3.3219), Point(x=1.9061, y=3.3219)]
Confidence score: 1.0

Cell text: Invoice Due Date
Location: [Point(x=3.3074, y=2.8088), Point(x=4.7074, y=2.8088), Point(x=4.7074, y=3.3219), Point(x=3.3074, y=3.3219)]
Confidence score: 1.0

Cell text: Charges
Location: [Point(x=4.7074, y=2.8088), Point(x=5.386, y=2.8088), Point(x=5.386, y=3.3219), Point(x=4.7074, y=3.3219)]
Confidence score: 1.0
...

Nyugták elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki közös mezőket az USA-nak megfelelő nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért lásd a nyugták fogalmi útmutatóját. Az URL-címről származó nyugták elemzéséhez használja a begin_recognize_receipts_from_url metódust.

receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"

poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl)
result = poller.result()

for receipt in result:
    for name, field in receipt.fields.items():
        if name == "Items":
            print("Receipt Items:")
            for idx, items in enumerate(field.value):
                print("...Item #{}".format(idx + 1))
                for item_name, item in items.value.items():
                    print("......{}: {} has confidence {}".format(item_name, item.value, item.confidence))
        else:
            print("{}: {} has confidence {}".format(name, field.value, field.confidence))

Tipp

A helyi nyugták képeit a FormRecognizerClient metódusokkal is elemezheti, begin_recognize_receipts például: .

Kimenet

ReceiptType: Itemized has confidence 0.659
MerchantName: Contoso Contoso has confidence 0.516
MerchantAddress: 123 Main Street Redmond, WA 98052 has confidence 0.986
MerchantPhoneNumber: None has confidence 0.99
TransactionDate: 2019-06-10 has confidence 0.985
TransactionTime: 13:59:00 has confidence 0.968
Receipt Items:
...Item #1
......Name: 8GB RAM (Black) has confidence 0.916
......TotalPrice: 999.0 has confidence 0.559
...Item #2
......Quantity: None has confidence 0.858
......Name: SurfacePen has confidence 0.858
......TotalPrice: 99.99 has confidence 0.386
Subtotal: 1098.99 has confidence 0.964
Tax: 104.4 has confidence 0.713
Total: 1203.39 has confidence 0.774

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki gyakori mezőket angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért lásd a névjegykártyák fogalmi útmutatóját.

A névjegykártyák URL-címből való elemzéséhez használja a begin_recognize_business_cards_from_url metódust.

bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg"

poller = form_recognizer_client.begin_recognize_business_cards_from_url(bcUrl)
business_cards = poller.result()

for idx, business_card in enumerate(business_cards):
    print("--------Recognizing business card #{}--------".format(idx+1))
    contact_names = business_card.fields.get("ContactNames")
    if contact_names:
        for contact_name in contact_names.value:
            print("Contact First Name: {} has confidence: {}".format(
                contact_name.value["FirstName"].value, contact_name.value["FirstName"].confidence
            ))
            print("Contact Last Name: {} has confidence: {}".format(
                contact_name.value["LastName"].value, contact_name.value["LastName"].confidence
            ))
    company_names = business_card.fields.get("CompanyNames")
    if company_names:
        for company_name in company_names.value:
            print("Company Name: {} has confidence: {}".format(company_name.value, company_name.confidence))
    departments = business_card.fields.get("Departments")
    if departments:
        for department in departments.value:
            print("Department: {} has confidence: {}".format(department.value, department.confidence))
    job_titles = business_card.fields.get("JobTitles")
    if job_titles:
        for job_title in job_titles.value:
            print("Job Title: {} has confidence: {}".format(job_title.value, job_title.confidence))
    emails = business_card.fields.get("Emails")
    if emails:
        for email in emails.value:
            print("Email: {} has confidence: {}".format(email.value, email.confidence))
    websites = business_card.fields.get("Websites")
    if websites:
        for website in websites.value:
            print("Website: {} has confidence: {}".format(website.value, website.confidence))
    addresses = business_card.fields.get("Addresses")
    if addresses:
        for address in addresses.value:
            print("Address: {} has confidence: {}".format(address.value, address.confidence))
    mobile_phones = business_card.fields.get("MobilePhones")
    if mobile_phones:
        for phone in mobile_phones.value:
            print("Mobile phone number: {} has confidence: {}".format(phone.value, phone.confidence))
    faxes = business_card.fields.get("Faxes")
    if faxes:
        for fax in faxes.value:
            print("Fax number: {} has confidence: {}".format(fax.value, fax.confidence))
    work_phones = business_card.fields.get("WorkPhones")
    if work_phones:
        for work_phone in work_phones.value:
            print("Work phone number: {} has confidence: {}".format(work_phone.value, work_phone.confidence))
    other_phones = business_card.fields.get("OtherPhones")
    if other_phones:
        for other_phone in other_phones.value:
            print("Other phone number: {} has confidence: {}".format(other_phone.value, other_phone.confidence))

Tipp

A helyi névjegykártya-képeket a FormRecognizerClient metódusokkal is elemezheti, begin_recognize_business_cards például: .

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért lásd a számla fogalmi útmutatóját.

A számlák URL-címről való elemzéséhez használja a begin_recognize_invoices_from_url metódust.

invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png"

poller = form_recognizer_client.begin_recognize_invoices_from_url(invoiceUrl)
invoices = poller.result()

for idx, invoice in enumerate(invoices):
    print("--------Recognizing invoice #{}--------".format(idx+1))
    vendor_name = invoice.fields.get("VendorName")
    if vendor_name:
        print("Vendor Name: {} has confidence: {}".format(vendor_name.value, vendor_name.confidence))
    vendor_address = invoice.fields.get("VendorAddress")
    if vendor_address:
        print("Vendor Address: {} has confidence: {}".format(vendor_address.value, vendor_address.confidence))
    customer_name = invoice.fields.get("CustomerName")
    if customer_name:
        print("Customer Name: {} has confidence: {}".format(customer_name.value, customer_name.confidence))
    customer_address = invoice.fields.get("CustomerAddress")
    if customer_address:
        print("Customer Address: {} has confidence: {}".format(customer_address.value, customer_address.confidence))
    customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
    if customer_address_recipient:
        print("Customer Address Recipient: {} has confidence: {}".format(customer_address_recipient.value, customer_address_recipient.confidence))
    invoice_id = invoice.fields.get("InvoiceId")
    if invoice_id:
        print("Invoice Id: {} has confidence: {}".format(invoice_id.value, invoice_id.confidence))
    invoice_date = invoice.fields.get("InvoiceDate")
    if invoice_date:
        print("Invoice Date: {} has confidence: {}".format(invoice_date.value, invoice_date.confidence))
    invoice_total = invoice.fields.get("InvoiceTotal")
    if invoice_total:
        print("Invoice Total: {} has confidence: {}".format(invoice_total.value, invoice_total.confidence))
    due_date = invoice.fields.get("DueDate")
    if due_date:
        print("Due Date: {} has confidence: {}".format(due_date.value, due_date.confidence))

Tipp

A helyi számlaképeket a FormRecognizerClient metódusokkal is elemezheti, begin_recognize_invoices például: .

Azonosítódokumentumok elemzése

Ez a szakasz azt mutatja be, hogyan elemezheti és vonhat ki kulcsfontosságú információkat a kormány által kiadott azonosító dokumentumokból ( globális passportok és az Egyesült Államok sofőrlicencei) az Form Recognizer előre összeállított azonosító modell használatával. Az azonosító dokumentumelemzéssel kapcsolatos további információkért tekintse meg az előre összeállított azonosítási modell fogalmi útmutatóját.

Az URL-címből származó azonosító dokumentumok elemzéséhez használja a begin_recognize_id_documents_from_url metódust.

idURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"

for idx, id_document in enumerate(id_documents):
    print("--------Recognizing ID document #{}--------".format(idx+1))
    first_name = id_document.fields.get("FirstName")
    if first_name:
        print("First Name: {} has confidence: {}".format(first_name.value, first_name.confidence))
    last_name = id_document.fields.get("LastName")
    if last_name:
        print("Last Name: {} has confidence: {}".format(last_name.value, last_name.confidence))
    document_number = id_document.fields.get("DocumentNumber")
    if document_number:
        print("Document Number: {} has confidence: {}".format(document_number.value, document_number.confidence))
    dob = id_document.fields.get("DateOfBirth")
    if dob:
        print("Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence))
    doe = id_document.fields.get("DateOfExpiration")
    if doe:
        print("Date of Expiration: {} has confidence: {}".format(doe.value, doe.confidence))
    sex = id_document.fields.get("Sex")
    if sex:
        print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
    address = id_document.fields.get("Address")
    if address:
        print("Address: {} has confidence: {}".format(address.value, address.confidence))
    country_region = id_document.fields.get("CountryRegion")
    if country_region:
        print("Country/Region: {} has confidence: {}".format(country_region.value, country_region.confidence))
    region = id_document.fields.get("Region")
    if region:
        print("Region: {} has confidence: {}".format(region.value, region.confidence))

Tipp

Az azonosító dokumentum képeit a FormRecognizerClient metódusokkal is elemezheti, például begin_recognize_identity_documents a metódussal.

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan betanítható egy modell a saját adataival. A betanított modell olyan strukturált adatokat képes kihozni, amelyek tartalmazzák a kulcs/érték kapcsolatokat az eredeti űrlapdokumentumban. A modell betanítása után tesztelheti és újra betaníthatja, és végül arra használhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapról.

Megjegyzés

A modelleket grafikus felhasználói felülettel is betaníthatja, például a Form Recognizer eszköz használatával.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokon található összes mező és érték elemzésére a betanító dokumentumok manuális címkézése nélkül.

A következő kód a betanító ügyfelet használja a függvénnyel egy modell betanítához begin_training egy adott dokumentumkészleten. A visszaadott objektum információkat tartalmaz a modell által elemzett űrlaptípusokról és az egyes űrlaptípusokból kinyerni kívánt CustomFormModel mezőkről. A következő kódblokk ezt az információt a konzolon nyomtatja ki.

# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"

poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=False)
model = poller.result()

print("Model ID: {}".format(model.model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

Kimenet

Ez a Python SDK-ból elérhető betanításadatokkal betanított modell kimenete.

Model ID: 628739de-779c-473d-8214-d35c72d3d4f7
Status: ready
Training started on: 2020-08-20 23:16:51+00:00
Training completed on: 2020-08-20 23:16:59+00:00

Recognized fields:
The submodel with form type 'form-0' has recognized the following fields: Additional Notes:, Address:, Company Name:, Company Phone:, Dated As:, Details, Email:, Hero Limited, Name:, Phone:, Purchase Order, Purchase Order #:, Quantity, SUBTOTAL, Seattle, WA 93849 Phone:, Shipped From, Shipped To, TAX, TOTAL, Total, Unit Price, Vendor Name:, Website:
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []

Modell betanítása címkékkel

Egyéni modelleket is betaníthat a betanítás dokumentumainak manuális címkézése által. A címkékkel való betanítás bizonyos helyzetekben jobb teljesítményt eredményez. A visszaadott érték jelzi a modell által kinyerhető mezőket, valamint az egyes mezőkben található becsült CustomFormModel pontosságot. A következő kódblokk kinyomtatja ezt az információt a konzolon.

Fontos

A címkékkel való betanításhoz speciális címkeinformációs fájlokra () van szükség a Blob Storage-tárolóban a \<filename\>.pdf.labels.json betanítás dokumentumai mellett. A Form Recognizer mintacímkéző eszköz felhasználói felülettel segít létrehozni ezeket a címkefájlokat. Ha már rendelkezik velük, a függvényt úgy hívhatja meg, hogy a begin_training use_training_labels paraméter értéke true lesz.

# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"

poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=True)
model = poller.result()
trained_model_id = model.model_id

print("Model ID: {}".format(trained_model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

Kimenet

Ez a Python SDK-ból elérhető betanításadatokkal betanított modell kimenete.

Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91

Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00

Recognized fields:
The submodel with form type 'form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91' has recognized the following fields: CompanyAddress, CompanyName, CompanyPhoneNumber, DatedAs, Email, Merchant, PhoneNumber, PurchaseOrderNumber, Quantity, Signature, Subtotal, Tax, Total, VendorName, Website
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []

Űrlapok elemzése egyéni modellel

Ez a szakasz azt mutatja be, hogyan lehet kulcs/érték információkat és egyéb tartalmakat kinyerni az egyéni űrlaptípusokból a saját űrlapokkal betanított modellek használatával.

Fontos

Ennek a forgatókönyvnek a megvalósításához már betanított egy modellt, hogy az azonosítóját az alábbi metódusnak tovább tudja adni. Lásd a Modell betanítás szakaszát.

A metódust fogja begin_recognize_custom_forms_from_url használni. A visszaadott érték objektumok gyűjteménye: egy az elküldött dokumentum minden RecognizedForm oldalához. Az alábbi kód kinyomtatja az elemzési eredményeket a konzolon. Kinyomtatja az egyes felismert mezőket és a hozzájuk tartozó értékeket, valamint egy megbízhatósági pontszámot.


poller = form_recognizer_client.begin_recognize_custom_forms_from_url(
    model_id=trained_model_id, form_url=formUrl)
result = poller.result()

for recognized_form in result:
    print("Form type: {}".format(recognized_form.form_type))
    for name, field in recognized_form.fields.items():
        print("Field '{}' has label '{}' with value '{}' and a confidence score of {}".format(
            name,
            field.label_data.text if field.label_data else name,
            field.value,
            field.confidence
        ))

Tipp

Helyi képeket is elemezhet. Lásd a FormRecognizerClient metódusokat, például: begin_recognize_custom_forms . Vagy tekintse meg a helyi rendszerképeket GitHub forgatókönyveket tartalmazó mintakódot a következő oldalon: .

Kimenet

Az előző példában használt modell használatával a következő kimenetet adhatja meg.

Form type: form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Field 'Merchant' has label 'Merchant' with value 'Invoice For:' and a confidence score of 0.116
Field 'CompanyAddress' has label 'CompanyAddress' with value '1 Redmond way Suite 6000 Redmond, WA' and a confidence score of 0.258
Field 'Website' has label 'Website' with value '99243' and a confidence score of 0.114
Field 'VendorName' has label 'VendorName' with value 'Charges' and a confidence score of 0.145
Field 'CompanyPhoneNumber' has label 'CompanyPhoneNumber' with value '$56,651.49' and a confidence score of 0.249
Field 'CompanyName' has label 'CompanyName' with value 'PT' and a confidence score of 0.245
Field 'DatedAs' has label 'DatedAs' with value 'None' and a confidence score of None
Field 'Email' has label 'Email' with value 'None' and a confidence score of None
Field 'PhoneNumber' has label 'PhoneNumber' with value 'None' and a confidence score of None
Field 'PurchaseOrderNumber' has label 'PurchaseOrderNumber' with value 'None' and a confidence score of None
Field 'Quantity' has label 'Quantity' with value 'None' and a confidence score of None
Field 'Signature' has label 'Signature' with value 'None' and a confidence score of None
Field 'Subtotal' has label 'Subtotal' with value 'None' and a confidence score of None
Field 'Tax' has label 'Tax' with value 'None' and a confidence score of None
Field 'Total' has label 'Total' with value 'None' and a confidence score of None

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket.

Ellenőrizze a modellek számát a FormRecognizer erőforrásfiókban

A következő kódblokk ellenőrzi, hogy hány modellt mentett a Form Recognizer, és összehasonlítja a fiókkorlátot.

account_properties = form_training_client.get_account_properties()
print("Our account has {} custom models, and we can have at most {} custom models".format(
    account_properties.custom_model_count, account_properties.custom_model_limit
))

Kimenet

Our account has 5 custom models, and we can have at most 5000 custom models

List the models currently stored in the resource account (Az erőforrásfiókban jelenleg tárolt modellek listása)

A következő kódblokk felsorolja a fiókjában lévő aktuális modelleket, és megjeleníti azok részleteit a konzolon. Az első modellre való hivatkozást is menti.

# Next, we get a paged list of all of our custom models
custom_models = form_training_client.list_custom_models()

print("We have models with the following ids:")

# Let's pull out the first model
first_model = next(custom_models)
print(first_model.model_id)
for model in custom_models:
    print(model.model_id)

Kimenet

Ez egy mintakimenet a tesztfiókhoz.

We have models with the following ids:
453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
628739de-779c-473d-8214-d35c72d3d4f7
ae636292-0b14-4e26-81a7-a0bfcbaf7c91
b4b5df77-8538-4ffb-a996-f67158ecd305
c6309148-6b64-4fef-aea0-d39521452699

Egy adott modell lekért azonosítója a modell azonosítójával

A következő kódblokk az előző szakaszban mentett modellazonosítót használja a modell részleteinek lekéréshez.

custom_model = form_training_client.get_custom_model(model_id=trained_model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Status: {}".format(custom_model.status))
print("Training started on: {}".format(custom_model.training_started_on))
print("Training completed on: {}".format(custom_model.training_completed_on))

Kimenet

Ez az előző példában létrehozott egyéni modell mintakimenete.

Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00

Modell törlése az erőforrásfiókból

Az azonosítójára való hivatkozás segítségével törölheti is a modellt a fiókjából. Ez a kód törli az előző szakaszban használt modellt.

form_training_client.delete_model(model_id=custom_model.model_id)

try:
    form_training_client.get_custom_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
    print("Successfully deleted model with id {}".format(custom_model.model_id))

Az alkalmazás futtatása

Futtassa az alkalmazást az python paranccsal a gyorsindítási fájlban.

python quickstart-file.py

Az erőforrások eltávolítása

Ha törölni vagy eltávolítani szeretne egy Cognitive Services előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlésével a hozzá társított összes többi erőforrást is törli.

Hibaelhárítás

Általános kérdések

A Form Recognizer ügyféloldali kódtár az Azure Core-ban definiált kivételeket fogja kihozni.

Naplózás

Ez a kódtár a szabványos naplózási kódtárat használja a naplózáshoz. A HTTP-munkamenetekkel (URL-címekkel, fejlécekkel stb.) kapcsolatos alapvető információkat az INFO szinten naplózza a rendszer.

A HIBAKERESÉSi szint részletes naplózása, beleértve a kérések/válaszok szövegeit és a nem válaszoló fejléceket, engedélyezhető az ügyfélen a logging_enable kulcsszó argumentummal:

import sys
import logging
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
credential = AzureKeyCredential("PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE")

# This client will log detailed information about its HTTP sessions, at DEBUG level
form_recognizer_client = FormRecognizerClient(endpoint, credential, logging_enable=True)

A hasonlóképpen lehetővé teszi a részletes naplózást egyetlen művelethez, még akkor is, ha az ügyfél számára nincs logging_enable engedélyezve:

receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"
poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl, logging_enable=True)

REST-minták a GitHub

Következő lépések

Ebben a rövid útmutatóban az Form Recognizer Python ügyféloldali kódtárával betanított modelleket és különböző módokon elemezte az űrlapokat. Ezután tippeket tanulhat egy jobb betanítású adatkészlet létrehozásához és pontosabb modellek létrehozásához.

Megjegyzés

  • Ez a rövid útmutató az Azure Form Recognizer API 2.1-es verzióját célozza meg a cURL használatával a REST API hívások végrehajtásához.

| Form Recognizer REST API | Azure REST API-referencia |

Előfeltételek

  • a cURL telepítve van.
  • PowerShell 6.0+vagy hasonló parancssori alkalmazás.
  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • Egy Azure Storage blobot tartalmaz, amely betanító adatok egy halmazát tartalmazza. A betanítás adatkészletének összeállítására vonatkozó tippekért és lehetőségekért tekintse meg a betanítás adatkészletének összeállítása egyéni modellhez való összeállítását. Ebben a rövid útmutatóban a mintaadatkészlet Betanítás mappájában található fájlokat használhatja (töltse le és bontsa ki a sample_data.zip).
  • Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy Form Recognizer-erőforrást, Form Recognizer erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után válassza az Erőforráshoz ugrás lehetőséget.
    • A létrehozott erőforrás kulcsának és végpontjának szüksége lesz az alkalmazás a Form Recognizer API-hoz való csatlakoztatásához. A kulcsot és a végpontot a rövid útmutató későbbi, lenti kódába fogja beilleszteni.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szintre F0 éles környezetben.
  • Egy nyugtát mutató kép URL-címe. Ehhez a rövid útmutatóhoz használhat egy mintaképet.
  • Egy névjegykártyát képhez tartozó URL-cím. Ehhez a rövid útmutatóhoz használhat egy mintaképet.
  • Egy számla képének URL-címe. Ehhez a rövid útmutatóhoz használhat egy mintadokumentumot.
  • Egy azonosítódokumentumot képhez tartozó URL-cím. Mintaképet is használhat

Elrendezés elemzése

A modell betanítása Form Recognizer nélkül elemezheti és kinyerheti a táblákat, a kijelölési jeleket, a szöveget és a struktúrát a dokumentumokban. Az elrendezéskinyerésről az Elrendezés fogalmi útmutatóban található további információ. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a {endpoint} saját előfizetéséhez Form Recognizer végpontot.
  2. Cserélje le a helyére az előző lépésben {subscription key} kimáselt előfizetői kulcsot.
  3. Cserélje \"{your-document-url} le a helyére a példa URL-címek valamelyikét.

Kérés

curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{'source': '{your-document-url}'}"

Operation-Location

Egy válasz fog kapni, amely tartalmaz egy 202 (Success) Operation-Location fejlécet. A fejléc értéke tartalmaz egy eredményazonosítót, amely segítségével lekérdezheti az aszinkron művelet állapotát, és lekérdezheti az eredményeket:

https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.

A következő példában az URL-cím részeként az utána következő sztring analyzeResults/ az eredmény azonosítója.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Elrendezési eredmények lekérte

Az Analyze Layout API hívása után hívja meg a Get Analyze Layout Result API-t a művelet és a kinyert adatok állapotának lehívásához. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a {endpoint} saját előfizetéséhez Form Recognizer végpontot.
  2. Cserélje le a helyére az előző lépésben {subscription key} kimáselt előfizetői kulcsot.
  3. Cserélje {resultId} le a helyére az előző lépés eredményazonosítóját.

Kérés

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

Az eredmények vizsgálata

Egy 200 (success) JSON-tartalommal együtt kapott választ fog kapni.

Tekintse meg az alábbi számlaképet és a hozzá tartozó JSON-kimenetet.

  • A csomópont minden szövegsort tartalmaz, és a megfelelő határolókeret el van ásva "readResults" az oldalon.
  • A csomópont minden kijelölési jelet (jelölőnégyzetet, választójelet) és azt is megjeleníti, hogy az állapota selectionMarks "selected" (kijelölve) vagy "unselected" (nincs kiválasztva) állapotú-e.
  • A "pageResults" szakasz a kinyert táblákat tartalmazza. A rendszer minden táblához kinyeri a szöveg, a sor és az oszlop indexét, a sor- és oszlopáttárat, a határolókeretet és sok más stb.

A Contoso projekt utasításának dokumentuma egy táblával.

Választörzs

Ez a kimenet az egyszerűség kedvéért le lett rövidülve. Tekintse meg a teljes kimenetmintát a GitHub.

{
    "status": "succeeded",
    "createdDateTime": "2020-08-20T20:40:50Z",
    "lastUpdatedDateTime": "2020-08-20T20:40:55Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [
            {
                "page": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "lines": [
                    {
                        "boundingBox": [
                            0.5826,
                            0.4411,
                            2.3387,
                            0.4411,
                            2.3387,
                            0.7969,
                            0.5826,
                            0.7969
                        ],
                        "text": "Contoso, Ltd.",
                        "words": [
                            {
                                "boundingBox": [
                                    0.5826,
                                    0.4411,
                                    1.744,
                                    0.4411,
                                    1.744,
                                    0.7969,
                                    0.5826,
                                    0.7969
                                ],
                                "text": "Contoso,",
                                "confidence": 1
                            },
                            {
                                "boundingBox": [
                                    1.8448,
                                    0.4446,
                                    2.3387,
                                    0.4446,
                                    2.3387,
                                    0.7631,
                                    1.8448,
                                    0.7631
                                ],
                                "text": "Ltd.",
                                "confidence": 1
                            }
                        ]
                    },
                    ...
                        ]
                    }
                ],
                "selectionMarks": [
                    {
                        "boundingBox": [
                            3.9737,
                            3.7475,
                            4.1693,
                            3.7475,
                            4.1693,
                            3.9428,
                            3.9737,
                            3.9428
                        ],
                        "confidence": 0.989,
                        "state": "selected"
                    },
                    ...
                ]
            }
        ],
        "pageResults": [
            {
                "page": 1,
                "tables": [
                    {
                        "rows": 5,
                        "columns": 5,
                        "cells": [
                            {
                                "rowIndex": 0,
                                "columnIndex": 0,
                                "text": "Training Date",
                                "boundingBox": [
                                    0.5133,
                                    4.2167,
                                    1.7567,
                                    4.2167,
                                    1.7567,
                                    4.4492,
                                    0.5133,
                                    4.4492
                                ],
                                "elements": [
                                    "#/readResults/0/lines/12/words/0",
                                    "#/readResults/0/lines/12/words/1"
                                ]
                            },
                            ...
                        ]
                    },
                    ...
                ]
            }
        ]
    }
}

Nyugták elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki közös mezőket az USA-nyugtákból egy előre betanított nyugtamodell használatával. A nyugták elemzésével kapcsolatos további információkért lásd a nyugta fogalmi útmutatóját. A nyugták elemzésének elkezdéséhez hívja meg az Analyze Receipt API-t az alábbi cURL-paranccsal. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a {endpoint} saját előfizetéséhez Form Recognizer végpontot.
  2. Cserélje {your receipt URL} le a helyére a nyugtakép URL-címét.
  3. Cserélje le a helyére az előző lépésben {subscription key> kimáselt előfizetői kulcsot.

Kérés

curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/prebuilt/receipt/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{your receipt URL}'}"

Operation-Location

Egy válasz fog kapni, amely tartalmaz egy 202 (Success) Operation-Location fejlécet. A fejléc értéke tartalmaz egy eredményazonosítót, amely segítségével lekérdezheti az aszinkron művelet állapotát, és lekérdezheti az eredményeket:

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}

A következő példában az utána következő operations/ sztring az eredmény azonosítója:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/operations/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Nyugták eredményeinek le kérése

Az Analyze Receipt API hívása után hívja meg a Get Analyze Receipt Result API-t a művelet és a kinyert adatok állapotának lehívásához. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a saját előfizetési kulcsával {endpoint} Form Recognizer végpontot. Ezt a saját erőforrásának Áttekintés Form Recognizer találhatja meg.
  2. Cserélje {resultId} le a helyére az előző lépés eredményazonosítóját.
  3. A {subscription key} helyére írja be az előfizetési kulcsot.

Kérés

curl -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

A válasz vizsgálata

Egy 200 (Success) JSON-kimenettel kapott választ fog kapni. Az első mező "status" () a művelet állapotát jelzi. Ha a művelet nem fejeződött be, a értéke vagy lesz, és újra meg kell hívnia az "status" "running" API-t "notStarted" manuálisan vagy egy szkripttel. Javasoljuk, hogy a hívások között legalább egy másodperces időközt javasoljon.

A csomópont tartalmazza az összes felismert szöveget (ha az opcionális "readResults" includeTextDetails paramétert a következőre adja meg: true ). A szöveg lap, sor, majd egyéni szavak szerint van rendezve. A "documentResults" csomópont tartalmazza a modell által felderített nyugtaspecifikus értékeket. Itt találhat olyan hasznos kulcs/érték párokat, mint az adó, az összeg, a kereskedő címe stb.

Tekintse meg az alábbi nyugtaképet és a hozzá tartozó JSON-kimenetet.

Nyugtát a Contoso áruházból

Választörzs

Ez a kimenet az olvashatóság érdekében le lett rövidülve. Tekintse meg a teljes kimenetmintát a GitHub.

{
  "status":"succeeded",
  "createdDateTime":"2019-12-17T04:11:24Z",
  "lastUpdatedDateTime":"2019-12-17T04:11:32Z",
  "analyzeResult":{
    "version":"2.1.0",
    "readResults":[
      {
        "page":1,
        "angle":0.6893,
        "width":1688,
        "height":3000,
        "unit":"pixel",
        "language":"en",
        "lines":[
          {
            "text":"Contoso",
            "boundingBox":[
              635,
              510,
              1086,
              461,
              1098,
              558,
              643,
              604
            ],
            "words":[
              {
                "text":"Contoso",
                "boundingBox":[
                  639,
                  510,
                  1087,
                  461,
                  1098,
                  551,
                  646,
                  604
                ],
                "confidence":0.955
              }
            ]
          },
          ...
        ]
      }
    ],
    "documentResults":[
      {
        "docType":"prebuilt:receipt",
        "pageRange":[
          1,
          1
        ],
        "fields":{
          "ReceiptType":{
            "type":"string",
            "valueString":"Itemized",
            "confidence":0.692
          },
          "MerchantName":{
            "type":"string",
            "valueString":"Contoso Contoso",
            "text":"Contoso Contoso",
            "boundingBox":[
              378.2,
              292.4,
              1117.7,
              468.3,
              1035.7,
              812.7,
              296.3,
              636.8
            ],
            "page":1,
            "confidence":0.613,
            "elements":[
              "#/readResults/0/lines/0/words/0",
              "#/readResults/0/lines/1/words/0"
            ]
          },
          "MerchantAddress":{
            "type":"string",
            "valueString":"123 Main Street Redmond, WA 98052",
            "text":"123 Main Street Redmond, WA 98052",
            "boundingBox":[
              302,
              675.8,
              848.1,
              793.7,
              809.9,
              970.4,
              263.9,
              852.5
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/2/words/0",
              "#/readResults/0/lines/2/words/1",
              "#/readResults/0/lines/2/words/2",
              "#/readResults/0/lines/3/words/0",
              "#/readResults/0/lines/3/words/1",
              "#/readResults/0/lines/3/words/2"
            ]
          },
          "MerchantPhoneNumber":{
            "type":"phoneNumber",
            "valuePhoneNumber":"+19876543210",
            "text":"987-654-3210",
            "boundingBox":[
              278,
              1004,
              656.3,
              1054.7,
              646.8,
              1125.3,
              268.5,
              1074.7
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/4/words/0"
            ]
          },
          "TransactionDate":{
            "type":"date",
            "valueDate":"2019-06-10",
            "text":"6/10/2019",
            "boundingBox":[
              265.1,
              1228.4,
              525,
              1247,
              518.9,
              1332.1,
              259,
              1313.5
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/5/words/0"
            ]
          },
          "TransactionTime":{
            "type":"time",
            "valueTime":"13:59:00",
            "text":"13:59",
            "boundingBox":[
              541,
              1248,
              677.3,
              1261.5,
              668.9,
              1346.5,
              532.6,
              1333
            ],
            "page":1,
            "confidence":0.977,
            "elements":[
              "#/readResults/0/lines/5/words/1"
            ]
          },
          "Items":{
            "type":"array",
            "valueArray":[
              {
                "type":"object",
                "valueObject":{
                  "Quantity":{
                    "type":"number",
                    "text":"1",
                    "boundingBox":[
                      245.1,
                      1581.5,
                      300.9,
                      1585.1,
                      295,
                      1676,
                      239.2,
                      1672.4
                    ],
                    "page":1,
                    "confidence":0.92,
                    "elements":[
                      "#/readResults/0/lines/7/words/0"
                    ]
                  },
                  "Name":{
                    "type":"string",
                    "valueString":"Cappuccino",
                    "text":"Cappuccino",
                    "boundingBox":[
                      322,
                      1586,
                      654.2,
                      1601.1,
                      650,
                      1693,
                      317.8,
                      1678
                    ],
                    "page":1,
                    "confidence":0.923,
                    "elements":[
                      "#/readResults/0/lines/7/words/1"
                    ]
                  },
                  "TotalPrice":{
                    "type":"number",
                    "valueNumber":2.2,
                    "text":"$2.20",
                    "boundingBox":[
                      1107.7,
                      1584,
                      1263,
                      1574,
                      1268.3,
                      1656,
                      1113,
                      1666
                    ],
                    "page":1,
                    "confidence":0.918,
                    "elements":[
                      "#/readResults/0/lines/8/words/0"
                    ]
                  }
                }
              },
              ...
            ]
          },
          "Subtotal":{
            "type":"number",
            "valueNumber":11.7,
            "text":"11.70",
            "boundingBox":[
              1146,
              2221,
              1297.3,
              2223,
              1296,
              2319,
              1144.7,
              2317
            ],
            "page":1,
            "confidence":0.955,
            "elements":[
              "#/readResults/0/lines/13/words/1"
            ]
          },
          "Tax":{
            "type":"number",
            "valueNumber":1.17,
            "text":"1.17",
            "boundingBox":[
              1190,
              2359,
              1304,
              2359,
              1304,
              2456,
              1190,
              2456
            ],
            "page":1,
            "confidence":0.979,
            "elements":[
              "#/readResults/0/lines/15/words/1"
            ]
          },
          "Tip":{
            "type":"number",
            "valueNumber":1.63,
            "text":"1.63",
            "boundingBox":[
              1094,
              2479,
              1267.7,
              2485,
              1264,
              2591,
              1090.3,
              2585
            ],
            "page":1,
            "confidence":0.941,
            "elements":[
              "#/readResults/0/lines/17/words/1"
            ]
          },
          "Total":{
            "type":"number",
            "valueNumber":14.5,
            "text":"$14.50",
            "boundingBox":[
              1034.2,
              2617,
              1387.5,
              2638.2,
              1380,
              2763,
              1026.7,
              2741.8
            ],
            "page":1,
            "confidence":0.985,
            "elements":[
              "#/readResults/0/lines/19/words/0"
            ]
          }
        }
      }
    ]
  }
}

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezhet és vonhet ki általános mezőket angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért lásd a névjegykártyák fogalmi útmutatóját. A névjegykártya elemzésének elkezdéséhez hívja meg az Analyze Business Card API-t az alábbi cURL-paranccsal. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a {endpoint} saját előfizetéséhez Form Recognizer végpontot.
  2. Cserélje {your business card URL} le a helyére a nyugtakép URL-címét.
  3. Cserélje le a helyére az előző lépésben {subscription key} kimáselt előfizetői kulcsot.

Kérés

curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/prebuilt/businessCard/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{your receipt URL}'}"

Operation-Location

Egy olyan választ fog kapni, amely tartalmaz 202 (Success) egy Operation-Location fejlécet. A fejléc értéke tartalmaz egy eredményazonosítót, amely segítségével lekérdezheti az aszinkron művelet állapotát, és lekérdezheti az eredményeket:

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/{resultId}

A következő példában az URL-cím részeként az utána következő sztring analyzeResults/ az eredmény azonosítója.

https://cognitiveservice/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Névjegykártya-eredmények lekérte

Az Analyze Business Card API hívása után hívja meg a Névjegykártya-eredmény lehívása API-t a művelet és a kinyert adatok állapotának lehívásához. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a kapott végpontot a Form Recognizer {endpoint} előfizetői kulcsával. Az erőforrás áttekintési lapján Form Recognizer található.
  2. Cserélje {resultId} le a helyére az előző lépés eredményazonosítóját.
  3. A {subscription key} helyére írja be az előfizetési kulcsot.
curl -v -X GET https://{endpoint}/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/{resultId}"
-H "Ocp-Apim-Subscription-Key: {subscription key}"

A válasz vizsgálata

Egy JSON-kimenettel kapott 200 (Success) választ fog kapni.

A "readResults" csomópont tartalmazza az összes felismert szöveget. A szöveg lap, sor, majd egyéni szavak szerint van rendezve. A csomópont a modell által felderített "documentResults" névjegykártya-specifikus értékeket tartalmazza. Itt találhat hasznos kapcsolattartási adatokat, például a vállalat nevét, vezetéknevét, vezetéknevét, telefonszámát stb.

A Contoso vállalat névjegykártyája

Ez a JSON-mintakimenet az olvashatóság érdekében lerövidítve lett. Tekintse meg a teljes mintakimenetet a GitHub.

{
    "status": "succeeded",
    "createdDateTime":"2021-02-09T18:14:05Z",
    "lastUpdatedDateTime":"2021-02-09T18:14:10Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [
            {
             "page":1,
             "angle":-16.6836,
             "width":4032,
             "height":3024,
             "unit":"pixel"
          }
        ],
        "documentResults": [
            {
                "docType": "prebuilt:businesscard",
                "pageRange": [
                    1,
                    1
                ],
                "fields": {
                    "ContactNames": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "object",
                                "valueObject": {
                                    "FirstName": {
                                        "type": "string",
                                        "valueString": "Avery",
                                        "text": "Avery",
                                        "boundingBox": [
                                            703,
                                            1096,
                                            1134,
                                            989,
                                            1165,
                                            1109,
                                            733,
                                            1206
                                        ],
                                        "page": 1
                                },
                                "text": "Dr. Avery Smith",
                                "boundingBox": [
                                    419.3,
                                    1154.6,
                                    1589.6,
                                    877.9,
                                    1618.9,
                                    1001.7,
                                    448.6,
                                    1278.4
                                ],
                                "confidence": 0.993
                            }
                        ]
                    },
                    "Emails": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "string",
                                "valueString": "avery.smith@contoso.com",
                                "text": "avery.smith@contoso.com",
                                "boundingBox": [
                                    2107,
                                    934,
                                    2917,
                                    696,
                                    2935,
                                    764,
                                    2126,
                                    995
                                ],
                                "page": 1,
                                "confidence": 0.99
                            }
                        ]
                    },
                    "Websites": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "string",
                                "valueString": "https://www.contoso.com/",
                                "text": "https://www.contoso.com/",
                                "boundingBox": [
                                    2121,
                                    1002,
                                    2992,
                                    755,
                                    3014,
                                    826,
                                    2143,
                                    1077
                                ],
                                "page": 1,
                                "confidence": 0.995
                            }
                        ]
                    }
                }
            }
        ]
    }
}

A szkript a konzolra ír ki válaszokat, amíg a Névjegykártya elemzése művelet be nem fejeződik.

Számlák elemzése

A Form Recognizer mezőszöveg és szemantikai értékek kinyerheti egy adott számladokumentumból. Egy számla elemzésének elkezdését az alábbi cURL-paranccsal kezdheti meg. A számlaelemzéssel kapcsolatos további információkért lásd a számla fogalmi útmutatóját. A számla elemzésének elkezdéséhez hívja meg az Analyze Invoice API-t az alábbi cURL-paranccsal. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.
  2. Cserélje {your invoice URL} le a helyére egy számladokumentum URL-címét.
  3. A {subscription key} helyére írja be az előfizetési kulcsot.

Kérés

curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key:  {subscription key}" --data-ascii "{'source': '{your invoice URL}'}"

Operation-Location

Egy olyan választ fog kapni, amely tartalmaz 202 (Success) egy Operation-Location fejlécet. A fejléc értéke tartalmaz egy eredményazonosítót, amely segítségével lekérdezheti az aszinkron művelet állapotát, és lekérdezheti az eredményeket:

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}

A következő példában az URL-cím részeként az utána következő sztring analyzeResults/ az eredmény azonosítója:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Számlaeredmények lekérte

Az Analyze Invoice API hívása után hívja meg a Számla eredményének lehívása API-t a művelet és a kinyert adatok állapotának lehívásához. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a kapott végpontot a Form Recognizer {endpoint} előfizetői kulcsával. Az erőforrás áttekintési lapján Form Recognizer található.
  2. Cserélje {resultId} le a helyére az előző lépés eredményazonosítóját.
  3. A {subscription key} helyére írja be az előfizetési kulcsot.

Kérés

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

A válasz vizsgálata

Egy JSON-kimenettel kapott 200 (Success) választ fog kapni.

  • A "readResults" mező a számlából kinyert összes szövegsort tartalmazza.
  • A tartalmazza a számlából kinyert táblákat és "pageResults" kijelölési jeleket.
  • A "documentResults" mező a számla legfontosabb részeinek kulcs-érték információit tartalmazza.

Tekintse meg az alábbi számladokumentumot és annak megfelelő JSON-kimenetét.

Választörzs

Ez a JSON-tartalom az olvashatóság érdekében lerövidítve lett. Tekintse meg a teljes mintakimenetet a GitHub.

{
    "status": "succeeded",
    "createdDateTime": "2020-11-06T23:32:11Z",
    "lastUpdatedDateTime": "2020-11-06T23:32:20Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [{
            "page": 1,
            "angle": 0,
            "width": 8.5,
            "height": 11,
            "unit": "inch"
        }],
        "pageResults": [{
            "page": 1,
            "tables": [{
                "rows": 3,
                "columns": 4,
                "cells": [{
                    "rowIndex": 0,
                    "columnIndex": 0,
                    "text": "QUANTITY",
                    "boundingBox": [0.4953,
                    5.7306,
                    1.8097,
                    5.7306,
                    1.7942,
                    6.0122,
                    0.4953,
                    6.0122]
                },
                {
                    "rowIndex": 0,
                    "columnIndex": 1,
                    "text": "DESCRIPTION",
                    "boundingBox": [1.8097,
                    5.7306,
                    5.7529,
                    5.7306,
                    5.7452,
                    6.0122,
                    1.7942,
                    6.0122]
                },
                ...
                ],
                "boundingBox": [0.4794,
                5.7132,
                8.0158,
                5.714,
                8.0118,
                6.5627,
                0.4757,
                6.5619]
            },
            {
                "rows": 2,
                "columns": 6,
                "cells": [{
                    "rowIndex": 0,
                    "columnIndex": 0,
                    "text": "SALESPERSON",
                    "boundingBox": [0.4979,
                    4.963,
                    1.8051,
                    4.963,
                    1.7975,
                    5.2398,
                    0.5056,
                    5.2398]
                },
                {
                    "rowIndex": 0,
                    "columnIndex": 1,
                    "text": "P.O. NUMBER",
                    "boundingBox": [1.8051,
                    4.963,
                    3.3047,
                    4.963,
                    3.3124,
                    5.2398,
                    1.7975,
                    5.2398]
                },
                ...
                ],
                "boundingBox": [0.4976,
                4.961,
                7.9959,
                4.9606,
                7.9959,
                5.5204,
                0.4972,
                5.5209]
            }]
        }],
        "documentResults": [{
            "docType": "prebuilt:invoice",
            "pageRange": [1,
            1],
            "fields": {
                "AmountDue": {
                    "type": "number",
                    "valueNumber": 610,
                    "text": "$610.00",
                    "boundingBox": [7.3809,
                    7.8153,
                    7.9167,
                    7.8153,
                    7.9167,
                    7.9591,
                    7.3809,
                    7.9591],
                    "page": 1,
                    "confidence": 0.875
                },
                "BillingAddress": {
                    "type": "string",
                    "valueString": "123 Bill St, Redmond WA, 98052",
                    "text": "123 Bill St, Redmond WA, 98052",
                    "boundingBox": [0.594,
                    4.3724,
                    2.0125,
                    4.3724,
                    2.0125,
                    4.7125,
                    0.594,
                    4.7125],
                    "page": 1,
                    "confidence": 0.997
                },
                "BillingAddressRecipient": {
                    "type": "string",
                    "valueString": "Microsoft Finance",
                    "text": "Microsoft Finance",
                    "boundingBox": [0.594,
                    4.1684,
                    1.7907,
                    4.1684,
                    1.7907,
                    4.2837,
                    0.594,
                    4.2837],
                    "page": 1,
                    "confidence": 0.998
                },
                ...
            }
        }]
    }
}

Identitás- (AZONOSÍTÓ-) dokumentumok elemzése

Egy azonosítási dokumentum elemzésének elkezdését az alábbi cURL-paranccsal kezdheti meg. Az azonosító dokumentumok elemzésével kapcsolatos további információkért lásd az azonosító dokumentumok fogalmi útmutatóját. Egy azonosító dokumentum elemzésének elkezdéséhez hívja meg az Analyze ID Document API-t az alábbi cURL-paranccsal. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.
  2. Cserélje {your ID document URL} le a helyére a nyugtakép URL-címét.
  3. Cserélje {subscription key} le a helyére az előző lépésben kimáselt előfizetői kulcsot.

Kérés

curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/prebuilt/idDocument/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{your ID document URL}'}"

Operation-Location

Egy olyan választ fog kapni, amely tartalmaz 202 (Success) egy Operation-Location fejlécet. A fejléc értéke tartalmaz egy eredményazonosítót, amely segítségével lekérdezheti az aszinkron művelet állapotát, és lekérdezheti az eredményeket:

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/documentId/analyzeResults/{resultId}

A következő példában az utána következő sztring analyzeResults/ az eredmény azonosítója:

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/prebuilt/idDocument/analyzeResults/83d0137b-28e1-4051-98ce-42bd21f77ae0

Az Azonosító elemzése dokumentum eredményének lekérte

Az Analyze ID Document API hívása után hívja meg a Get Analyze ID Document Result API-t a művelet és a kinyert adatok állapotának lehívásához. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére a kapott végpontot a Form Recognizer {endpoint} előfizetői kulcsával. Az erőforrás áttekintési lapján Form Recognizer található.
  2. Cserélje {resultId} le a helyére az előző lépés eredményazonosítóját.
  3. A {subscription key} helyére írja be az előfizetési kulcsot.

Kérés

curl -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

A válasz vizsgálata

Egy JSON-kimenettel kapott 200 (Success) választ fog kapni. Az első mező "status" () a művelet állapotát jelzi. Ha a művelet nem fejeződött be, a értéke vagy lesz, és újra meg kell hívnia az API-t manuálisan vagy egy szkripttel, amíg meg nem "status" "running" kapja az "notStarted" succeeded értéket. Javasoljuk, hogy a hívások között legalább egy másodperces időközt javasoljon.

  • A mező az azonosító dokumentumból kinyert összes "readResults" szövegsort tartalmazza.
  • A mező objektumok tömböt tartalmaz, amelyek a bemeneti dokumentumban észlelt "documentResults" azonosítódokumentumot képviselik.

Az alábbiakban egy mintaazonosító-dokumentum és a hozzá tartozó JSON-kimenet látható

  • minta illesztői licenc

Választörzs

{
    "status": "succeeded",
    "createdDateTime": "2021-04-13T17:24:52Z",
    "lastUpdatedDateTime": "2021-04-13T17:24:55Z",
    "analyzeResult": {
      "version": "2.1.0",
      "readResults": [
        {
          "page": 1,
          "angle": -0.2823,
          "width": 450,
          "height": 294,
          "unit": "pixel"
        }
      ],
      "documentResults": [
        {
          "docType": "prebuilt:idDocument:driverLicense",
          "docTypeConfidence": 0.995,
          "pageRange": [
            1,
            1
          ],
          "fields": {
            "Address": {
              "type": "string",
              "valueString": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
              "text": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
              "boundingBox": [
                158,
                151,
                326,
                151,
                326,
                177,
                158,
                177
              ],
              "page": 1,
              "confidence": 0.965
            },
            "CountryRegion": {
              "type": "countryRegion",
              "valueCountryRegion": "USA",
              "confidence": 0.99
            },
            "DateOfBirth": {
              "type": "date",
              "valueDate": "1958-01-06",
              "text": "01/06/1958",
              "boundingBox": [
                187,
                133,
                272,
                132,
                272,
                148,
                187,
                149
              ],
              "page": 1,
              "confidence": 0.99
            },
            "DateOfExpiration": {
              "type": "date",
              "valueDate": "2020-08-12",
              "text": "08/12/2020",
              "boundingBox": [
                332,
                230,
                414,
                228,
                414,
                244,
                332,
                245
              ],
              "page": 1,
              "confidence": 0.99
            },
            "DocumentNumber": {
              "type": "string",
              "valueString": "LICWDLACD5DG",
              "text": "LIC#WDLABCD456DG",
              "boundingBox": [
                162,
                70,
                307,
                68,
                307,
                84,
                163,
                85
              ],
              "page": 1,
              "confidence": 0.99
            },
            "FirstName": {
              "type": "string",
              "valueString": "LIAM R.",
              "text": "LIAM R.",
              "boundingBox": [
                158,
                102,
                216,
                102,
                216,
                116,
                158,
                116
              ],
              "page": 1,
              "confidence": 0.985
            },
            "LastName": {
              "type": "string",
              "valueString": "TALBOT",
              "text": "TALBOT",
              "boundingBox": [
                160,
                86,
                213,
                85,
                213,
                99,
                160,
                100
              ],
              "page": 1,
              "confidence": 0.987
            },
            "Region": {
              "type": "string",
              "valueString": "Washington",
              "confidence": 0.99
            },
            "Sex": {
              "type": "string",
              "valueString": "M",
              "text": "M",
              "boundingBox": [
                226,
                190,
                232,
                190,
                233,
                201,
                226,
                201
              ],
              "page": 1,
              "confidence": 0.99
            }
          }
        }
      ]
    }
  }

Egyéni modell betanítása

Egyéni modell betanítása érdekében szüksége lesz egy Azure-beli virtuális blobban lévő betanítás Storage adatkészletre. Legalább öt, azonos típusú/szerkezetű kitöltött űrlapra (PDF-dokumentumokra és/vagy képekre) van szükség. A betanítás adatainak összeállítására vonatkozó tippekért és lehetőségekért tekintse meg a betanítás adatkészletének összeállítása egyéni modellhez való összeállítását.

A betanítás címkével jelölt adatok nélkül az alapértelmezett művelet, és egyszerűbb. Másik lehetőségként manuálisan is megcímkézheti a betanítás egyes adatait, vagy akár az összeset is. Ez egy összetettebb folyamat, de egy jobban betanított modellt ad vissza.

Megjegyzés

A modelleket grafikus felhasználói felülettel is betaníthatja, például a Form Recognizer eszköz használatával.

Modell betanítása címkék nélkül

Ha betanít egy Form Recognizer modellt az Azure Blob-tárolóban lévő dokumentumokkal, hívja meg az Egyéni modell betanítás API-ját a következő cURL-parancs futtatásával. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.

  2. Cserélje {subscription key} le a helyére az előző lépésben kimáselt előfizetői kulcsot.

  3. Cserélje {SAS URL} le a helyére az Azure Blob Storage-tároló közös hozzáférésű jogosultság jogosultságának (SAS) URL-címét. * Az egyéni modell betanítási adatainak SAS URL-címének lekéréséhez a tárerőforrást a Azure Portal válassza a Storage Explorer fület. Navigáljon a tárolóhoz, kattintson a jobb gombbal, és válassza a Közös hozzáférésű jogosultság jogosultsága begyűjtése lehetőséget. Fontos, hogy a tároló SAS-ét szerezze be, ne magát a tárfiókot. Győződjön meg arról, hogy az Olvasás, Írás, Törlés és Lista engedély be van jelölve, majd kattintson a Létrehozás gombra. Ezután másolja az URL szakaszban található értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

    SAS URL-lekérés

Kérés

curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{SAS URL}'}"

Hely

Egy Location fejléccel kapott 201 (Success) választ fog kapni. A fejléc értéke tartalmazza az újonnan betanított modell modellazonosítóját, amely segítségével lekérdezheti a művelet állapotát, és lekérdezheti az eredményeket:

https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}

A következő példában az URL-cím részeként az utána következő sztring models/ a modell azonosítója.

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/77d8ecad-b8c1-427e-ac20-a3fe4af503e9

Modell betanítása címkékkel

A címkékkel való betanításhoz speciális címkeinformációs fájlokra () van szükség a Blob Storage-tárolóban \<filename\>.pdf.labels.json a betanítás dokumentumai mellett. A Form Recognizer mintacímkéző eszköz egy felhasználói felületet biztosít a címkefájlok létrehozásához. Ha már megvan, hívja meg az Egyéni modell betanítása API-t, a paraméter pedig legyen a "useLabelFile" true JSON-törzsben.

A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.

  2. Cserélje {subscription key} le a helyére az előző lépésben kimáselt előfizetői kulcsot.

  3. Cserélje {SAS URL} le a helyére az Azure Blob Storage-tároló közös hozzáférésű jogosultság jogosultságának (SAS) URL-címét. * Az egyéni modell betanítási adatainak SAS URL-címének lekéréséhez a tárerőforrást a Azure Portal válassza a Storage Explorer fület. Navigáljon a tárolóhoz, kattintson a jobb gombbal, és válassza a Közös hozzáférésű jogosultság jogosultsága begyűjtése lehetőséget. Fontos, hogy a tároló SAS-ét szerezze be, ne magát a tárfiókot. Győződjön meg arról, hogy az Olvasás, Írás, Törlés és Lista engedély be van jelölve, majd kattintson a Létrehozás gombra. Ezután másolja az URL szakaszban található értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

    SAS URL-lekérés

Kérés

curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{SAS URL}', 'useLabelFile':true}"

Hely

Egy Location fejléccel kapott 201 (Success) választ fog kapni. A fejléc értéke tartalmazza az újonnan betanított modell modellazonosítóját, amely segítségével lekérdezheti a művelet állapotát, és lekérdezheti az eredményeket:

https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}

A következő példában az URL-cím részeként az utána következő sztring models/ a modell azonosítója.

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/4da0bf8e-5325-467c-93bb-9ff13d5f72a2

Betanítás eredményeinek lekérte

Miután elindította a betanítás műveletét, az Egyéni modell betöltése használatával ellenőrizze a betanítás állapotát. A betanítás állapotának ellenőrzéshez adja át a modellazonosítót az API-kérésnek:

  1. Cserélje le a helyére a saját előfizetői Form Recognizer {endpoint} kapott végpontot.
  2. Cserélje le {subscription key} a helyére az előfizetői kulcsot
  3. Cserélje {model ID} le a helyére az előző lépésben kapott modellazonosítót

Kérés

curl -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

Űrlapok elemzése egyéni modellel

Ezután az újonnan betanított modellel fog elemezni egy dokumentumot, és kinyeri belőle a kulcs-érték párokat és táblákat. Hívja meg az Analyze Form API-t a következő cURL-parancs futtatásával. A parancs futtatása előtt tegye a következő módosításokat:

  1. Cserélje le a helyére az előfizetési kulcsból Form Recognizer {endpoint} végpontot. Ezt a saját erőforrásának Áttekintés Form Recognizer lapján találja.
  2. Cserélje le a helyére az előző szakaszban {model ID} kapott modellazonosítót.
  3. Cserélje {SAS URL} le a helyére az Azure Storage-ban található fájl SAS URL-címét. Kövesse a Betanítás szakasz lépéseit, de ahelyett, hogy egy SAS URL-címet kap a teljes blobtárolóhoz, szerezze be az elemezni kívánt fájlhoz tartozót.
  4. A {subscription key} helyére írja be az előfizetési kulcsot.

Kérés

curl -v "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}/analyze?includeTextDetails=true" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" -d "{ 'source': '{SAS URL}' } "

Egy 202 (Success) Operation-Location fejléccel kapcsolatos választ fog kapni. A fejléc értéke tartalmaz egy eredményazonosítót, amely az Elemzés művelet eredményeinek nyomon követésére használható:

https:// cognitiveservice/formrecognizer/v2.1/custom/models/{modelId}/analyzeResults/{resultId}

A következő példában az URL-cím részeként az utána következő sztring analyzeResults/ az eredmény azonosítója.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Mentse ezt az eredményazonosítót a következő lépéshez.

Az eredmények elemzése

Hívja meg a Get Analyze Form Result API-t az Elemzés művelet eredményeinek lekérdezéséhez.

  1. Cserélje le a helyére az előfizetési kulcsból Form Recognizer {endpoint} végpontot. Ezt a saját erőforrásának Áttekintés Form Recognizer lapján találja.
  2. Cserélje {result ID} le a helyére az előző szakaszban kapott azonosítót.
  3. A {subscription key} helyére írja be az előfizetési kulcsot.

Kérés

curl -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

A JSON-törzset a következő formátumban 200 (Success) kapja meg. A kimenet az egyszerűség kedvéért le lett rövidülve. Figyelje "status" meg a lenti mezőt. Ennek értéke az "succeeded" Elemzés művelet befejezésekor lesz meg. Ha az Elemzés művelet nem fejeződött be, újra le kellkérdezni a szolgáltatást a parancs újrafuttatása által. Javasoljuk, hogy a hívások között legalább egy másodperces időközt javasoljon.

A címkék nélkül betanított egyéni modellekben a kulcs/érték pár társításai és táblái a "pageResults" JSON-kimenet csomópontján vannak. A címkékkel betanított egyéni modellekben a kulcs/érték pár társításai a csomóponton "documentResults" vannak. Ha egyszerű szövegkinyerést is megadott az includeTextDetails URL-paraméteren keresztül, akkor a csomópont a dokumentumban található összes szöveg tartalmát és pozícióit "readResults" is meg fogja mutatni.

Ez a JSON-mintakimenet az egyszerűség kedvéért lett lerövidítve. Tekintse meg a teljes mintakimenetet a GitHub.

Választörzs

{
  "status": "succeeded",
  "createdDateTime": "2020-08-21T01:13:28Z",
  "lastUpdatedDateTime": "2020-08-21T01:13:42Z",
  "analyzeResult": {
    "version": "2.1.0",
    "readResults": [
      {
        "page": 1,
        "angle": 0,
        "width": 8.5,
        "height": 11,
        "unit": "inch",
        "lines": [
          {
            "text": "Project Statement",
            "boundingBox": [
              5.0444,
              0.3613,
              8.0917,
              0.3613,
              8.0917,
              0.6718,
              5.0444,
              0.6718
            ],
            "words": [
              {
                "text": "Project",
                "boundingBox": [
                  5.0444,
                  0.3587,
                  6.2264,
                  0.3587,
                  6.2264,
                  0.708,
                  5.0444,
                  0.708
                ]
              },
              {
                "text": "Statement",
                "boundingBox": [
                  6.3361,
                  0.3635,
                  8.0917,
                  0.3635,
                  8.0917,
                  0.6396,
                  6.3361,
                  0.6396
                ]
              }
            ]
          },
          ...
        ]
      }
    ],
    "pageResults": [
      {
        "page": 1,
        "keyValuePairs": [
          {
            "key": {
              "text": "Date:",
              "boundingBox": [
                6.9833,
                1.0615,
                7.3333,
                1.0615,
                7.3333,
                1.1649,
                6.9833,
                1.1649
              ],
              "elements": [
                "#/readResults/0/lines/2/words/0"
              ]
            },
            "value": {
              "text": "9/10/2020",
              "boundingBox": [
                7.3833,
                1.0802,
                7.925,
                1.0802,
                7.925,
                1.174,
                7.3833,
                1.174
              ],
              "elements": [
                "#/readResults/0/lines/3/words/0"
              ]
            },
            "confidence": 1
          },
          ...
        ],
        "tables": [
          {
            "rows": 5,
            "columns": 5,
            "cells": [
              {
                "text": "Training Date",
                "rowIndex": 0,
                "columnIndex": 0,
                "boundingBox": [
                  0.6944,
                  4.2779,
                  1.5625,
                  4.2779,
                  1.5625,
                  4.4005,
                  0.6944,
                  4.4005
                ],
                "confidence": 1,
                "rowSpan": 1,
                "columnSpan": 1,
                "elements": [
                  "#/readResults/0/lines/15/words/0",
                  "#/readResults/0/lines/15/words/1"
                ],
                "isHeader": true,
                "isFooter": false
              },
              ...
            ]
          }
        ],
        "clusterId": 0
      }
    ],
    "documentResults": [],
    "errors": []
  }
}

Eredmények javítása

Vizsgálja meg "confidence" az egyes kulcs/érték eredmények értékeit a csomópont "pageResults" alatt. A csomóponton a szöveges olvasási műveletnek megfelelő megbízhatósági pontszámokat "readResults" is meg kell néznie. Az olvasási eredmények megbízhatósága nincs hatással a kulcs/érték kinyerési eredmények megbízhatóságára, ezért mindkettőt ellenőriznie kell.

  • Ha az olvasási művelet megbízhatósági pontszámai alacsonyak, próbálja meg javítani a bemeneti dokumentumok minőségét (lásd: Bemeneti követelmények).
  • Ha a kulcs/érték kinyerési művelet megbízhatósági pontszámai alacsonyak, győződjön meg arról, hogy az elemzett dokumentumok ugyanolyan típusúak, mint a betanítási készletben használt dokumentumok. Ha a betanításkészlet dokumentumai különböző megjelenésűek, érdemes lehet különböző mappákra felosztjuk őket, és mindegyik változathoz betanítunk egy modellt.

A célként megcélzott megbízhatósági pontszámok a használt esettől függenek, de általában ajánlott egy 80%-os vagy magasabb pontszámot célozni. A bizalmasabb esetek, például az egészségügyi rekordok vagy a számlázási kimutatások olvasása esetén a 100%-os pontszám ajánlott.

Egyéni modellek kezelése

Egyéni modellek listájának lekért listája

Az alábbi parancsban az Egyéni modellek listása API használatával lekért lista az előfizetéshez tartozó összes egyéni modellről.

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.
  2. Cserélje {subscription key} le a helyére az előző lépésben kimáselt előfizetői kulcsot.

Kérés

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models?op=full"
-H "Ocp-Apim-Subscription-Key: {subscription key}"

Választörzs

Egy sikeres választ fog kapni, amely az alábbihoz hasonló 200 JSON-adatokat tartalmaz. A "modelList" elem tartalmazza az összes létrehozott modellt és azok adatait.

{
  "summary": {
    "count": 0,
    "limit": 0,
    "lastUpdatedDateTime": "string"
  },
  "modelList": [
    {
      "modelId": "string",
      "status": "creating",
      "createdDateTime": "string",
      "lastUpdatedDateTime": "string"
    }
  ],
  "nextLink": "string"
}

Adott modell lekérte

Egy adott egyéni modell részletes információinak lekérésére használja az Egyéni modell lekérése API-t a következő parancsban.

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.
  2. Cserélje {subscription key} le a helyére az előző lépésben kimáselt előfizetői kulcsot.
  3. Cserélje le a helyére a keresni kívánt egyéni modell {modelId} azonosítóját.

Kérés

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

A kérés törzse

Egy sikeres választ fog kapni, amely az alábbihoz hasonló 200 JSON-adatokat tartalmaz.

{
  "modelInfo": {
    "modelId": "string",
    "status": "creating",
    "createdDateTime": "string",
    "lastUpdatedDateTime": "string"
  },
  "keys": {
    "clusters": {}
  },
  "trainResult": {
    "trainingDocuments": [
      {
        "documentName": "string",
        "pages": 0,
        "errors": [
          "string"
        ],
        "status": "succeeded"
      }
    ],
    "fields": [
      {
        "fieldName": "string",
        "accuracy": 0.0
      }
    ],
    "averageModelAccuracy": 0.0,
    "errors": [
      {
        "message": "string"
      }
    ]
  }
}

Modell törlése az erőforrásfiókból

A modell a fiókjából is törölhető, ha az azonosítójára hivatkozik. Ez a parancs az Egyéni modell törlése API-t hívja meg az előző szakaszban használt modell törléséhez.

  1. Cserélje {endpoint} le a helyére a saját előfizetésével Form Recognizer végpontot.
  2. Cserélje {subscription key} le a helyére az előző lépésben kimáselt előfizetői kulcsot.
  3. Cserélje le a helyére a keresni kívánt egyéni modell {modelId} azonosítóját.

Kérés

curl -v -X DELETE "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"

Sikeres választ fog kapni, amely jelzi, hogy a 204 modell törlésre van megjelölve. A modell-összetevők 48 órán belül el lesznek távolítva.

Következő lépések

Ebben a rövid útmutatóban a Form Recognizer REST API különböző módokon elemezte az űrlapokat. A következő lépésként tekintse meg a referenciadokumentációt, Form Recognizer API-val kapcsolatos további információkért.