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 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.
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: trueO 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ção | Descrição |
|---|---|
tuple_size | Quantos itens aparecem em uma tupla |
num_tuples | Quantas tuplas gerar no total |
min_item_appearances | O número mínimo de tuplas em que cada item aparece |
seed | Fixa a amostragem, para que uma execução possa ser reproduzida |
scoring.method | counting, 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.
{"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:
python -m potato.bws_scoring --config config.yaml --method countingO 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.
python -m potato.bws_scoring --config config.yaml --method counting --output scores.tsvBradley-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.
python -m potato.bws_scoring --config config.yaml --method bradley_terryPlackett-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.
python -m potato.bws_scoring --config config.yaml --method plackett_luceEscolhendo um Método
| Método | Velocidade | Informação usada | Indicado para |
|---|---|---|---|
counting | Rápido | Contagens de melhor e de pior | Análise exploratória e resultados que você quer que sejam fáceis de conferir |
bradley_terry | Médio | Comparações pareadas implícitas | O padrão habitual |
plackett_luce | Mais lento | Cada escolha de melhor e de pior, na ordem em que é feita | Um 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:
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:
{
"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
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: trueColete as anotações e depois calcule as pontuações:
potato start config.yaml -p 8000
python -m potato.bws_scoring --config config.yaml --method bradley_terryLeitura Adicional
- Comparação Pareada - o caso de dois itens
- Escalas Likert - avaliação direta em vez de comparação
- Formatos de Exportação - como extrair as anotações
Para detalhes de implementação, consulte a documentação de origem.