Skip to content

Formatos de Dados

Formatos de entrada do Potato: texto, JSON, JSONL, CSV, imagens, áudio e vídeo. Saída para CoNLL, HuggingFace Datasets, COCO, YOLO, Parquet e outros.

O Potato lê a entrada de anotação a partir de arquivos JSON, JSON Lines, CSV e TSV. Este guia explica como estruturar esses dados, quais campos o Potato precisa de cada registro e onde as anotações são gravadas.

Como os dados fluem pelo Potato: os arquivos de entrada se tornam instâncias com um id e um texto mais metadados, são anotados e exportados para muitos formatosDo arquivo de entrada aos rótulos exportados

Formatos Suportados

FormatoExtensãoDescrição
JSON.jsonArray de objetos
JSON Lines.jsonlUm objeto JSON por linha
CSV.csvValores separados por vírgulas
TSV.tsvValores separados por tabulações

Formato JSON

O formato mais comum. Seus dados devem ser um array de objetos:

json
[
  {
    "id": "doc_001",
    "text": "This is the first document to annotate.",
    "source": "twitter",
    "date": "2024-01-15"
  },
  {
    "id": "doc_002",
    "text": "This is the second document.",
    "source": "reddit",
    "date": "2024-01-16"
  }
]

Formato JSON Lines

Cada linha é um objeto JSON separado. Útil para grandes conjuntos de dados:

jsonl
{"id": "doc_001", "text": "First document"}
{"id": "doc_002", "text": "Second document"}
{"id": "doc_003", "text": "Third document"}

Formato CSV/TSV

Dados tabulares com cabeçalhos:

csv
id,text,source
doc_001,"This is the first document",twitter
doc_002,"This is the second document",reddit

Configuração

Configuração Básica

Configure os arquivos de dados e os mapeamentos de campos no seu YAML:

yaml
data_files:
  - "data/documents.json"
 
item_properties:
  id_key: id      # Field name for unique ID
  text_key: text  # Field name for content to annotate

Múltiplos Arquivos de Dados

Combine várias fontes de dados:

yaml
data_files:
  - "data/batch_1.json"
  - "data/batch_2.json"
  - "data/batch_3.jsonl"

Os arquivos são processados em ordem e combinados.

Tipos de Dados

Texto Simples

Conteúdo de texto simples:

json
{
  "id": "1",
  "text": "The product arrived quickly and works great!"
}

Arquivos de Mídia

Referencie imagens, vídeos ou áudio:

json
{
  "id": "1",
  "image_path": "images/photo_001.jpg"
}
yaml
item_properties:
  id_key: id
  image_key: image_path

Diálogos/Listas

Um campo text que contém uma lista JSON é exibido com um item por linha, porque a leitura vertical combina com um diálogo. Defina list_as_text.horizontal para colocar os itens lado a lado em uma comparação par a par:

json
{
  "id": "1",
  "text": ["Option A", "Option B", "Option C"]
}

Pares de Texto

Um campo text que contém um objeto JSON é renderizado pelo tipo de exibição que a configuração declarar (conversation_tree, web_agent_trace e similares). Sem nenhum tipo de exibição declarado, ele aparece como JSON formatado, então declare um para uma tarefa de comparação:

json
{
  "id": "pair_001",
  "text": {
    "A": "Response from Model A",
    "B": "Response from Model B"
  }
}

Arquivos HTML

Mantenha os arquivos .html em uma pasta dentro de task_dir e aponte para eles a partir do campo text comum, já que o Potato não tem uma propriedade de item separada para HTML. A tarefa incluída examples/advanced/html-annotation incorpora cada um deles:

json
{
  "id": "1",
  "text": "<embed width=\"1020\" height=\"440\" src=\"data/html_data/1.html\" type=\"text/html\">"
}

Anotação Contextual

Inclua contexto ao lado do texto principal:

json
{
  "id": "1",
  "text": "This is great!",
  "context": "Previous message: How do you like the new feature?"
}

Campos que não sejam o id e o texto chegam à página por meio de kwargs, que lista as chaves extras a serem trazidas de cada item:

yaml
item_properties:
  id_key: id
  text_key: text
  kwargs:
    - context

Configuração de Exibição

Opções de Exibição de Listas

Controle como um campo cujo valor é uma lista é disposto. A chave aceita três subchaves, e list_as_text: true a ativa com os valores padrão:

yaml
list_as_text:
  # Prefix each item so an annotator can refer to one by name.
  text_list_prefix_type: alphabet   # alphabet, number, bullet, or none
 
  # Side-by-side suits a pairwise comparison. The default is vertical.
  horizontal: true
 
  # Shade alternate turns, which keeps a long dialogue readable.
  alternating_shading: true

Conteúdo HTML

Marcação em um campo text é renderizada sem nenhuma chave de configuração. O Potato a sanitiza em vez de escapá-la, então as tags de uma lista de permissões (<b>, <i>, <span> e similares) viram formatação, enquanto <script> e tudo o que não está na lista é escapado e fica inerte. Os destaques de spans são inseridos no item como marcação, e por isso escapar o campo inteiro não é uma opção.

json
{
  "id": "1",
  "text": "<p>This is <strong>formatted</strong> text.</p>"
}

Configuração de Saída

Diretório de Saída

Especifique onde as anotações são salvas:

yaml
output_annotation_dir: "output/"

Formato de Saída

As anotações são sempre mantidas em arquivos user_state.json por usuário. Além disso, export_annotation_format grava periodicamente uma exportação plana em <output_annotation_dir>/exports/<format>/, que é a forma adequada para análise. Nenhum exportador se chama json:

yaml
export_annotation_format: "jsonl"   # or csv, tsv, parquet, coco, conll_2003, ...

Execute python -m potato.export --list-formats para ver o registro completo.

Estrutura da Saída

Cada user_state.json guarda os rótulos daquele anotador indexados por instância, com os spans registrados separadamente:

json
{
  "user_id": "annotator_1",
  "instance_id_to_label_to_value": {
    "doc_001": {
      "sentiment": {"labels": {"positive": true}}
    }
  },
  "instance_id_to_span_to_value": {
    "doc_001": {
      "ner": [
        {"start": 0, "end": 5, "label": "PERSON", "text": "Alice"}
      ]
    }
  }
}

Tipos de Dados Especiais

Escalonamento Melhor-Pior

Para tarefas de ranqueamento, use itens separados por vírgulas:

json
{
  "id": "1",
  "text": "Item A,Item B,Item C,Item D"
}

Argumentos Personalizados

Inclua campos extras para exibição ou filtragem:

json
{
  "id": "1",
  "text": "Document content",
  "category": "news",
  "priority": "high",
  "custom_field": "any value"
}

Backend de Banco de Dados

Para grandes conjuntos de dados, use MySQL:

yaml
database:
  type: mysql
  host: localhost
  port: 3306
  database: potato_db
  username: ${DB_USER}
  password: ${DB_PASSWORD}

O Potato cria automaticamente as tabelas necessárias na primeira inicialização.

Validação de Dados

O Potato valida seus dados na inicialização:

  • Campo de ID ausente - Todos os itens precisam de identificadores únicos
  • Campo de texto ausente - Os itens precisam de conteúdo para anotar
  • IDs duplicados - Todos os IDs devem ser únicos
  • Arquivo não encontrado - Verifique os caminhos dos arquivos de dados

Exemplo Completo

yaml
annotation_task_name: "Document Classification"
task_dir: "."
port: 8000
 
# Data configuration
data_files:
  - "data/documents.json"
 
item_properties:
  id_key: id
  text_key: text
 
# Display settings
list_as_text:
  text_list_prefix_type: number
  horizontal: false
 
# Output
output_annotation_dir: "output/"
export_annotation_format: "jsonl"
 
# Annotation scheme
annotation_schemes:
  - annotation_type: radio
    name: category
    description: "Select the document category"
    labels:
      - News
      - Opinion
      - Tutorial
      - Other
 
user_config:
  allow_all_users: true
  users: []

Melhores Práticas

1. Use IDs Significativos

Facilita o rastreamento e a depuração:

json
{"id": "twitter_2024_001", "text": "..."}

2. Mantenha o Texto Conciso

Textos longos tornam a anotação mais lenta. Considere:

  • Truncar para as partes essenciais
  • Fornecer resumos
  • Usar contêineres com rolagem

3. Inclua Metadados

Ajuda na filtragem e na análise:

json
{
  "id": "1",
  "text": "Content",
  "source": "twitter",
  "date": "2024-01-15",
  "language": "en"
}

4. Valide Antes de Carregar

Verifique seus dados offline:

python
import json
 
with open('data.json') as f:
    data = json.load(f)
 
# Check for required fields
for item in data:
    assert 'id' in item, f"Missing id: {item}"
    assert 'text' in item, f"Missing text: {item}"
 
# Check for duplicates
ids = [item['id'] for item in data]
assert len(ids) == len(set(ids)), "Duplicate IDs found"
 
print(f"Validated {len(data)} items")

5. Faça Backup dos Dados Originais

Mantenha os dados brutos separados das anotações para garantir a reprodutibilidade.

6. Use JSON Lines para Arquivos Grandes

Mais eficiente em memória do que arrays JSON:

bash
# Convert JSON array to JSON Lines
cat data.json | jq -c '.[]' > data.jsonl

Leitura Complementar

Para detalhes de implementação, consulte a documentação fonte.