Skip to content
Tutorials5 min read

Creación de una Tarea de Análisis de Sentimiento

Construye una tarea completa de clasificación de sentimiento con botones de radio, tooltips y atajos de teclado para un etiquetado eficiente.

Potato Team·

Creación de una Tarea de Análisis de Sentimiento

El análisis de sentimiento es una tarea fundamental de NLP, y Potato facilita la recopilación de etiquetas de sentimiento de alta calidad. En este tutorial, construiremos una interfaz de anotación de sentimiento lista para producción con todas las funcionalidades.

Visión General del Proyecto

Crearemos una interfaz para anotar publicaciones de redes sociales con:

  • Clasificación de sentimiento de tres vías (Positivo, Negativo, Neutral)
  • Calificaciones de confianza para cada anotación
  • Explicaciones de texto opcionales
  • Atajos de teclado para velocidad
  • Medidas de control de calidad

Configuración Completa

Aquí está el config.yaml completo:

yaml
annotation_task_name: "Social Media Sentiment Analysis"
 
# Data configuration
data_files:
  - "data/tweets.json"
 
item_properties:
  id_key: id
  text_key: text
 
# Annotation interface
annotation_schemes:
  # Primary sentiment label
  - annotation_type: radio
    name: sentiment
    description: "What is the overall sentiment of this post?"
    labels:
      - name: Positive
        tooltip: "Expresses happiness, satisfaction, or approval"
        keyboard_shortcut: "1"
      - name: Negative
        tooltip: "Expresses sadness, frustration, or disapproval"
        keyboard_shortcut: "2"
      - name: Neutral
        tooltip: "Factual, objective, or lacks emotional content"
        keyboard_shortcut: "3"
    required: true
 
  # Confidence rating
  - annotation_type: likert
    name: confidence
    description: "How confident are you in your sentiment label?"
    size: 5
    min_label: "Not confident"
    max_label: "Very confident"
    required: true
 
  # Optional explanation
  - annotation_type: text
    name: explanation
    description: "Why did you choose this label? (Optional)"
    textarea: true
    required: false
    placeholder: "Explain your reasoning..."
 
# Guidelines
annotation_guidelines:
  title: "Sentiment Annotation Guidelines"
  content: |
    ## Your Task
    Classify the sentiment expressed in each social media post.
 
    ## Labels
 
    **Positive**: The author expresses positive emotions or opinions
    - Happiness, excitement, gratitude
    - Praise, recommendations, approval
    - Examples: "Love this!", "Best day ever!", "Highly recommend"
 
    **Negative**: The author expresses negative emotions or opinions
    - Anger, frustration, sadness
    - Complaints, criticism, disapproval
    - Examples: "Terrible service", "So disappointed", "Worst experience"
 
    **Neutral**: Factual or lacking clear sentiment
    - News, announcements, questions
    - Mixed or balanced opinions
    - Examples: "The store opens at 9am", "Has anyone tried this?"
 
    ## Tips
    - Focus on the author's sentiment, not the topic
    - Sarcasm should be labeled based on intended meaning
    - When unsure, lower your confidence rating
 
# User management
automatic_assignment:
  on: true
  sampling_strategy: random
  labels_per_instance: 1
  instance_per_annotator: 100

Formato de Datos de Ejemplo

Crea data/tweets.json:

json
{"id": "t001", "text": "Just got my new laptop and I'm absolutely loving it! Best purchase of the year! #happy"}
{"id": "t002", "text": "Waited 2 hours for customer service and they still couldn't help me. Never shopping here again."}
{"id": "t003", "text": "The new coffee shop on Main Street opens tomorrow at 7am."}
{"id": "t004", "text": "This movie was okay I guess. Some good parts, some boring parts."}
{"id": "t005", "text": "Can't believe how beautiful the sunset was tonight! Nature is amazing."}

Ejecución de la Tarea

Inicia el servidor de anotación:

bash
potato start config.yaml

Navega a http://localhost:8000 e inicia sesión para comenzar a anotar.

Comprensión de la Interfaz

Área Principal de Anotación

La interfaz muestra:

  1. El texto a anotar (con URLs, menciones y hashtags resaltados)
  2. Botones de radio de sentimiento con tooltips
  3. Escala Likert de confianza
  4. Cuadro de texto de explicación opcional

Flujo de Trabajo con Teclado

Para máxima eficiencia:

  1. Lee el texto
  2. Presiona 1, 2 o 3 para el sentimiento
  3. Haz clic en el nivel de confianza (o usa el ratón)
  4. Presiona Enter para enviar

Seguimiento de Progreso

La interfaz muestra:

  • Progreso actual (p.ej., "15 / 100")
  • Tiempo restante estimado
  • Estadísticas de la sesión

Formato de Salida

Las anotaciones se guardan en annotations/username.jsonl:

json
{
  "id": "t001",
  "text": "Just got my new laptop and I'm absolutely loving it!...",
  "annotations": {
    "sentiment": "Positive",
    "confidence": 5,
    "explanation": "Clear expression of happiness with the purchase"
  },
  "annotator": "john_doe",
  "timestamp": "2026-01-15T14:30:00Z"
}

Añadiendo Control de Calidad

Verificaciones de Atención

Añade elementos de referencia para verificar la atención del anotador:

yaml
quality_control:
  attention_checks:
    enabled: true
    frequency: 10  # Every 10th item
    items:
      - text: "I am extremely happy and satisfied! This is the best!"
        expected:
          sentiment: "Positive"
      - text: "This is absolutely terrible and I hate it completely."
        expected:
          sentiment: "Negative"

Acuerdo entre Anotadores

Para proyectos de investigación, habilita múltiples anotaciones:

yaml
automatic_assignment:
  on: true
  sampling_strategy: random
  labels_per_instance: 3  # Each item annotated by 3 people
  instance_per_annotator: 50

Análisis de Resultados

Exporta y analiza tus anotaciones:

python
import json
from collections import Counter
 
# Load annotations
annotations = []
with open('annotations/annotator1.jsonl') as f:
    for line in f:
        annotations.append(json.loads(line))
 
# Sentiment distribution
sentiments = Counter(a['annotations']['sentiment'] for a in annotations)
print(f"Sentiment distribution: {dict(sentiments)}")
 
# Average confidence
confidences = [a['annotations']['confidence'] for a in annotations]
print(f"Average confidence: {sum(confidences)/len(confidences):.2f}")

Próximos Pasos


Explora más tipos de anotación en nuestra documentación.