Skip to content

análisis de sentimiento sobre traducción

Open In Colab

Pipeline Multimodular: Análisis de Sentimiento sobre Traducción

🇺🇸 English version of this document

Este documento detalla un pipeline multimodular que recibe un archivo de texto, lo traduce (por lo pronto a inglés), y hace análisis de sentimiento sobre cada frase traducida.

El documento está dividido en las siguientes secciones:

Monta tu Pipeline

Para lograr lo arriba descrito, monta un pipeline que consiste de los siguientes módulos en secuencia:

Para crear el pipeline usarás el método create_pipeline de la siguiente manera:

# creación del pipeline descrito
pipeline = krixik.create_pipeline(name="multi_analisis_de_sentimiento_sobre_traduccion", module_chain=["parser", "translate", "sentiment"])

Procesa un Archivo de Entrada

Dado que vas a traducir y luego hacer análisis de sentimiento—y dado que los modelos de este segundo módulo están por lo pronto para inglés—usa un archivo inicial en español. Para traducirlo de español al inglés puedes usar el modelo (no-predeterminado) opus-mt-es-en del módulo translate (traducción).

Como usarás los modelos predeterminados para todo otro módulo en el pipeline, no tendrás que especificarlos en el argumento modules del método process.

# procesa el archivo a través del pipeline según lo arriba descrito
process_output = pipeline.process(
    local_file_path=data_dir + "input/resena_espanol.txt",  # la ruta de archivo inicial en la que yace el archivo de entrada
    local_save_directory=data_dir + "output",  # el directorio local en el que se guardará el archivo de salida
    expire_time=60 * 30,  # data de este proceso se eliminará del sistema Krixik en 30 minutos
    wait_for_process=True,  # espera que el proceso termine antes de devolver control del IDE al usuario
    verbose=False,  # no mostrar actualizaciones de proceso al ejecutar el código
    modules={"module_2": {"model": "opus-mt-es-en"}},  # especifica un modelo no-predeterminado para usar en el segundo módulo
)

La salida del proceso se reproduce con el siguiente código. Para aprender más sobre cada componente de esta salida, revisa la documentación del método process.

Dado que la salida de este modelo/módulo es un archivo JSON, la salida también se incluye en el objeto (esto solo ese el caso para salidas JSON). Además, el archivo de salida se ha guardado en la ubicación indicada bajo process_output_files. El file_id del archivo procesado es el prefijo del nombre del archivo de salida en esta ubicación.

# nítidamente reproduce la salida de este proceso
print(json.dumps(process_output, indent=2))
{
  "status_code": 200,
  "pipeline": "multi_sentiment_analysis_on_translation",
  "request_id": "0719e2d3-24cc-4a12-9f84-d90d1a9e964e",
  "file_id": "ed5b8fa4-3f4b-4e10-b61d-05536db5e929",
  "message": "SUCCESS - output fetched for file_id ed5b8fa4-3f4b-4e10-b61d-05536db5e929.Output saved to location(s) listed in process_output_files.",
  "warnings": [],
  "process_output": [
    {
      "snippet": "For the jobs I'm doing I turned out very good.",
      "positive": 1.0,
      "negative": 0.0,
      "neutral": 0.0
    },
    {
      "snippet": "In one hour load the battery and last more than 3 hours of continuous work.",
      "positive": 0.008,
      "negative": 0.992,
      "neutral": 0.0
    },
    {
      "snippet": "A golasse to have a second batter.",
      "positive": 0.023,
      "negative": 0.977,
      "neutral": 0.0
    },
    {
      "snippet": "Cmodo and with good torque.",
      "positive": 1.0,
      "negative": 0.0,
      "neutral": 0.0
    },
    {
      "snippet": "I agree.",
      "positive": 1.0,
      "negative": 0.0,
      "neutral": 0.0
    }
  ],
  "process_output_files": [
    "../../../data/output/ed5b8fa4-3f4b-4e10-b61d-05536db5e929.json"
  ]
}

Para confirmar que todo salió como esperabas, carga el archivo de process_output_files:

# carga la salida del proceso del archivo
with open(process_output["process_output_files"][0]) as f:
    print(json.dumps(json.load(f), indent=2))
[
  {
    "snippet": "For the jobs I'm doing I turned out very good.",
    "positive": 1.0,
    "negative": 0.0,
    "neutral": 0.0
  },
  {
    "snippet": "In one hour load the battery and last more than 3 hours of continuous work.",
    "positive": 0.008,
    "negative": 0.992,
    "neutral": 0.0
  },
  {
    "snippet": "A golasse to have a second batter.",
    "positive": 0.023,
    "negative": 0.977,
    "neutral": 0.0
  },
  {
    "snippet": "Cmodo and with good torque.",
    "positive": 1.0,
    "negative": 0.0,
    "neutral": 0.0
  },
  {
    "snippet": "I agree.",
    "positive": 1.0,
    "negative": 0.0,
    "neutral": 0.0
  }
]

Notarás que, en el primer fragmento devuelto, la palabra "sillón" carece de su segunda vocal y es reproducida como "silln". Este es un problema de modelo: el modelo seleccionado del módulo translate (traducción) puede tener dificultades con caracteres acentuados y/o puede simplemente eliminarlos. Es importante que te familiarices con las peculiaridades de los modelos IA que piensas usar con frecuencia.