Skip to content

Annotazione multilingue e per lingue a bassa disponibilità di risorse

Annotare in lingue diverse dall'inglese: il divario di risorse, i metodi partecipativi con parlanti nativi e come localizzare l'interfaccia di Potato con scrittura da destra a sinistra, font ed etichette tradotte.

Annotare in una lingua diversa dall'inglese sono due problemi in uno. Quello scientifico: la maggior parte delle risorse NLP copre una manciata di lingue, le categorie non si trasferiscono in modo pulito da una cultura all'altra e per ottenere buone etichette servono parlanti veri, non semplici bilingui. Quello pratico: far sì che lo strumento visualizzi la lingua correttamente, comprese le scritture da destra a sinistra e i font non latini. Il secondo Potato lo risolve con la configurazione; il primo tocca a te. Questa guida tratta entrambi.

Il divario di risorse esiste ed è ampio

Al mondo si contano circa 7.000 lingue e l'NLP ne serve davvero qualche decina. Joshi et al. (2020) hanno quantificato il fenomeno: poche lingue dispongono di dati etichettati in abbondanza, mentre la stragrande maggioranza, parlata da miliardi di persone, non ne ha quasi nessuno, e il divario si autoalimenta perché le risorse vanno alle lingue che già le hanno. Di solito il collo di bottiglia è l'annotazione. Se vuoi che un modello funzioni in una lingua a bassa disponibilità di risorse, qualcuno deve etichettare dati in quella lingua, ed è lì che la qualità si guadagna o si perde.

Annota con la comunità linguistica, non solo nella sua lingua

L'istinto porta ad assumere crowdworker bilingui a poco prezzo e a tradurre una linea guida inglese. Entrambe le mosse sono rischiose. Bird (2020) critica gli approcci estrattivi che trattano una comunità linguistica come una fonte di dati, e il modello partecipativo del progetto Masakhane (Nekoto et al., 2020) mostra l'alternativa che funziona su larga scala per le lingue africane: i parlanti nativi contribuiscono a progettare il task, scrivono le linee guida e sono titolari delle etichette, invece di limitarsi a convalidare scelte fatte altrove. Ne discendono due conseguenze pratiche:

  • Recluta parlanti fluenti, possibilmente della varietà giusta. Una lingua non è un blocco unico: dialetto, area geografica e registro contano, e chi parla una varietà può etichettare male un'altra. Bilingue non equivale a nativo.
  • Non dare per scontato che le categorie si trasferiscano. Sentiment, offensività, cortesia e perfino i tipi di entità nominate sono legati alla cultura. Una linea guida che regge per la cortesia in inglese può rompersi senza avvisare in una lingua dove la cortesia è codificata nella grammatica. Fai adattare ai parlanti lo schema, non solo le parole. È una scelta di progettazione dello schema, non un lavoro di traduzione.

Diversi task della vetrina riproducono questo tipo di dati multilingui e sono buoni punti di partenza: inferenza linguistica cross-lingue in 15 lingue (XNLI), qualità della traduzione su 200 lingue (FLORES) e sentiment per le lingue regionali dell'Indonesia (NusaX).

Localizzare l'interfaccia di Potato

La metà pratica. Potato localizza l'interfaccia che vede l'annotatore tramite configurazione, senza toccare il codice, anche se conviene conoscerne i limiti da subito.

Testo dell'interfaccia. Il blocco ui_language è una tabella di stringhe per le parti fisse dell'interfaccia. Imposta la lingua del documento e traduci i pulsanti e i titoli che l'annotatore ha davanti:

yaml
ui_language:
  html_lang: ar
  html_dir: rtl            # right-to-left for Arabic, Hebrew, etc.
  submit_button: "إرسال"
  instructions_heading: "التعليمات"

Con html_dir: rtl l'intero documento si ribalta per le scritture da destra a sinistra, sfruttando la gestione bidirezionale nativa del browser. Un limite da dichiarare: ui_language copre le schermate principali di annotazione e di login, ma diverse pagine lato amministrazione (dashboard, aggiudicazione, addestramento e logout) sono ancora solo in inglese, quindi tienine conto se i tuoi annotatori ci passeranno.

Font per le scritture non latine. I browser non sempre hanno un buon font predefinito per le scritture CJK, araba o indiane. Caricane uno con un foglio di stile di progetto usando base_css:

yaml
base_css: "css/noto_font.css"

Dati non in inglese. Potato legge i file di dati come UTF-8 per impostazione predefinita e rende qualsiasi Unicode nel campo di testo, quindi i contenuti non inglesi si vedono così come sono. Se un file usa una codifica diversa, puoi cambiarla per singolo file (encoding:) o a livello globale (data_directory_encoding:).

Etichette tradotte. Qui sta la trappola meno evidente. Per impostazione predefinita Potato «umanizza» i nomi delle etichette, riformattandoli e mettendo le iniziali maiuscole, e questo può storpiare le scritture non latine. Tieni nomi (name) inglesi leggibili dalla macchina per i tuoi dati e mostra all'annotatore un'etichetta tradotta con displayed_label, disattivando l'umanizzazione:

yaml
annotation_schemes:
  - name: sentiment
    annotation_type: radio
    description: "ما هو شعور هذا النص؟"
    humanize_labels: false
    labels:
      - name: positive
        displayed_label: "إيجابي"
      - name: negative
        displayed_label: "سلبي"
      - name: neutral
        displayed_label: "محايد"

L'annotazione salvata resta positive, così i dati restano puliti mentre l'annotatore lavora interamente in arabo.

Istruzioni e consenso. Scrivi le pagine di consenso e istruzioni di surveyflow direttamente nella lingua di destinazione: sono file HTML scritti da te, e niente ti obbliga all'inglese. Per eseguire lo stesso task in più lingue, Potato include lo script setup_multilingual_config.py, che genera una configurazione per lingua a partire da un modello.

Approfondimenti