Tutorial de clasificación de contenido

Audiencia

Este tutorial se ha diseñado para que puedas empezar a explorar y desarrollar aplicaciones rápidamente con la API Cloud Natural Language. Está diseñado para personas que tengan conocimientos básicos de programación, aunque también podrás seguirlo si no tienes mucha experiencia en este campo. Después de haber seguido este tutorial, podrás utilizar la documentación de referencia para crear tus propias aplicaciones básicas.

En este tutorial se explica paso a paso una aplicación de Natural Language con código Python. El objetivo de este artículo no es explicar las bibliotecas de cliente de Python, sino mostrar cómo hacer llamadas a la API Natural Language. Las aplicaciones en Java y Node.js son esencialmente similares. Consulta los ejemplos de la API Natural Language para ver muestras en otros idiomas (incluida la muestra de este tutorial).

Requisitos previos

Este tutorial tiene varios requisitos previos:

Información general

En este tutorial se explica cómo usar una aplicación básica de Natural Language mediante solicitudes classifyText, que clasifica el contenido en categorías junto con una puntuación de confianza, como las siguientes:

category: "/Internet & Telecom/Mobile & Wireless/Mobile Apps & Add-Ons"
confidence: 0.6499999761581421

Para ver la lista de todas las etiquetas de categorías disponibles, consulta Categorías.

En este tutorial, crearás una aplicación para realizar las siguientes tareas:

  • Clasifica varios archivos de texto y escribe el resultado en un archivo de índice.
  • Procesa el texto de la consulta de entrada para encontrar archivos de texto similares.
  • Procesa las etiquetas de categoría de la consulta de entrada para encontrar archivos de texto similares.

En este tutorial se usa contenido de Wikipedia. Podrías crear una aplicación similar para procesar artículos de noticias, comentarios online, etc.

Archivos de origen

Puedes encontrar el código fuente del tutorial en los ejemplos de la biblioteca de cliente de Python de GitHub.

En este tutorial se usa texto de origen de ejemplo de Wikipedia. Puedes encontrar los archivos de texto de ejemplo en la carpeta resources/texts del proyecto de GitHub.

Importar bibliotecas

Para usar la API Cloud Natural Language, debes importar el módulo language de la biblioteca google-cloud-language. El módulo language.types contiene las clases necesarias para crear solicitudes. El módulo language.enums se usa para especificar el tipo del texto de entrada. En este tutorial se clasifica contenido de texto sin formato (language.enums.Document.Type.PLAIN_TEXT).

Para calcular la similitud entre textos en función de la clasificación de contenido resultante, en este tutorial se usa numpy para los cálculos vectoriales.

Python

Para saber cómo instalar y usar la biblioteca de cliente de Natural Language, consulta el artículo sobre las bibliotecas de cliente de Natural Language. Para obtener más información, consulta la documentación de referencia de la API Natural Language Python.

Para autenticarte en Natural Language, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

import argparse
import json
import os

from google.cloud import language_v1
import numpy

Paso 1. Clasificar contenido

Puedes usar la biblioteca de cliente de Python para enviar una solicitud a la API Natural Language y clasificar contenido. La biblioteca de cliente de Python encapsula los detalles de las solicitudes y respuestas de la API Natural Language.

La función classify del tutorial llama al método classifyText de la API Natural Language. Para ello, primero crea una instancia de la clase LanguageServiceClient y, después, llama al método classify_text de la instancia LanguageServiceClient.

La función classify del tutorial solo clasifica el contenido de texto en este ejemplo. También puede clasificar el contenido de una página web si envía el código HTML de origen de la página web como text y define el parámetro type como language.enums.Document.Type.HTML.

Para obtener más información, consulta el artículo Clasificar contenido. Para obtener información sobre la estructura de las solicitudes a la API Natural Language, consulta la referencia de Natural Language.

Python

Para saber cómo instalar y usar la biblioteca de cliente de Natural Language, consulta el artículo sobre las bibliotecas de cliente de Natural Language. Para obtener más información, consulta la documentación de referencia de la API Natural Language Python.

Para autenticarte en Natural Language, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def classify(text, verbose=True):
    """Classify the input text into categories."""

    language_client = language_v1.LanguageServiceClient()

    document = language_v1.Document(
        content=text, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    response = language_client.classify_text(request={"document": document})
    categories = response.categories

    result = {}

    for category in categories:
        # Turn the categories into a dictionary of the form:
        # {category.name: category.confidence}, so that they can
        # be treated as a sparse vector.
        result[category.name] = category.confidence

    if verbose:
        print(text)
        for category in categories:
            print("=" * 20)
            print("{:<16}: {}".format("category", category.name))
            print("{:<16}: {}".format("confidence", category.confidence))

    return result

El resultado devuelto es un diccionario con las etiquetas de categoría como claves y las puntuaciones de confianza como valores, como se muestra a continuación:

{
    "/Computers & Electronics": 0.800000011920929,
    "/Internet & Telecom/Mobile & Wireless/Mobile Apps & Add-Ons": 0.6499999761581421
}

El script de Python del tutorial está organizado de forma que se pueda ejecutar desde la línea de comandos para hacer experimentos rápidos. Por ejemplo, puedes ejecutar lo siguiente:

python classify_text_tutorial.py classify "Google Home enables users to speak voice commands to interact with services through the Home's intelligent personal assistant called Google Assistant. A large number of services, both in-house and third-party, are integrated, allowing users to listen to music, look at videos or photos, or receive news updates entirely by voice. "

Paso 2: Indexar varios archivos de texto

La función index de la secuencia de comandos del tutorial toma como entrada un directorio que contiene varios archivos de texto y la ruta a un archivo en el que almacena la salida indexada (el nombre de archivo predeterminado es index.json). La función index lee el contenido de cada archivo de texto del directorio de entrada y, a continuación, pasa los archivos de texto a la API Cloud Natural Language para que se clasifiquen en categorías de contenido.

Python

Para saber cómo instalar y usar la biblioteca de cliente de Natural Language, consulta el artículo sobre las bibliotecas de cliente de Natural Language. Para obtener más información, consulta la documentación de referencia de la API Natural Language Python.

Para autenticarte en Natural Language, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def index(path, index_file):
    """Classify each text file in a directory and write
    the results to the index_file.
    """

    result = {}
    for filename in os.listdir(path):
        file_path = os.path.join(path, filename)

        if not os.path.isfile(file_path):
            continue

        try:
            with open(file_path) as f:
                text = f.read()
                categories = classify(text, verbose=False)

                result[filename] = categories
        except Exception:
            print(f"Failed to process {file_path}")

    with open(index_file, "w", encoding="utf-8") as f:
        f.write(json.dumps(result, ensure_ascii=False))

    print(f"Texts indexed in file: {index_file}")
    return result

Los resultados de la API Cloud Natural Language de cada archivo se organizan en un solo diccionario, se serializan como una cadena JSON y, a continuación, se escriben en un archivo. Por ejemplo:

{
    "android.txt": {
        "/Computers & Electronics": 0.800000011920929,
        "/Internet & Telecom/Mobile & Wireless/Mobile Apps & Add-Ons": 0.6499999761581421
    },
    "google.txt": {
        "/Internet & Telecom": 0.5799999833106995,
        "/Business & Industrial": 0.5400000214576721
    }
}

Para indexar archivos de texto desde la línea de comandos con el nombre de archivo de salida predeterminado index.json, ejecuta el siguiente comando:

python classify_text_tutorial.py index resources/texts

Paso 3: Consultar el índice

Consulta con etiquetas de categoría

Una vez que se haya creado el archivo de índice (nombre de archivo predeterminado = index.json), podremos hacer consultas al índice para recuperar algunos de los nombres de archivo y sus puntuaciones de confianza.

Una forma de hacerlo es usar una etiqueta de categoría como consulta, lo que se consigue en el tutorial con la función query_category. La implementación de las funciones auxiliares, como similarity, se puede encontrar en el archivo classify_text_tutorial.py. En tus aplicaciones, la puntuación y la clasificación de similitud deben diseñarse cuidadosamente en función de casos de uso específicos.

Python

Para saber cómo instalar y usar la biblioteca de cliente de Natural Language, consulta el artículo sobre las bibliotecas de cliente de Natural Language. Para obtener más información, consulta la documentación de referencia de la API Natural Language Python.

Para autenticarte en Natural Language, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def query_category(index_file, category_string, n_top=3):
    """Find the indexed files that are the most similar to
    the query label.

    The list of all available labels:
    https://cloud.google.com/natural-language/docs/categories
    """

    with open(index_file) as f:
        index = json.load(f)

    # Make the category_string into a dictionary so that it is
    # of the same format as what we get by calling classify.
    query_categories = {category_string: 1.0}

    similarities = []
    for filename, categories in index.items():
        similarities.append((filename, similarity(query_categories, categories)))

    similarities = sorted(similarities, key=lambda p: p[1], reverse=True)

    print("=" * 20)
    print(f"Query: {category_string}\n")
    print(f"\nMost similar {n_top} indexed texts:")
    for filename, sim in similarities[:n_top]:
        print(f"\tFilename: {filename}")
        print(f"\tSimilarity: {sim}")
        print("\n")

    return similarities

Para ver una lista de todas las categorías disponibles, consulta Categorías.

Como antes, puedes llamar a la función query_category desde la línea de comandos:

python classify_text_tutorial.py query-category index.json "/Internet & Telecom/Mobile & Wireless"

Debería aparecer lo siguiente:

Query: /Internet & Telecom/Mobile & Wireless


Most similar 3 indexed texts:
  Filename: android.txt
  Similarity: 0.665573579045


  Filename: google.txt
  Similarity: 0.517527175966


  Filename: gcp.txt
  Similarity: 0.5

Consultar con texto

También puedes hacer consultas con texto que no forme parte del texto indexado. La función del tutorial query es similar a la función query_category, con el paso adicional de hacer una solicitud classifyText para la entrada de texto y usar los resultados para consultar el archivo de índice.

Python

Para saber cómo instalar y usar la biblioteca de cliente de Natural Language, consulta el artículo sobre las bibliotecas de cliente de Natural Language. Para obtener más información, consulta la documentación de referencia de la API Natural Language Python.

Para autenticarte en Natural Language, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def query(index_file, text, n_top=3):
    """Find the indexed files that are the most similar to
    the query text.
    """

    with open(index_file) as f:
        index = json.load(f)

    # Get the categories of the query text.
    query_categories = classify(text, verbose=False)

    similarities = []
    for filename, categories in index.items():
        similarities.append((filename, similarity(query_categories, categories)))

    similarities = sorted(similarities, key=lambda p: p[1], reverse=True)

    print("=" * 20)
    print(f"Query: {text}\n")
    for category, confidence in query_categories.items():
        print(f"\tCategory: {category}, confidence: {confidence}")
    print(f"\nMost similar {n_top} indexed texts:")
    for filename, sim in similarities[:n_top]:
        print(f"\tFilename: {filename}")
        print(f"\tSimilarity: {sim}")
        print("\n")

    return similarities

Para hacerlo desde la línea de comandos, ejecuta lo siguiente:

python classify_text_tutorial.py query index.json "Google Home enables users to speak voice commands to interact with services through the Home's intelligent personal assistant called Google Assistant. A large number of services, both in-house and third-party, are integrated, allowing users to listen to music, look at videos or photos, or receive news updates entirely by voice. "

Se imprimirá algo similar a lo siguiente:

Query: Google Home enables users to speak voice commands to interact with services through the Home's intelligent personal assistant called Google Assistant. A large number of services, both in-house and third-party, are integrated, allowing users to listen to music, look at videos or photos, or receive news updates entirely by voice.

  Category: /Internet & Telecom, confidence: 0.509999990463
  Category: /Computers & Electronics/Software, confidence: 0.550000011921

Most similar 3 indexed texts:
  Filename: android.txt
  Similarity: 0.600579500049


  Filename: google.txt
  Similarity: 0.401314790229


  Filename: gcp.txt
  Similarity: 0.38772339779

Siguientes pasos

Con la API de clasificación de contenido, puedes crear otras aplicaciones. Por ejemplo:

  • Clasifica cada párrafo de un artículo para ver la transición entre temas.

  • Clasifica el contenido con marcas de tiempo y analiza la tendencia de los temas a lo largo del tiempo.

  • Compara las categorías de contenido con el sentimiento del contenido mediante el método analyzeSentiment.

  • Compara las categorías de contenido con las entidades mencionadas en el texto.

Además, puedes usar otros productos de Google Cloud Platform para optimizar tu flujo de trabajo:

  • En la aplicación de ejemplo de este tutorial, hemos procesado archivos de texto locales, pero puedes modificar el código para procesar archivos de texto almacenados en un segmento de Google Cloud Storage. Para ello, debes pasar un URI de Google Cloud Storage al método classify_text.

  • En la aplicación de ejemplo de este tutorial, hemos almacenado el archivo de índice de forma local y cada consulta se procesa leyendo todo el archivo de índice. Esto implica una latencia alta si tienes una gran cantidad de datos indexados o si necesitas procesar numerosas consultas. Datastore es una opción natural y cómoda para almacenar los datos de índice.