Nauhar
Nauhar

Reputation: 11

How do I specify key-value pair detection when using document intelligence prebuilt-layout model (Java SDK)?

The Document Intelligence general document model is now deprecated with the 2023-10-31 preview, and the documentation specifies that I should use the Layout model with the optional query string parameter features=keyValuePairs enabled if I want to extract key-value pairs, selection marks, text, tables, and structure from documents. I am using the document intelligence Java SDK, and I am not sure how to do this.

I tried the following, but I get an error saying the model was not found:

SyncPoller < OperationResult, AnalyzeResult > analyzeDocumentPoller =        client.beginAnalyzeDocumentFromUrl("prebuilt-layout?features=keyValuePairs", "insert-document-url-here");

Here's the error code:

Exception in thread "main" com.azure.core.exception.HttpResponseException: Status code 404, "{"error":{"code":"NotFound","message":"Resource not found.","innererror":{"code":"ModelNotFound","message":"The requested model was not found."}}}"
    at com.azure.ai.formrecognizer.documentanalysis.implementation.util.Transforms.getHttpResponseException(Transforms.java:351)
    at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.analyzeDocument(DocumentAnalysisClient.java:612)
    at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.lambda$analyzeActivationOperation$4(DocumentAnalysisClient.java:555)
    at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.lambda$beginAnalyzeDocumentFromUrlSync$0(DocumentAnalysisClient.java:247)
    at com.azure.core.util.polling.SimpleSyncPoller.<init>(SimpleSyncPoller.java:65)
    at com.azure.core.util.polling.SyncPoller.createPoller(SyncPoller.java:127)
    at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.beginAnalyzeDocumentFromUrlSync(DocumentAnalysisClient.java:239)
    at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.beginAnalyzeDocumentFromUrl(DocumentAnalysisClient.java:222)
    at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.beginAnalyzeDocumentFromUrl(DocumentAnalysisClient.java:178)
    at FormRecognizer.main(FormRecognizer.java:35)

If I use the regular "prebuilt-layout" model id, the code runs and analyzes the document, but it doesn't return the key-value pairs.

where can I specify features=keyValuePairs so that the model can detect the key value pairs of the document as well?

Upvotes: 1

Views: 738

Answers (1)

Mohamed Azarudeen Z
Mohamed Azarudeen Z

Reputation: 1327

you need to use the Layout model and set the features parameter correctly. Try this code andnhopefully it works.

import com.azure.ai.formrecognizer.FormRecognizerClientBuilder;
import com.azure.ai.formrecognizer.models.AnalyzeResult;
import com.azure.ai.formrecognizer.models.FormRecognizerOperationResult;
import com.azure.ai.formrecognizer.models.FormRecognizerError;
import com.azure.ai.formrecognizer.models.RecognizedForm;
import com.azure.ai.formrecognizer.models.USReceipt;
import com.azure.ai.formrecognizer.models.OperationResult;
import com.azure.ai.formrecognizer.models.FormContentType;
import com.azure.ai.formrecognizer.models.FormRecognizerLocale;
import com.azure.ai.formrecognizer.models.FormRecognizerOperation;
import com.azure.ai.formrecognizer.models.FormRecognizerErrorInformation;
import com.azure.ai.formrecognizer.implementation.util.ModelHelper;
import com.azure.ai.formrecognizer.implementation.util.OperationHeaders;
import com.azure.ai.formrecognizer.implementation.util.ModelHelper;
import com.azure.ai.formrecognizer.DocumentAnalysisAsyncClient;
import com.azure.ai.formrecognizer.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.models.ModelOperation;
import com.azure.ai.formrecognizer.models.Model;
import com.azure.ai.formrecognizer.models.OperationStatus;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.credential.AzureKeyCredentialBuilder;
import com.azure.core.http.HttpPipeline;
import com.azure.core.http.HttpPipelineBuilder;
import com.azure.core.http.HttpClient;
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
import com.azure.core.http.policy.HttpPipelinePolicy;
import com.azure.core.http.policy.HttpPipelinePolicyChain;
import com.azure.core.http.policy.HttpPipelinePolicyChainBuilder;
import com.azure.core.http.policy.HttpPipelinePolicyProvider;
import com.azure.core.http.policy.RetryPolicy;
import com.azure.core.http.policy.UserAgentPolicy;
import com.azure.core.http.rest.Response;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.SimpleResponse;
import com.azure.core.util.Context;
import com.azure.core.util.polling.PollerFlux;
import com.azure.core.util.polling.SyncPoller;
import com.azure.core.util.polling.PollResponse;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class FormRecognizer {
    public static void main(String[] args) {
        String endpoint = "your-form-recognizer-endpoint";
        String apiKey = "your-api-key";
        String documentUrl = "insert-document-url-here";

        // Set up the Azure Form Recognizer client
        AzureKeyCredential credential = new AzureKeyCredential(apiKey);
        DocumentAnalysisAsyncClient client = new DocumentAnalysisClientBuilder()
                .credential(credential)
                .endpoint(endpoint)
                .httpClient(new NettyAsyncHttpClientBuilder().build())
                .buildAsyncClient();

        // Specify features=keyValuePairs for the Layout model
        String modelId = "prebuilt-layout";
        String modelWithFeatures = modelId + "?features=keyValuePairs";

        // Start analyzing the document
        SyncPoller<OperationResult, AnalyzeResult> analyzeDocumentPoller =
                client.beginAnalyzeDocumentFromUrl(modelWithFeatures, documentUrl);

        // Wait for the operation to complete
        PollResponse<OperationResult> pollResponse = analyzeDocumentPoller.poll();
        OperationResult operationResult = pollResponse.getValue();

        // Retrieve the results
        AnalyzeResult analyzeResult = analyzeDocumentPoller.getFinalResult();

        // Process the analyzeResult to get key-value pairs
        // (Note: This part depends on the structure of the AnalyzeResult and the data you want to extract)
        List<RecognizedForm> recognizedForms = analyzeResult.getRecognizedForms();
        for (RecognizedForm recognizedForm : recognizedForms) {
            Map<String, String> keyValuePairMap = recognizedForm.getKeyValuePairs();
            // Process the key-value pairs as needed
            for (Map.Entry<String, String> entry : keyValuePairMap.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                System.out.println("Key: " + key + ", Value: " + value);
            }
        }

        // Close the client
        client.close();
    }
}

Upvotes: 0

Related Questions