Amazon Comprehend: Guía rápida
Tags: aws, python, spanish, machinelearning
Published: 2022-07-06 16:43:54

## Motivación

En la actualidad las aplicaciones necesitan una mayor velocidad de desarrollo. La inclusión de funcionalidades que implican el uso de machine learning se ha vuelto cada vez mayor.

Amazon Web Services a desarrollado un conjunto de servicios que te permiten rápidamente agregar características de machine learning a tus aplicaciones.

Amazon Comprehend es un servicio de procesamiento de lenguaje natural (NLP) que utiliza machine learning para extraer información de datos en formato de texto.

## Introducción

Amazon Comprehend provee de un conjunto de APIs con las que podemos interactuar y obtener resultados sobre el análisis de textos. Estas APIs retornan como respuesta la inferencia que realiza sobre los datos que le enviamos a modelos entrenados por los expertos que trabajan en AWS.

## Características

En esta sección vamos a revisar las capacidades del servicio y su uso a través de Python. Para los siguientes ejemplos utilizaremos el siguiente texto:

```
sample_text = '''
Hello Zhang Wei. Your AnyCompany Financial Services, LLC credit card account 1111-0000-1111-0000 has a minimum payment of $24.53 that is due by July 31st. Based on your autopay settings, we will withdraw your payment on the due date from your bank account XXXXXX1111 with the routing number XXXXX0000. 
Your latest statement was mailed to 100 Main Street, Anytown, WA 98121. 
After your payment is received, you will receive a confirmation text message at 206-555-0100. 
If you have questions about your bill, AnyCompany Customer Service is available by phone at 206-555-0199 or email at support@anycompany.com.
'''
```

## 1 Detección del idioma dominante

Con esta API podemos examinar el texto y determinar el idioma dominante, debido a que un texto puede contener palabras o frases en diferentes idiomas. A continuación presentare el código en Python

```
comprehend = boto3.client('comprehend')

detected_language = comprehend.detect_dominant_language(
   Text=sample_text
)
```
En la variable _detected_language_ tendremos la respuesta a la API, si imprimíos el contenido de la variable veremos el siguiente resultado:

```
{
    "Languages": [
        {
            "LanguageCode": "en",
            "Score": 0.9913273453712463
        }
    ],
    "ResponseMetadata": {
        "HTTPHeaders": {
            "content-length": "64",
            "content-type": "application/x-amz-json-1.1",
            "date": "Wed, 06 Jul 2022 03:38:30 GMT",
            "x-amzn-requestid": "38e68cdc-c3a3-4b1c-897d-c86f9c5f0f63"
        },
        "HTTPStatusCode": 200,
        "RequestId": "38e68cdc-c3a3-4b1c-897d-c86f9c5f0f63",
        "RetryAttempts": 0
    }
}
```
Observamos que el lenguaje detectado fue ingles(en) con un puntaje de 99.1%

## 2 Detección de entidades

Con la API de detección de entidades podemos extraer los siguientes tipos de entidades:

| Tipo  | Descripción  |
|---|---|
|COMMERCIAL_ITEM|Un producto de marca|
|FECHA|Una fecha completa (por ejemplo, 25/11/2017), día (martes), mes (mayo) u hora (8:30 a.m.).|
|EVENT|Un evento, como un festival, un concierto, una elección, etc.|
|LOCATION|Una ubicación específica, como un país, una ciudad, un lago, un edificio, etc.|
|ORGANIZACIÓN|Organizaciones grandes, como un gobierno, una empresa, una religión, un equipo deportivo, etc.|
|OTHER|Entidades que no encajan en ninguna de las otra categorías.|
|PERSON|Individuos, grupos de personas, apodos, personajes ficticios.|
|QUANTITY|Importe cuantificado, como moneda, porcentajes, números, bytes, etc.|
|TITLE|Nombre oficial dado a cualquier creación o obra creativa, como películas, libros, canciones, etc.|

Ahora vamos a revisar el código en python

```
comprehend = boto3.client('comprehend')

detected_entities = comprehend.detect_entities(
   Text=sample_text,
   LanguageCode='en'
)
```
En la variable _detected_entities_ tenemos la respuesta de la API si revisamos el contenido de la variable tendremos el siguiente contenido:

```
{
    "Entities": [
        {
            "BeginOffset": 7,
            "EndOffset": 16,
            "Score": 0.9993807077407837,
            "Text": "Zhang Wei",
            "Type": "PERSON"
        },
        {
            "BeginOffset": 23,
            "EndOffset": 57,
            "Score": 0.9996546506881714,
            "Text": "AnyCompany Financial Services, LLC",
            "Type": "ORGANIZATION"
        },
        {
            "BeginOffset": 78,
            "EndOffset": 97,
            "Score": 0.9905166029930115,
            "Text": "1111-0000-1111-0000",
            "Type": "OTHER"
        },
        ...
    ],
    "ResponseMetadata": {
        "HTTPHeaders": {
            "content-length": "1276",
            "content-type": "application/x-amz-json-1.1",
            "date": "Wed, 06 Jul 2022 03:14:41 GMT",
            "x-amzn-requestid": "0c7eefa0-c332-4f82-a93c-ab18cd47a15f"
        },
        "HTTPStatusCode": 200,
        "RequestId": "0c7eefa0-c332-4f82-a93c-ab18cd47a15f",
        "RetryAttempts": 0
    }
}
```
Dentro de _Entities_ tenemos cada una de las entidades detectadas. Cada entidad tiene los siguientes atributos:

- BeginOffset: Posición donde inicia la palabra en el texto
- EndOffset: Posición donde termina la palabra en el texto
- Score: Puntaje de certeza de detección de entidad
- Text: El nombre de la entidad
- Type: El tipo de entidad

## 3 Deteccion de frases clave

Puedes utilizar esta API para buscar frases clave en el documento. Por lo general, consiste en un sustantivo y los modificadores que lo distinguen. Por ejemplo, "día" es un sustantivo; "un día hermoso" es una frase sustantiva que incluye un artículo ("un") y un adjetivo ("hermoso").

A continuación revisaremos el código en python

```
comprehend = boto3.client('comprehend')

detected_key_phrases = comprehend.detect_key_phrases(
   Text=sample_text, 
   LanguageCode='en'
)
```
Revisando la variable _detected_key_phrases_ tendremos la siguiente respuesta:

```
{
    "KeyPhrases": [
        {
            "BeginOffset": 1,
            "EndOffset": 16,
            "Score": 0.8426344990730286,
            "Text": "Hello Zhang Wei"
        },
        {
            "BeginOffset": 18,
            "EndOffset": 52,
            "Score": 0.9881375432014465,
            "Text": "Your AnyCompany Financial Services"
        },
        {
            "BeginOffset": 54,
            "EndOffset": 97,
            "Score": 0.8444651961326599,
            "Text": "LLC credit card account 1111-0000-1111-0000"
        },
        {
            "BeginOffset": 102,
            "EndOffset": 119,
            "Score": 0.9999476075172424,
            "Text": "a minimum payment"
        },
        ...
    ],
    "ResponseMetadata": {
        "HTTPHeaders": {
            "content-length": "2096",
            "content-type": "application/x-amz-json-1.1",
            "date": "Wed, 06 Jul 2022 04:19:43 GMT",
            "x-amzn-requestid": "d772098b-c82d-49b8-b4fe-029ac108b375"
        },
        "HTTPStatusCode": 200,
        "RequestId": "d772098b-c82d-49b8-b4fe-029ac108b375",
        "RetryAttempts": 0
    }
}
```
Como se observa en la respuesta, la API nos retorna todas las frases clave.

## 4 Determinar el sentimiento

Con esta API podemos determinar si el sentimiento es positivo, negativo, neutral o mixto. Por ejemplo, se puede utilizar el análisis de sentimientos para analizar los comentarios en un blog y saber si a los lectores les gusto la publicación.

Ahora revisaremos el código en python

```
comprehend = boto3.client('comprehend')

detected_sentiment = comprehend.detect_sentiment(
   Text=sample_text, 
   LanguageCode='en'
)
```
Si revelamos el contenido de la variable _detected_sentiment_ tendremos:

```
{
    "ResponseMetadata": {
        "HTTPHeaders": {
            "content-length": "163",
            "content-type": "application/x-amz-json-1.1",
            "date": "Wed, 06 Jul 2022 04:27:42 GMT",
            "x-amzn-requestid": "ca289ed1-65f4-4e6f-87e4-468b5a88ae60"
        },
        "HTTPStatusCode": 200,
        "RequestId": "ca289ed1-65f4-4e6f-87e4-468b5a88ae60",
        "RetryAttempts": 0
    },
    "Sentiment": "NEUTRAL",
    "SentimentScore": {
        "Mixed": 9.69591928878799e-06,
        "Negative": 0.016147520393133163,
        "Neutral": 0.9832557439804077,
        "Positive": 0.0005869901506230235
    }
}
```
En _Sentiment_ tenemos el sentimiento detectado y en _SentimentScore_ tendremos el puntaje de las otras opciones.

## 5 Analisis de la sintaxis

Con esta API podemos identificar los sustantivos, verbos, adjetivos, etc. en el documento. Amazon Comprehend puede identificar 17 tipos de Tokens.

|Token|Parte del discurso|
|---|---|
|ADJ|Adjetivo|
|ADP|Adposición|
|ADV|Adverbio|
|AUX|Auxiliary|
|CONJ|Coordinación de la conjunción|
|DET|Determinador|
|INTJ|Interjección|
|SUSTANTIVO|Nombre|
|NUM|Numérico|
|O|Otros|
|PART|Partícula|
|PRON|Pronombre|
|PROPÓN|Nombre adecuado|
|PUNTAR|Puntuación|
|SCONJ|conjunción subordinante|
|SYM|Símbolo|
|VERB|Verbo|

A continuación presento el código en python

```
comprehend = boto3.client('comprehend')

detected_syntax = comprehend.detect_syntax(
   Text=sample_text, 
   LanguageCode='en'
)
```
Revelando el contenido de la variable _detected_syntax_ tendremos:

```
{
    "ResponseMetadata": {
        "HTTPHeaders": {
            "content-length": "12896",
            "content-type": "application/x-amz-json-1.1",
            "date": "Wed, 06 Jul 2022 04:31:16 GMT",
            "x-amzn-requestid": "21f94838-5820-4223-a015-9685a31902cf"
        },
        "HTTPStatusCode": 200,
        "RequestId": "21f94838-5820-4223-a015-9685a31902cf",
        "RetryAttempts": 0
    },
    "SyntaxTokens": [
        {
            "BeginOffset": 1,
            "EndOffset": 6,
            "PartOfSpeech": {
                "Score": 0.9888805150985718,
                "Tag": "INTJ"
            },
            "Text": "Hello",
            "TokenId": 1
        },
        {
            "BeginOffset": 7,
            "EndOffset": 12,
            "PartOfSpeech": {
                "Score": 0.9991546273231506,
                "Tag": "PROPN"
            },
            "Text": "Zhang",
            "TokenId": 2
        },
        {
            "BeginOffset": 13,
            "EndOffset": 16,
            "PartOfSpeech": {
                "Score": 0.9982988238334656,
                "Tag": "PROPN"
            },
            "Text": "Wei",
            "TokenId": 3
        },
        ...
    ]
}
```
En la respuesta observamos que para cada una de las palabras se ha identificado su respectiva Etiqueta.

## 6 Detección de información de identificación personal (PII)

Con esta API podemos detectar entidades en el texto que contienen información de identificación personal (PII).  Una entidad PII es una referencia textual a datos personales que podrían utilizarse para identificar a una persona, como una dirección, un número de cuenta bancaria o un número de teléfono.

Amazon Comprehend reconoce los siguientes tipos de entidades:

- ADDRESS
- AGE
- AWS_ACCESS_KEY
- AWS_SECRET_KEY
- BANK_ACCOUNT_NUMBER
- BANK_ROUTING
- CREDIT_DEBIT_CVV
- CREDIT_DEBIT_EXPIRY
- CREDIT_DEBIT_NUMBER
- DATE_TIME
- DRIVER_ID
- EMAIL
- IP_ADDRESS
- MAC_ADDRESS
- NAME
- PASSPORT_NUMBER
- PASSWORD
- PHONE
- PIN
- SSN
- URL
- USERNAME

Para trabajar con la API usamos el siguiente código en python

```
comprehend = boto3.client('comprehend')

detected_pii_labels = comprehend.contains_pii_entities(
   Text=sample_text, 
   LanguageCode='en'
)

```
Ahora revisamos el contenido de la variable _detected_pii_labels_

```
{
    "Labels": [
        {
            "Name": "EMAIL",
            "Score": 1.0
        },
        {
            "Name": "DATE_TIME",
            "Score": 1.0
        },
        {
            "Name": "BANK_ROUTING",
            "Score": 0.8962613940238953
        },
        {
            "Name": "NAME",
            "Score": 0.7186043858528137
        },
        {
            "Name": "PHONE",
            "Score": 1.0
        }
    ],
    "ResponseMetadata": {
        "HTTPHeaders": {
            "content-length": "197",
            "content-type": "application/x-amz-json-1.1",
            "date": "Wed, 06 Jul 2022 04:51:25 GMT",
            "x-amzn-requestid": "f13ed239-eb0c-428d-b7ea-4d26f2568309"
        },
        "HTTPStatusCode": 200,
        "RequestId": "f13ed239-eb0c-428d-b7ea-4d26f2568309",
        "RetryAttempts": 0
    }
}
```

En la respuesta observamos cada una de las PII encontradas en el texto

## Conclusión

Amazon Comprehend permite acelerar el desarrollo de aplicaciones donde es necesario el uso de análisis de textos. El uso de esta herramienta no requiere una curva de aprendizaje elevada, solamente requiere leer un poco de documentación y revisar algunos ejemplos. No hay necesidad de tener conocimientos en inteligencia artificial para su uso.

Este blog es parte de una serie: [Ir al menu](https://dev.to/awsmllatam/machine-learning-para-desarrolladores-en-aws-4l59)