Skip to content

Best-Worst Scaling

Best-Worst Scaling in Potato. Gli annotatori scelgono l'elemento migliore e il peggiore in ogni tupla, e il conteggio, Bradley-Terry o Plackett-Luce li trasformano in punteggi.

Novità nella v2.3.0

Il Best-Worst Scaling (BWS), noto anche come MaxDiff, mostra all'annotatore una tupla di elementi, di solito quattro, e chiede di indicare il migliore e il peggiore secondo un certo criterio. Due clic per tupla producono più informazione di una valutazione, e poiché il giudizio è comparativo evita il problema per cui il 7 di un annotatore è il 5 di un altro.

Vale la pena configurare il BWS quando:

  • Le valutazioni numeriche dirette risentono delle differenze nell'uso della scala tra annotatori
  • Serve una classifica affidabile su centinaia o migliaia di elementi
  • La dimensione di qualità è per sua natura relativa, ad esempio quale traduzione si legge in modo più scorrevole

Interfaccia di annotazione Best-Worst ScalingInterfaccia Best-Worst Scaling per l'annotazione comparativa in Potato

Configurazione

Un task BWS ha due parti. Lo schema dice che cosa viene chiesto all'annotatore, mentre il blocco di primo livello bws_config dice come vengono costruite e valutate le tuple.

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

Lo schema accetta tuple_size, best_description, worst_description, sequential_key_binding e label_requirement, e nient'altro. Tutto ciò che riguarda la generazione o la valutazione delle tuple va in bws_config.

Uno schema bws senza un blocco bws_config mostra una domanda su un elenco di elementi vuoto. È il motivo più comune per cui un task BWS appare vuoto.

Opzioni di bws_config

OpzioneDescrizione
tuple_sizeQuanti elementi compaiono in una tupla
num_tuplesQuante tuple generare in totale
min_item_appearancesIl numero minimo di tuple in cui compare ciascun elemento
seedFissa il campionamento, così che un'esecuzione sia riproducibile
scoring.methodcounting, bradley_terry o plackett_luce

Aumentare min_item_appearances rende più preciso il punteggio di ogni elemento, al costo di più confronti. È la leva da usare quando i punteggi risultano rumorosi.

Formato dei dati

Ogni riga del file di dati è un elemento, e Potato campiona le tuple da questo insieme.

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."}

La generazione delle tuple bilancia il disegno. Ogni elemento compare all'incirca lo stesso numero di volte, e le coppie da confrontare compaiono insieme abbastanza spesso da rendere i punteggi confrontabili. Impostare seed rende riproducibile questa assegnazione.

Calcolo dei punteggi

Il calcolo dei punteggi avviene dopo la raccolta, da riga di comando:

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

Il risultato viene scritto in bws_scores.tsv nella directory di output, a meno che --output non indichi un altro percorso. I tre flag sono --config, --method e --output.

Conteggio

Il metodo predefinito, e quello trasparente. Il punteggio di un elemento è la quota di volte in cui è stato scelto come migliore meno la quota di volte in cui è stato scelto come peggiore, quindi i punteggi vanno da -1,0 a +1,0. Non richiede dipendenze aggiuntive ed è il metodo da riportare quando vuoi che chi legge possa ricalcolarlo a mano.

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

Bradley-Terry

Adatta un modello ai confronti a coppie implicati da ogni tupla. L'elemento migliore batte ogni altro elemento della sua tupla, e ogni altro elemento batte il peggiore. Gestisce i dati sparsi meglio del conteggio.

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

Plackett-Luce

Tratta ogni giudizio come due scelte: prima il migliore dall'intera tupla, poi il peggiore tra gli elementi rimasti. È il modello MaxDiff di come si formano i giudizi best-worst. Stima un'utilità per ogni elemento per massima verosimiglianza. Prima della 2.10.2 stimava le stesse coppie di Bradley-Terry e restituiva punteggi identici, quindi se ne hai riportato i risultati ricalcola i punteggi con la 2.10.2 o successiva.

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

Scegliere un metodo

MetodoVelocitàInformazione usataIdeale per
countingVeloceConteggi di migliore e peggioreAnalisi esplorative e risultati che si vogliono facili da verificare
bradley_terryMediaConfronti a coppie implicitiLa scelta predefinita abituale
plackett_lucePiù lentaOgni scelta del migliore e del peggiore, nell'ordine in cui viene fattaUn modello di verosimiglianza del giudizio stesso

bradley_terry richiede pip install choix. plackett_luce usa scipy, che Potato installa già.

Più dimensioni insieme

Due schemi BWS sugli stessi elementi raccolgono due giudizi per tupla, il che costa una coppia di clic in più invece di un secondo passaggio sul 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"

Che cosa contiene l'output

Ogni schema registra l'elemento scelto come migliore e quello scelto come peggiore:

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

I punteggi non sono in questo file. Vengono calcolati in seguito da potato.bws_scoring, ed è questo che ti permette di ricalcolare i punteggi di uno studio concluso con un altro metodo senza raccogliere di nuovo nulla.

Monitoraggio

La dashboard di amministrazione include una scheda BWS che mostra l'avanzamento dell'annotazione e i punteggi correnti degli elementi, così puoi verificare se la classifica si è stabilizzata prima di decidere di interrompere la raccolta.

Esempio 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

Raccogli le annotazioni, poi calcola i punteggi:

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

Ulteriori letture

Per i dettagli di implementazione, consulta la documentazione sorgente.