Biblioteca cliente de Azure Cognitive Services Text Analytics para .NET: versión 5.3.0

Text Analytics forma parte de Azure Cognitive Service for Language, un servicio basado en la nube que proporciona características de procesamiento de lenguaje natural (NLP) para comprender y analizar texto. Esta biblioteca cliente ofrece las siguientes características:

  • Detección de idiomas
  • análisis de opiniones
  • Extracción de la frase clave
  • Reconocimiento de entidades con nombre (NER)
  • Reconocimiento de entidades de información de identificación personal (PII)
  • Vinculación de entidad
  • Text Analytics for Health
  • Reconocimiento de entidades con nombre personalizado (NER personalizado)
  • Clasificación de texto personalizada
  • Resumen de texto extractivo
  • Resumen de texto abstracto

Código | fuentePaquete (NuGet) | Documentación | de referencia de APIDocumentación | del productoMuestras

Introducción

Instalar el paquete

Instale la biblioteca cliente de Azure Text Analytics para .NET con NuGet:

dotnet add package Azure.AI.TextAnalytics

En esta tabla se muestra la relación entre las versiones del SDK y las versiones de la API admitidas del servicio:

Tenga en cuenta que 5.2.0 es la primera versión estable de la biblioteca cliente que tiene como destino las API de Azure Cognitive Service for Language, que incluye las características existentes de análisis de texto y procesamiento de lenguaje natural que se encuentran en la biblioteca cliente de Text Analytics. Además, la API de servicio ha cambiado de la semántica al control de versiones basado en fechas.

Versión del SDK Versión de la API admitidas del servicio
5.3.X 3.0, 3.1, 2022-05-01, 2023-04-01 (valor predeterminado)
5.2.X 3.0, 3.1, 2022-05-01 (valor predeterminado)
5.1.X 3.0, 3.1 (predeterminada)
5.0.X 3.0
1.0.X 3.0

Requisitos previos

Creación de un recurso de Cognitive Services o un recurso de servicio de lenguaje

Azure Cognitive Service for Language admite el acceso de varios servicios y de un solo servicio. Cree un recurso de Cognitive Services si tiene previsto acceder a varios servicios cognitivos en un único punto de conexión y una clave de API. Para acceder solo a las características del servicio Language, cree un recurso de servicio de lenguaje en su lugar.

Puede crear cualquier recurso a través de la Azure Portal o, como alternativa, puede seguir los pasos de este documento para crearlo mediante la CLI de Azure.

Autenticar el cliente

La interacción con el servicio mediante la biblioteca cliente comienza con la creación de una instancia de la clase TextAnalyticsClient . Necesitará un punto de conexión y una clave de API o TokenCredential para crear instancias de un objeto de cliente. Para más información sobre la autenticación con Cognitive Services, consulte Autenticación de solicitudes en Azure Cognitive Services.

Obtención de una clave de API

Puede obtener y API key desde la endpoint información del recurso de Cognitive Services o del servicio de lenguaje en Azure Portal.

Como alternativa, use el fragmento de código de la CLI de Azure siguiente para obtener la clave de API del recurso del servicio de lenguaje.

az cognitiveservices account keys list --resource-group <your-resource-group-name> --name <your-resource-name>

Creación de un TextAnalyticsClient mediante una credencial de clave de API

Una vez que tenga el valor de la clave de API, cree un AzureKeyCredential. Esto le permitirá actualizar la clave de API sin crear un nuevo cliente.

Con el valor del punto de conexión y un AzureKeyCredential, puede crear TextAnalyticsClient:

Uri endpoint = new("<endpoint>");
AzureKeyCredential credential = new("<apiKey>");
TextAnalyticsClient client = new(endpoint, credential);

Creación de un TextAnalyticsClient con una credencial de Azure Active Directory

La autenticación de clave de API de cliente se usa en la mayoría de los ejemplos de esta guía de introducción, pero también puede autenticarse con Azure Active Directory mediante la biblioteca de identidades de Azure. Tenga en cuenta que los puntos de conexión regionales no admiten la autenticación de AAD. Cree un subdominio personalizado para el recurso con el fin de usar este tipo de autenticación.

Para usar el proveedor DefaultAzureCredential que se muestra a continuación u otros proveedores de credenciales proporcionados con el SDK de Azure, instale el paquete Azure.Identity:

dotnet add package Azure.Identity

También tendrá que registrar una nueva aplicación de AAD y conceder acceso al servicio de lenguaje mediante la asignación del rol a la "Cognitive Services User" entidad de servicio.

Establezca los valores del identificador de cliente, el identificador de inquilino y el secreto de cliente de la aplicación de AAD como variables de entorno: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET.

Uri endpoint = new("<endpoint>");
TextAnalyticsClient client = new(endpoint, new DefaultAzureCredential());

Conceptos clave

TextAnalyticsClient

A TextAnalyticsClient es la interfaz principal para los desarrolladores que usan la biblioteca cliente de Text Analytics. Proporciona operaciones sincrónicas y asincrónicas para acceder a un uso específico del análisis de texto, como la detección de idioma o la extracción de frases clave.

Entrada

Un documento es una sola unidad de entrada que analizarán los modelos predictivos en el servicio Lenguaje. Las operaciones en TextAnalyticsClient pueden tomar un único documento o una colección de documentos que se van a analizar como un lote. Para conocer los límites de longitud del documento, el tamaño máximo del lote y la codificación de texto admitidas, consulte aquí.

Operación en varios documentos

Para cada operación admitida, TextAnalyticsClient proporciona un método que acepta un lote de documentos como cadenas, o un lote de cualquiera TextDocumentInput de los objetos o DetectLanguageInput . Estos métodos permiten a los autores de llamadas proporcionar a cada documento un identificador único, indicar que los documentos del lote se escriben en idiomas diferentes o proporcionan una sugerencia de país sobre el idioma del documento.

Nota: Se recomienda usar los métodos por lotes al trabajar en entornos de producción, ya que permiten enviar una solicitud con varios documentos. Esto es más eficaz que enviar una solicitud por cada documento.

Valor devuelto

Los valores devueltos, como AnalyzeSentimentResult, son el resultado de una operación de Text Analytics, que contiene una predicción o predicciones sobre un único documento. Opcionalmente, el valor devuelto de una operación también puede incluir información sobre el documento y cómo se procesó.

Colección de valores devueltos

Una colección de valores devueltos, como AnalyzeSentimentResultCollection, es una colección de resultados de la operación, donde cada uno corresponde a uno de los documentos proporcionados en el lote de entrada. Un documento y su resultado tendrán el mismo índice en las colecciones de entrada y resultados. El valor devuelto también contiene una HasError propiedad que permite identificar si una operación ejecutada se ejecutó correctamente o no se realizó correctamente para el documento especificado. Opcionalmente, puede incluir información sobre el lote de documentos y cómo se procesó.

Operaciones de Long-Running

Para documentos grandes que tardan mucho tiempo en ejecutarse, estas operaciones se implementan como operaciones de larga duración. Las operaciones de larga duración constan de una solicitud inicial enviada al servicio para iniciar una operación, seguida de sondear el servicio a intervalos para determinar si la operación se ha completado o no, y si se ha realizado correctamente, para obtener el resultado.

Para las operaciones de larga duración en el SDK de Azure, el cliente expone un Start<operation-name> método que devuelve o Operation<T> .PageableOperation<T> Puede usar el método WaitForCompletionAsync() de extensión para esperar a que se complete la operación y obtener su resultado. A continuación se proporciona un fragmento de código de ejemplo para ilustrar el uso de operaciones de larga duración.

Seguridad para subprocesos

Garantizamos que todos los métodos de instancia de cliente sean seguros para subprocesos e independientes entre sí (guía). Esto garantiza que la recomendación de reutilizar instancias de cliente siempre es segura, incluso entre subprocesos.

Conceptos adicionales

Opciones | de clienteAcceso a la respuesta | Control de errores | Diagnóstico | Burla | Duración del cliente

Ejemplos

En la sección siguiente se proporcionan varios fragmentos de código mediante el clientcreado anteriormente y se tratan las características principales presentes en esta biblioteca cliente. Aunque la mayoría de los fragmentos de código siguientes usan llamadas de servicio sincrónicas, tenga en cuenta que el Azure.AI.TextAnalytics paquete admite API sincrónicas y asincrónicas.

Ejemplos de sincronización

Ejemplos asincrónicos

Detección de idioma

Ejecute un modelo predictivo para determinar el lenguaje en el que se escribe el documento o lote de documentos pasados.

string document =
    "Este documento está escrito en un lenguaje diferente al inglés. Su objectivo es demostrar cómo"
    + " invocar el método de Detección de Lenguaje del servicio de Text Analytics en Microsoft Azure."
    + " También muestra cómo acceder a la información retornada por el servicio. Esta funcionalidad es"
    + " útil para los sistemas de contenido que recopilan texto arbitrario, donde el lenguaje no se conoce"
    + " de antemano. Puede usarse para detectar una amplia gama de lenguajes, variantes, dialectos y"
    + " algunos idiomas regionales o culturales.";

try
{
    Response<DetectedLanguage> response = client.DetectLanguage(document);
    DetectedLanguage language = response.Value;

    Console.WriteLine($"Detected language is {language.Name} with a confidence score of {language.ConfidenceScore}.");
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Para obtener ejemplos sobre el uso de la opción DetectLanguageBatch recomendada de producción, consulte aquí.

Consulte la documentación del servicio para obtener una explicación conceptual de la detección de idioma.

Análisis de opiniones

Ejecute un modelo predictivo para determinar la opinión positiva, negativa, neutra o mixta contenida en el documento o lote de documentos pasados.

string document =
    "I had the best day of my life. I decided to go sky-diving and it made me appreciate my whole life so"
    + "much more. I developed a deep-connection with my instructor as well, and I feel as if I've made a"
    + "life-long friend in her.";

try
{
    Response<DocumentSentiment> response = client.AnalyzeSentiment(document);
    DocumentSentiment docSentiment = response.Value;

    Console.WriteLine($"Document sentiment is {docSentiment.Sentiment} with: ");
    Console.WriteLine($"  Positive confidence score: {docSentiment.ConfidenceScores.Positive}");
    Console.WriteLine($"  Neutral confidence score: {docSentiment.ConfidenceScores.Neutral}");
    Console.WriteLine($"  Negative confidence score: {docSentiment.ConfidenceScores.Negative}");
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Para obtener ejemplos sobre el uso de la opción AnalyzeSentimentBatch recomendada de producción, consulte aquí.

Para obtener información más detallada sobre las opiniones relacionadas con los objetivos de un producto o servicio, también conocido como Análisis de sentimiento basado en aspectos en procesamiento de lenguaje natural (NLP), consulte aquí un ejemplo sobre el análisis de sentimiento con minería de opiniones.

Consulte la documentación del servicio para obtener una explicación conceptual del análisis de sentimiento.

Extracción de frases clave

Ejecute un modelo para identificar una colección de frases significativas que se encuentran en el documento o lote de documentos pasados.

string document =
    "My cat might need to see a veterinarian. It has been sneezing more than normal, and although my"
    + " little sister thinks it is funny, I am worried it has the cold that I got last week. We are going"
    + " to call tomorrow and try to schedule an appointment for this week. Hopefully it will be covered by"
    + " the cat's insurance. It might be good to not let it sleep in my room for a while.";

try
{
    Response<KeyPhraseCollection> response = client.ExtractKeyPhrases(document);
    KeyPhraseCollection keyPhrases = response.Value;

    Console.WriteLine($"Extracted {keyPhrases.Count} key phrases:");
    foreach (string keyPhrase in keyPhrases)
    {
        Console.WriteLine($"  {keyPhrase}");
    }
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Para obtener ejemplos sobre el uso de la opción ExtractKeyPhrasesBatch recomendada de producción, consulte aquí.

Consulte la documentación del servicio para obtener una explicación conceptual de la extracción de frases clave.

Reconocimiento de entidades con nombre

Ejecute un modelo predictivo para identificar una colección de entidades con nombre en el documento o lote de documentos pasados y clasificar esas entidades en categorías como persona, ubicación u organización. Para obtener más información sobre las categorías disponibles, consulte Text Analytics Categorías de entidad con nombre.

string document =
    "We love this trail and make the trip every year. The views are breathtaking and well worth the hike!"
    + " Yesterday was foggy though, so we missed the spectacular views. We tried again today and it was"
    + " amazing. Everyone in my family liked the trail although it was too challenging for the less"
    + " athletic among us. Not necessarily recommended for small children. A hotel close to the trail"
    + " offers services for childcare in case you want that.";

try
{
    Response<CategorizedEntityCollection> response = client.RecognizeEntities(document);
    CategorizedEntityCollection entitiesInDocument = response.Value;

    Console.WriteLine($"Recognized {entitiesInDocument.Count} entities:");
    foreach (CategorizedEntity entity in entitiesInDocument)
    {
        Console.WriteLine($"  Text: {entity.Text}");
        Console.WriteLine($"  Offset: {entity.Offset}");
        Console.WriteLine($"  Length: {entity.Length}");
        Console.WriteLine($"  Category: {entity.Category}");
        if (!string.IsNullOrEmpty(entity.SubCategory))
            Console.WriteLine($"  SubCategory: {entity.SubCategory}");
        Console.WriteLine($"  Confidence score: {entity.ConfidenceScore}");
        Console.WriteLine();
    }
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Para obtener ejemplos sobre el uso de la opción RecognizeEntitiesBatch recomendada de producción, consulte aquí.

Consulte la documentación del servicio para obtener una explicación conceptual del reconocimiento de entidades con nombre.

Reconocimiento de entidades DE PII

Ejecute un modelo predictivo para identificar una colección de entidades que contengan información de identificación personal encontrada en el documento o lote de documentos pasados, y clasifique esas entidades en categorías como el número de seguridad social de EE. UU., el número de licencia de conducir o el número de tarjeta de crédito.

string document =
    "Parker Doe has repaid all of their loans as of 2020-04-25. Their SSN is 859-98-0987. To contact them,"
    + " use their phone number 800-102-1100. They are originally from Brazil and have document ID number"
    + " 998.214.865-68.";

try
{
    Response<PiiEntityCollection> response = client.RecognizePiiEntities(document);
    PiiEntityCollection entities = response.Value;

    Console.WriteLine($"Redacted Text: {entities.RedactedText}");
    Console.WriteLine();
    Console.WriteLine($"Recognized {entities.Count} PII entities:");
    foreach (PiiEntity entity in entities)
    {
        Console.WriteLine($"  Text: {entity.Text}");
        Console.WriteLine($"  Category: {entity.Category}");
        if (!string.IsNullOrEmpty(entity.SubCategory))
            Console.WriteLine($"  SubCategory: {entity.SubCategory}");
        Console.WriteLine($"  Confidence score: {entity.ConfidenceScore}");
        Console.WriteLine();
    }
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Para obtener ejemplos sobre el uso de la opción RecognizePiiEntitiesBatch recomendada de producción, consulte aquí.

Consulte la documentación del servicio para conocer los tipos de entidad piI admitidos.

Reconocimiento de entidades vinculadas

Ejecute un modelo predictivo para identificar una colección de entidades encontradas en el documento o lote de documentos pasados e incluya información que vincule las entidades a sus entradas correspondientes en un knowledge base conocido.

string document =
    "Microsoft was founded by Bill Gates with some friends he met at Harvard. One of his friends, Steve"
    + " Ballmer, eventually became CEO after Bill Gates as well. Steve Ballmer eventually stepped down as"
    + " CEO of Microsoft, and was succeeded by Satya Nadella. Microsoft originally moved its headquarters"
    + " to Bellevue, Washington in Januaray 1979, but is now headquartered in Redmond.";

try
{
    Response<LinkedEntityCollection> response = client.RecognizeLinkedEntities(document);
    LinkedEntityCollection linkedEntities = response.Value;

    Console.WriteLine($"Recognized {linkedEntities.Count} entities:");
    foreach (LinkedEntity linkedEntity in linkedEntities)
    {
        Console.WriteLine($"  Name: {linkedEntity.Name}");
        Console.WriteLine($"  Language: {linkedEntity.Language}");
        Console.WriteLine($"  Data Source: {linkedEntity.DataSource}");
        Console.WriteLine($"  URL: {linkedEntity.Url}");
        Console.WriteLine($"  Entity Id in Data Source: {linkedEntity.DataSourceEntityId}");
        foreach (LinkedEntityMatch match in linkedEntity.Matches)
        {
            Console.WriteLine($"    Match Text: {match.Text}");
            Console.WriteLine($"    Offset: {match.Offset}");
            Console.WriteLine($"    Length: {match.Length}");
            Console.WriteLine($"    Confidence score: {match.ConfidenceScore}");
        }
        Console.WriteLine();
    }
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Para obtener ejemplos sobre el uso de la opción RecognizeLinkedEntitiesBatch recomendada de producción, consulte aquí.

Consulte la documentación del servicio para obtener una explicación conceptual de la vinculación de entidades.

Detectar lenguaje de forma asincrónica

Ejecute un modelo predictivo para determinar el lenguaje en el que se escribe el documento o lote de documentos pasados.

string document =
    "Este documento está escrito en un lenguaje diferente al inglés. Su objectivo es demostrar cómo"
    + " invocar el método de Detección de Lenguaje del servicio de Text Analytics en Microsoft Azure."
    + " También muestra cómo acceder a la información retornada por el servicio. Esta funcionalidad es"
    + " útil para los sistemas de contenido que recopilan texto arbitrario, donde el lenguaje no se conoce"
    + " de antemano. Puede usarse para detectar una amplia gama de lenguajes, variantes, dialectos y"
    + " algunos idiomas regionales o culturales.";

try
{
    Response<DetectedLanguage> response = await client.DetectLanguageAsync(document);
    DetectedLanguage language = response.Value;

    Console.WriteLine($"Detected language is {language.Name} with a confidence score of {language.ConfidenceScore}.");
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Reconocer entidades con nombre de forma asincrónica

Ejecute un modelo predictivo para identificar una colección de entidades con nombre en el documento o lote de documentos pasados y clasificar esas entidades en categorías como persona, ubicación u organización. Para obtener más información sobre las categorías disponibles, consulte Text Analytics Categorías de entidad con nombre.

string document =
    "We love this trail and make the trip every year. The views are breathtaking and well worth the hike!"
    + " Yesterday was foggy though, so we missed the spectacular views. We tried again today and it was"
    + " amazing. Everyone in my family liked the trail although it was too challenging for the less"
    + " athletic among us. Not necessarily recommended for small children. A hotel close to the trail"
    + " offers services for childcare in case you want that.";

try
{
    Response<CategorizedEntityCollection> response = await client.RecognizeEntitiesAsync(document);
    CategorizedEntityCollection entitiesInDocument = response.Value;

    Console.WriteLine($"Recognized {entitiesInDocument.Count} entities:");
    foreach (CategorizedEntity entity in entitiesInDocument)
    {
        Console.WriteLine($"  Text: {entity.Text}");
        Console.WriteLine($"  Offset: {entity.Offset}");
        Console.WriteLine($"  Length: {entity.Length}");
        Console.WriteLine($"  Category: {entity.Category}");
        if (!string.IsNullOrEmpty(entity.SubCategory))
            Console.WriteLine($"  SubCategory: {entity.SubCategory}");
        Console.WriteLine($"  Confidence score: {entity.ConfidenceScore}");
        Console.WriteLine();
    }
}
catch (RequestFailedException exception)
{
    Console.WriteLine($"Error Code: {exception.ErrorCode}");
    Console.WriteLine($"Message: {exception.Message}");
}

Análisis de entidades sanitarias de forma asincrónica

Text Analytics para el estado es un servicio de contenedor que extrae y etiqueta información médica pertinente de textos no estructurados, como notas del doctor, resúmenes de descarga, documentos clínicos y registros electrónicos de salud. Para obtener más información, vea Cómo: Usar Text Analytics para el estado.

string documentA =
    "RECORD #333582770390100 | MH | 85986313 | | 054351 | 2/14/2001 12:00:00 AM |"
    + " CORONARY ARTERY DISEASE | Signed | DIS |"
    + Environment.NewLine
    + " Admission Date: 5/22/2001 Report Status: Signed Discharge Date: 4/24/2001"
    + " ADMISSION DIAGNOSIS: CORONARY ARTERY DISEASE."
    + Environment.NewLine
    + " HISTORY OF PRESENT ILLNESS: The patient is a 54-year-old gentleman with a history of progressive"
    + " angina over the past several months. The patient had a cardiac catheterization in July of this"
    + " year revealing total occlusion of the RCA and 50% left main disease, with a strong family history"
    + " of coronary artery disease with a brother dying at the age of 52 from a myocardial infarction and"
    + " another brother who is status post coronary artery bypass grafting. The patient had a stress"
    + " echocardiogram done on July, 2001, which showed no wall motion abnormalities, but this was a"
    + " difficult study due to body habitus. The patient went for six minutes with minimal ST depressions"
    + " in the anterior lateral leads, thought due to fatigue and wrist pain, his anginal equivalent. Due"
    + " to the patient'sincreased symptoms and family history and history left main disease with total"
    + " occasional of his RCA was referred for revascularization with open heart surgery.";

string documentB = "Prescribed 100mg ibuprofen, taken twice daily.";

// Prepare the input of the text analysis operation. You can add multiple documents to this list and
// perform the same operation on all of them simultaneously.
List<string> batchedDocuments = new()
{
    documentA,
    documentB
};

// Perform the text analysis operation.
AnalyzeHealthcareEntitiesOperation operation = await client.AnalyzeHealthcareEntitiesAsync(WaitUntil.Completed, batchedDocuments);

Console.WriteLine($"The operation has completed.");
Console.WriteLine();

// View the operation status.
Console.WriteLine($"Created On   : {operation.CreatedOn}");
Console.WriteLine($"Expires On   : {operation.ExpiresOn}");
Console.WriteLine($"Id           : {operation.Id}");
Console.WriteLine($"Status       : {operation.Status}");
Console.WriteLine($"Last Modified: {operation.LastModified}");
Console.WriteLine();

// View the operation results.
await foreach (AnalyzeHealthcareEntitiesResultCollection documentsInPage in operation.Value)
{
    Console.WriteLine($"Analyze Healthcare Entities, model version: \"{documentsInPage.ModelVersion}\"");
    Console.WriteLine();

    foreach (AnalyzeHealthcareEntitiesResult documentResult in documentsInPage)
    {
        if (documentResult.HasError)
        {
            Console.WriteLine($"  Error!");
            Console.WriteLine($"  Document error code: {documentResult.Error.ErrorCode}");
            Console.WriteLine($"  Message: {documentResult.Error.Message}");
            continue;
        }

        Console.WriteLine($"  Recognized the following {documentResult.Entities.Count} healthcare entities:");
        Console.WriteLine();

        // View the healthcare entities that were recognized.
        foreach (HealthcareEntity entity in documentResult.Entities)
        {
            Console.WriteLine($"  Entity: {entity.Text}");
            Console.WriteLine($"  Category: {entity.Category}");
            Console.WriteLine($"  Offset: {entity.Offset}");
            Console.WriteLine($"  Length: {entity.Length}");
            Console.WriteLine($"  NormalizedText: {entity.NormalizedText}");
            Console.WriteLine($"  Links:");

            // View the entity data sources.
            foreach (EntityDataSource entityDataSource in entity.DataSources)
            {
                Console.WriteLine($"    Entity ID in Data Source: {entityDataSource.EntityId}");
                Console.WriteLine($"    DataSource: {entityDataSource.Name}");
            }

            // View the entity assertions.
            if (entity.Assertion is not null)
            {
                Console.WriteLine($"  Assertions:");

                if (entity.Assertion?.Association is not null)
                {
                    Console.WriteLine($"    Association: {entity.Assertion?.Association}");
                }

                if (entity.Assertion?.Certainty is not null)
                {
                    Console.WriteLine($"    Certainty: {entity.Assertion?.Certainty}");
                }

                if (entity.Assertion?.Conditionality is not null)
                {
                    Console.WriteLine($"    Conditionality: {entity.Assertion?.Conditionality}");
                }
            }
        }

        Console.WriteLine($"  We found {documentResult.EntityRelations.Count} relations in the current document:");
        Console.WriteLine();

        // View the healthcare entity relations that were recognized.
        foreach (HealthcareEntityRelation relation in documentResult.EntityRelations)
        {
            Console.WriteLine($"    Relation: {relation.RelationType}");
            if (relation.ConfidenceScore is not null)
            {
                Console.WriteLine($"    ConfidenceScore: {relation.ConfidenceScore}");
            }
            Console.WriteLine($"    For this relation there are {relation.Roles.Count} roles");

            // View the relation roles.
            foreach (HealthcareEntityRelationRole role in relation.Roles)
            {
                Console.WriteLine($"      Role Name: {role.Name}");

                Console.WriteLine($"      Associated Entity Text: {role.Entity.Text}");
                Console.WriteLine($"      Associated Entity Category: {role.Entity.Category}");
                Console.WriteLine();
            }

            Console.WriteLine();
        }

        Console.WriteLine();
    }
}

Ejecutar varias acciones de forma asincrónica

Esta funcionalidad permite ejecutar varias acciones en uno o varios documentos. Las acciones incluyen:

  • Reconocimiento de entidades con nombre
  • Reconocimiento de entidades de PII
  • Reconocimiento de entidades vinculadas
  • Extracción de frases clave
  • Análisis de sentimiento
  • Reconocimiento de entidades sanitarias (consulte el ejemplo aquí)
  • Reconocimiento personalizado de entidades con nombre (consulte el ejemplo aquí)
  • Clasificación personalizada de etiquetas únicas (consulte el ejemplo aquí)
  • Clasificación personalizada de varias etiquetas (consulte el ejemplo aquí)
    string documentA =
        "We love this trail and make the trip every year. The views are breathtaking and well worth the hike!"
        + " Yesterday was foggy though, so we missed the spectacular views. We tried again today and it was"
        + " amazing. Everyone in my family liked the trail although it was too challenging for the less"
        + " athletic among us.";

    string documentB =
        "Last week we stayed at Hotel Foo to celebrate our anniversary. The staff knew about our anniversary"
        + " so they helped me organize a little surprise for my partner. The room was clean and with the"
        + " decoration I requested. It was perfect!";

    // Prepare the input of the text analysis operation. You can add multiple documents to this list and
    // perform the same operation on all of them simultaneously.
    List<string> batchedDocuments = new()
    {
        documentA,
        documentB
    };

    TextAnalyticsActions actions = new()
    {
        ExtractKeyPhrasesActions = new List<ExtractKeyPhrasesAction>() { new ExtractKeyPhrasesAction() { ActionName = "ExtractKeyPhrasesSample" } },
        RecognizeEntitiesActions = new List<RecognizeEntitiesAction>() { new RecognizeEntitiesAction() { ActionName = "RecognizeEntitiesSample" } },
        DisplayName = "AnalyzeOperationSample"
    };

    // Perform the text analysis operation.
    AnalyzeActionsOperation operation = await client.AnalyzeActionsAsync(WaitUntil.Completed, batchedDocuments, actions);

    // View the operation status.
    Console.WriteLine($"Created On   : {operation.CreatedOn}");
    Console.WriteLine($"Expires On   : {operation.ExpiresOn}");
    Console.WriteLine($"Id           : {operation.Id}");
    Console.WriteLine($"Status       : {operation.Status}");
    Console.WriteLine($"Last Modified: {operation.LastModified}");
    Console.WriteLine();

    if (!string.IsNullOrEmpty(operation.DisplayName))
    {
        Console.WriteLine($"Display name: {operation.DisplayName}");
        Console.WriteLine();
    }

    Console.WriteLine($"Total actions: {operation.ActionsTotal}");
    Console.WriteLine($"  Succeeded actions: {operation.ActionsSucceeded}");
    Console.WriteLine($"  Failed actions: {operation.ActionsFailed}");
    Console.WriteLine($"  In progress actions: {operation.ActionsInProgress}");
    Console.WriteLine();

    await foreach (AnalyzeActionsResult documentsInPage in operation.Value)
    {
        IReadOnlyCollection<ExtractKeyPhrasesActionResult> keyPhrasesResults = documentsInPage.ExtractKeyPhrasesResults;
        IReadOnlyCollection<RecognizeEntitiesActionResult> entitiesResults = documentsInPage.RecognizeEntitiesResults;

        Console.WriteLine("Recognized Entities");
        int docNumber = 1;
        foreach (RecognizeEntitiesActionResult entitiesActionResults in entitiesResults)
        {
            Console.WriteLine($" Action name: {entitiesActionResults.ActionName}");
            Console.WriteLine();
            foreach (RecognizeEntitiesResult documentResult in entitiesActionResults.DocumentsResults)
            {
                Console.WriteLine($" Document #{docNumber++}");
                Console.WriteLine($"  Recognized {documentResult.Entities.Count} entities:");

                foreach (CategorizedEntity entity in documentResult.Entities)
                {
                    Console.WriteLine();
                    Console.WriteLine($"    Entity: {entity.Text}");
                    Console.WriteLine($"    Category: {entity.Category}");
                    Console.WriteLine($"    Offset: {entity.Offset}");
                    Console.WriteLine($"    Length: {entity.Length}");
                    Console.WriteLine($"    ConfidenceScore: {entity.ConfidenceScore}");
                    Console.WriteLine($"    SubCategory: {entity.SubCategory}");
                }
                Console.WriteLine();
            }
        }

        Console.WriteLine("Extracted Key Phrases");
        docNumber = 1;
        foreach (ExtractKeyPhrasesActionResult keyPhrasesActionResult in keyPhrasesResults)
        {
            Console.WriteLine($" Action name: {keyPhrasesActionResult.ActionName}");
            Console.WriteLine();
            foreach (ExtractKeyPhrasesResult documentResults in keyPhrasesActionResult.DocumentsResults)
            {
                Console.WriteLine($" Document #{docNumber++}");
                Console.WriteLine($"  Recognized the following {documentResults.KeyPhrases.Count} Keyphrases:");

                foreach (string keyphrase in documentResults.KeyPhrases)
                {
                    Console.WriteLine($"    {keyphrase}");
                }
                Console.WriteLine();
            }
        }
    }
}

Solución de problemas

General

Al interactuar con Cognitive Services for Language mediante el SDK de .NET Text Analytics, los errores devueltos por el servicio de lenguaje corresponden a los mismos códigos de estado HTTP devueltos para las solicitudes de la API REST.

Por ejemplo, si envía un lote de entradas de documento de texto que contienen identificadores de documento duplicados, se devuelve un 400 error que indica "Solicitud incorrecta".

try
{
    DetectedLanguage result = client.DetectLanguage(document);
}
catch (RequestFailedException e)
{
    Console.WriteLine(e.ToString());
}

Observará que se registra información adicional, como el identificador de solicitud de cliente de la operación.

Message:
    Azure.RequestFailedException:
    Status: 400 (Bad Request)

Content:
    {"error":{"code":"InvalidRequest","innerError":{"code":"InvalidDocument","message":"Request contains duplicated Ids. Make sure each document has a unique Id."},"message":"Invalid document in request."}}

Headers:
    Transfer-Encoding: chunked
    x-aml-ta-request-id: 146ca04a-af54-43d4-9872-01a004bee5f8
    X-Content-Type-Options: nosniff
    x-envoy-upstream-service-time: 6
    apim-request-id: c650acda-2b59-4ff7-b96a-e316442ea01b
    Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
    Date: Wed, 18 Dec 2019 16:24:52 GMT
    Content-Type: application/json; charset=utf-8

Configuración del registro de la consola

La manera más sencilla de ver los registros es habilitar el registro de la consola. Para crear un agente de escucha de registro del SDK de Azure que genere mensajes en la consola, use el método AzureEventSourceListener.CreateConsoleLogger.

// Setup a listener to monitor logged events.
using AzureEventSourceListener listener = AzureEventSourceListener.CreateConsoleLogger();

Para más información sobre otros mecanismos de registro, consulte aquí.

Pasos siguientes

Los ejemplos que muestran cómo usar esta biblioteca cliente están disponibles en este repositorio de GitHub. Se proporcionan ejemplos para cada área funcional principal y, para cada área, se proporcionan ejemplos para analizar un único documento y una colección de documentos en modo sincronizado y asincrónico.

Ejemplos avanzados

Contribuir

Consulte la CONTRIBUTING.md para obtener más información sobre la compilación, las pruebas y la contribución a esta biblioteca.

Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para obtener más información, visite cla.microsoft.com.

Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo será necesario que lo haga una vez en todos los repositorios con nuestro CLA.

Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.

Impresiones