Skip to content

Best-Worst Scaling

Anotação comparativa eficiente com Best-Worst Scaling no Potato — gera automaticamente tuplas de comparação e converte as seleções em pontuações contínuas de qualidade.

Novo na v2.3.0

Best-Worst Scaling (BWS), também conhecido como MaxDiff, mostra ao anotador uma tupla de itens, normalmente quatro, e pede o melhor e o pior segundo algum critério. Dois cliques por tupla produzem mais informação do que uma avaliação, e, como o julgamento é comparativo, ele evita o problema de o 7 de um anotador ser o 5 de outro.

Vale a pena configurar o BWS quando:

  • As avaliações numéricas diretas sofrem com diferenças no uso da escala entre anotadores
  • Você precisa de um ranking confiável de centenas ou milhares de itens
  • A dimensão de qualidade é inerentemente relativa, como saber qual tradução se lê com mais fluência

Interface de anotação de best-worst scalingInterface de best-worst scaling para anotação comparativa no Potato

Configuração

Uma tarefa de BWS tem duas partes. O esquema define o que se pergunta ao anotador, e o bloco bws_config de nível superior define como as tuplas são montadas e pontuadas.

yaml
bws_config:
  tuple_size: 4              # items shown at once
  min_item_appearances: 8    # how often each item must appear across tuples
  seed: 42
  scoring:
    method: counting         # counting | bradley_terry | plackett_luce
 
annotation_schemes:
  - annotation_type: bws
    name: fluency
    description: "Select the BEST and WORST translation by fluency"
    tuple_size: 4
    best_description: "Most Fluent"
    worst_description: "Least Fluent"
    sequential_key_binding: true
    label_requirement:
      required: true

O esquema aceita tuple_size, best_description, worst_description, sequential_key_binding e label_requirement, e nada mais. Tudo o que diz respeito a gerar ou pontuar tuplas fica no bws_config.

Um esquema bws sem um bloco bws_config exibe uma pergunta sobre uma lista de itens vazia, que é o motivo habitual de uma tarefa de BWS aparecer em branco.

Opções do bws_config

OpçãoDescrição
tuple_sizeQuantos itens aparecem em uma tupla
num_tuplesQuantas tuplas gerar no total
min_item_appearancesO número mínimo de tuplas em que cada item aparece
seedFixa a amostragem, para que uma execução possa ser reproduzida
scoring.methodcounting, bradley_terry ou plackett_luce

Aumentar min_item_appearances torna a pontuação de cada item mais precisa, ao custo de mais comparações. É o ajuste a mexer quando as pontuações saem ruidosas.

Formato dos Dados

Cada linha do arquivo de dados é um item, e o Potato amostra as tuplas desse conjunto.

json
{"id": "sys_a", "text": "Le chat s'est assis sur le tapis."}
{"id": "sys_b", "text": "Le chat a assis sur le tapis."}
{"id": "sys_c", "text": "Le chat etait assis sur le mat."}
{"id": "sys_d", "text": "Le chat se tenait sur le tapis."}

A geração de tuplas equilibra o delineamento: cada item aparece aproximadamente o mesmo número de vezes, e os pares que precisam ser comparados aparecem juntos com frequência suficiente para que as pontuações sejam comparáveis. Definir seed torna essa distribuição reproduzível.

Pontuação

A pontuação é feita depois da coleta, pela linha de comando:

bash
python -m potato.bws_scoring --config config.yaml --method counting

O resultado é gravado em bws_scores.tsv, no diretório de saída, a menos que --output indique outro caminho. As três flags são --config, --method e --output.

Contagem

O método padrão, e o mais transparente. A pontuação de um item é a proporção de vezes em que ele foi escolhido como melhor menos a proporção de vezes em que foi escolhido como pior, então as pontuações vão de -1,0 a +1,0. Não exige dependências extras e é o método a relatar quando você quer que o leitor consiga recalculá-lo à mão.

bash
python -m potato.bws_scoring --config config.yaml --method counting --output scores.tsv

Bradley-Terry

Ajusta um modelo sobre as comparações pareadas que cada tupla implica: o melhor item vence todos os outros itens da sua tupla, e todos os outros vencem o pior. Lida melhor com dados esparsos do que a contagem.

bash
python -m potato.bws_scoring --config config.yaml --method bradley_terry

Plackett-Luce

Trata cada julgamento como duas escolhas: o melhor da tupla inteira e, depois, o pior entre os itens restantes. Esse é o modelo MaxDiff de como os julgamentos best-worst são feitos. Ajusta uma utilidade por item por máxima verossimilhança. Antes da 2.10.2, ajustava os mesmos pares que o Bradley-Terry e retornava pontuações idênticas; por isso, se você relatou os resultados dele, recalcule as pontuações com a 2.10.2 ou posterior.

bash
python -m potato.bws_scoring --config config.yaml --method plackett_luce

Escolhendo um Método

MétodoVelocidadeInformação usadaIndicado para
countingRápidoContagens de melhor e de piorAnálise exploratória e resultados que você quer que sejam fáceis de conferir
bradley_terryMédioComparações pareadas implícitasO padrão habitual
plackett_luceMais lentoCada escolha de melhor e de pior, na ordem em que é feitaUm modelo de verossimilhança do próprio julgamento

bradley_terry precisa de pip install choix. plackett_luce usa o scipy, que o Potato já instala.

Várias Dimensões ao Mesmo Tempo

Dois esquemas de BWS sobre os mesmos itens coletam dois julgamentos por tupla, o que custa um par extra de cliques em vez de uma segunda passada pelo corpus:

yaml
annotation_schemes:
  - annotation_type: bws
    name: fluency
    description: "Select the BEST and WORST by fluency"
    tuple_size: 4
    best_description: "Most Fluent"
    worst_description: "Least Fluent"
 
  - annotation_type: bws
    name: adequacy
    description: "Select the BEST and WORST by meaning preservation"
    tuple_size: 4
    best_description: "Most Accurate"
    worst_description: "Least Accurate"

O Que a Saída Contém

Cada esquema registra o item escolhido como melhor e o item escolhido como pior:

json
{
  "fluency": {"best": "sys_d", "worst": "sys_c"},
  "adequacy": {"best": "sys_a", "worst": "sys_c"}
}

As pontuações não estão neste arquivo. Elas são calculadas depois pelo potato.bws_scoring, e é isso que permite pontuar de novo um estudo concluído com outro método sem coletar nada outra vez.

Monitoramento

O painel de administração tem uma aba de BWS que mostra o progresso da anotação e as pontuações atuais dos itens, para que você veja se o ranking se estabilizou antes de decidir encerrar a coleta.

Exemplo Completo

yaml
annotation_task_name: "MT System Ranking (BWS)"
task_dir: "."
 
data_files:
  - "data/mt_systems.jsonl"
 
item_properties:
  id_key: id
  text_key: text
 
bws_config:
  tuple_size: 4
  min_item_appearances: 8
  seed: 42
  scoring:
    method: bradley_terry
 
annotation_schemes:
  - annotation_type: bws
    name: overall_quality
    description: "Select the BEST and the WORST translation"
    tuple_size: 4
    best_description: "Best Translation"
    worst_description: "Worst Translation"
    sequential_key_binding: true
    label_requirement:
      required: true
 
output_annotation_dir: "annotation_output/"
export_annotation_format: jsonl
 
user_config:
  allow_all_users: true

Colete as anotações e depois calcule as pontuações:

bash
potato start config.yaml -p 8000
python -m potato.bws_scoring --config config.yaml --method bradley_terry

Leitura Adicional

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