API Structural DiffStatuts de diff

Statuts de diff

Un exemple d'entrée/sortie par statut. Sans ambiguïté.

Le moteur assigne exactement un statut à chaque ligne originale après l'alignement en 8 passes. SPLIT et MERGED sont les seuls cas où une ligne d'entrée correspond à plusieurs lignes de sortie (ou vice versa). Cette page montre le payload minimal déclenchant chaque statut, la structure de réponse attendue et le contexte de workflow.

Note sur le pipeline du moteur

L'algorithme en 8 passes traite chaque ligne originale contre toutes les lignes retravaillées et assigne le meilleur statut basé sur la similarité textuelle, la proximité temporelle et les vérifications structurelles. Les passes s'exécutent en ordre : correspondance exacte → haute similarité → détection de division → détection de fusion → correspondances faibles → restes non appariés.

Pour construire un comptage résumé, ignorez les lignes où notes contient "Source row". Ce sont des artefacts MERGED qui ne doivent pas être comptés deux fois.
UNCHANGED

UNCHANGED

Les deux versions contiennent une ligne au contenu identique sur toutes les colonnes mappées (après normalisation des espaces).

Original

  "original": [{ "speaker": "Alice", "transcript": "Good morning everyone." }],

Reworked

  "reworked": [{ "speaker": "Alice", "transcript": "Good morning everyone." }]

API Result

json
{
  "status": "UNCHANGED",
  "notes": "exact match",
  "snapData": ["Alice", "Good morning everyone."],
  "currData": ["Alice", "Good morning everyone."]
}
json
{
  "original": [{ "speaker": "Alice", "transcript": "Good morning everyone." }],
  "reworked": [{ "speaker": "Alice", "transcript": "Good morning everyone." }]
}
json
{
  "status": "UNCHANGED",
  "notes": "exact match",
  "snapData": ["Alice", "Good morning everyone."],
  "currData": ["Alice", "Good morning everyone."]
}

When you see this

Chaque ligne que l'annotateur a acceptée sans modification. Représente typiquement 20–60% des lignes selon le niveau d'édition.

Request note

Le texte de transcription et toutes les colonnes mappées doivent être identiques. La casse et la ponctuation sont significatives.

Response note

snapData et currData sont présents et identiques. Le champ notes vaut "exact match" ou "high similarity match".

Workflow context

Un taux UNCHANGED très élevé (>90%) peut indiquer que l'annotateur n'a pas examiné complètement la transcription. Un taux très bas (<10%) peut indiquer une mauvaise qualité de base AI ou une sur-édition.

MODIFIED

MODIFIED

Le moteur a fait correspondre une ligne de l'original à une ligne dans reworked, mais au moins une valeur de colonne a changé.

Transcript diff example

Original

[{ "speaker": "Doctor", "transcript": "I've been having headaches for the past two weeks" }]

Reworked

[{ "speaker": "Doctor", "transcript": "I've been having headaches for the past 2 weeks" }]

API Result

json
{
  "status": "MODIFIED",
  "notes": "transcript changed",
  "transcriptDiff": [
    { "type": "equal",  "value": "I've been having headaches for the past " },
    { "type": "delete", "value": "two weeks" },
    { "type": "insert", "value": "2 weeks" }
  ],
  "snapData": ["Doctor", "I've been having headaches for the past two weeks"],
  "currData": ["Doctor", "I've been having headaches for the past 2 weeks"]
}

Live transcriptDiff rendering

Example rendering of transcriptDiff tokens

Thanks, Sarah. gGlad to be here I haI've been looking forward to this conversation for weeks.

When you see this

Corrections textuelles, modifications de ponctuation, formatage des chiffres, corrections de noms de locuteurs, modifications de timestamps ou d'étiquettes d'émotion.

Request note

La ligne doit exister dans les deux versions avec une similarité suffisante pour que le moteur fasse une correspondance confiante.

Response note

Quand la colonne transcript a changé, la réponse inclut un tableau transcriptDiff avec des tokens de diff au niveau caractère.

Workflow context

Les lignes MODIFIED sont la cible principale de révision. Chacune représente une correction faite par l'annotateur. CER et WER sont calculés à partir de ces changements.

ADDED

ADDED

Une ligne dans reworked n'a pas de correspondance dans original. Le moteur a épuisé toutes les passes de correspondance sans trouver de source.

json
{
  "original": [{ "speaker": "Agent", "transcript": "Let me pull up your account." }],
  "reworked": [
    { "speaker": "Agent",    "transcript": "Let me pull up your account." },
    { "speaker": "Customer", "transcript": "Thank you." }
  ]
}
json
{
  "results": [
    { "status": "UNCHANGED", "notes": "exact match", ... },
    {
      "status": "ADDED",
      "notes": "new row in reworked",
      "currData": ["Customer", "Thank you."]
    }
  ]
}

When you see this

L'annotateur a ajouté un segment manquant dans l'IA. Causes courantes : segment silencieux non détecté, code-switching manqué, ou division surfacée en ADDED si la détection de split est désactivée.

Request note

Activez enableSplits: false si vous voulez que toutes les divisions remontent comme MODIFIED + ADDED plutôt que le label structurel SPLIT.

Response note

Seul currData est présent (pas de snapData). Le champ notes vaut "new row in reworked".

Workflow context

Le comptage ADDED indique combien de segments l'IA a manqués. Combiné à DELETED, vous obtenez la qualité de segmentation de la base.

DELETED

DELETED

Une ligne dans original n'a pas de correspondance dans reworked. L'annotateur l'a supprimée entièrement.

json
{
  "original": [
    { "speaker": "Host", "transcript": "Welcome to the show." },
    { "speaker": "[noise]", "transcript": "[background music fades]" }
  ],
  "reworked": [
    { "speaker": "Host", "transcript": "Welcome to the show." }
  ]
}
json
{
  "results": [
    { "status": "UNCHANGED", "notes": "exact match", ... },
    {
      "status": "DELETED",
      "notes": "row removed from reworked",
      "snapData": ["[noise]", "[background music fades]"]
    }
  ]
}

When you see this

L'IA a transcrit du bruit comme de la parole, produit une fausse utterance, ou créé un segment dupliqué à une frontière.

Request note

Une ligne DELETED signifie que l'annotateur a pris une décision de suppression explicite — contrairement à MODIFIED où seul le contenu a changé.

Response note

Seul snapData est présent (pas de currData). Le champ notes vaut "row removed from reworked".

Workflow context

Des DELETED inattendus dans une passe de révision indiquent un nettoyage plus agressif qu'attendu ou des problèmes de qualité du modèle AI.

SPLIT

SPLIT

Une ligne originale correspond à deux ou plusieurs lignes retravaillées consécutives dont la transcription combinée reconstruit l'original.

One row → two rows

Original

[{
  "speaker": "Candidate",
  "transcript": "For new users we relied on content-based filtering. For new items we used metadata clustering to find similar items with existing ratings."
}]

Reworked

[
  { "speaker": "Candidate", "transcript": "For new users, we relied on content-based filtering." },
  { "speaker": "Candidate", "transcript": "For new items, we used metadata clustering to find similar items with existing ratings." }
]

API Result

json
{
  "status": "SPLIT",
  "notes": "split into 2 rows",
  "originalRow": {
    "transcript": "For new users we relied on content-based filtering. For new items..."
  },
  "reworkedRows": [
    { "transcript": "For new users, we relied on content-based filtering." },
    { "transcript": "For new items, we used metadata clustering..." }
  ]
}

When you see this

L'annotateur a déterminé que le segment IA était trop long et contenait deux utterances distinctes ou deux tours de parole, et l'a divisé à une frontière naturelle.

Request note

La ligne originale doit être suffisamment similaire au texte combiné des lignes retravaillées. La plausibilité temporelle est également vérifiée.

Response note

L'entrée de ligne originale a status: "SPLIT". Le SER (taux d'erreur de segmentation) est incrémenté par cette ligne.

Workflow context

Les splits sont le changement structurel le plus significatif entre les couches d'annotation. Un comptage élevé indique que la couche précédente sous-segmentait.

MERGED

MERGED

Deux lignes originales ou plus correspondent à une ligne retravaillée dont la transcription est proche du texte combiné des originaux.

Two rows → one merged row (+ two source rows in response)

Original

[
  { "speaker": "Elena", "transcript": "That resonates with our work at the localization lab." },
  { "speaker": "Elena", "transcript": "Standard Arabic models fail on Tunisian input." }
]

Reworked

[{
  "speaker": "Elena",
  "transcript": "That resonates with our work at the localization lab — standard Arabic models fail on Tunisian input."
}]

API Result

json
{
  "results": [
    {
      "status": "MERGED",
      "notes": "merged from 2 rows",
      "reworkedRow": {
        "transcript": "That resonates with our work at the localization lab — standard Arabic models fail on Tunisian input."
      }
    },
    {
      "status": "MERGED",
      "notes": "Source row 1/2 · merged into reworked row 0",
      "snapData": ["Elena", "That resonates with our work at the localization lab."]
    },
    {
      "status": "MERGED",
      "notes": "Source row 2/2 · merged into reworked row 0",
      "snapData": ["Elena", "Standard Arabic models fail on Tunisian input."]
    }
  ]
}

When you see this

L'annotateur a déterminé que des segments consécutifs devaient être joints. Courant quand l'IA a sur-segmenté aux pauses respiratoires ou aux frontières de ponctuation.

Request note

Les lignes originales absorbées doivent avoir une similarité textuelle combinée suffisante. Elles apparaissent aussi dans les résultats comme entrées "Source row".

Response note

La ligne résultat fusionnée a status: "MERGED". Chaque ligne originale absorbée apparaît avec notes: "Source row N/M · merged into reworked row X". Filtrez-les dans les comptages.

Workflow context

Un comptage MERGED élevé indique que l'IA sur-segmentait. Combiné avec SPLIT, le ratio indique si l'IA tend vers la sur- ou sous-segmentation.

transcriptDiff : diff au niveau caractère

Pour les lignes MODIFIED où la colonne transcript a changé, la réponse inclut un tableau transcriptDiff. Chaque token a un type ("EQUAL", "DELETE", ou "INSERT") et un champ text (les caractères). Note : les types sont en MAJUSCULES. Ce champ est absent quand enableInlineDiff: false est défini.

"EQUAL" — caractères présents dans les deux versions (afficher en texte normal)
"DELETE" — caractères présents uniquement dans l'original (barrer ou surligner en rouge)
"INSERT" — caractères présents uniquement dans reworked (surligner en vert)
json
"transcriptDiff": [
  { "type": "equal",  "value": "I've been having headaches for the past " },
  { "type": "delete", "value": "two" },
  { "type": "insert", "value": "2" },
  { "type": "equal",  "value": " weeks" }
]

Lignes source (artefact MERGED)

Quand un MERGE est détecté, le tableau de résultats inclut à la fois la ligne fusionnée et une entrée "Source row" par original absorbé. Les lignes source ont status: "MERGED" et des notes commençant par "Source row N/M · merged into reworked row X".

js
// Ignorer les lignes source dans le comptage résumé
const primaryResults = results.filter(
  r => !(r.status === "MERGED" && r.notes?.includes("Source row"))
)

Comptage correct des statuts

La longueur du tableau results égale originalRows + extra-lignes-SPLIT + lignes-source-MERGED. Utilisez ce tableau pour construire des comptages corrects :

StatutStratégie de comptageNote
UNCHANGEDCompter toutes
MODIFIEDCompter toutes
ADDEDCompter toutes
DELETEDCompter toutes
SPLITCompter toutesUne entrée par ligne originale divisée, quel que soit le nombre de lignes retravaillées produites
MERGEDCompter uniquement les lignes où notes ne contient PAS "Source row"Les lignes source sont des entrées de traçage pour les originaux absorbés
Guide des statuts · API Structural Diff · Développé par Mohamed Yaakoubi← Retour à l'API Structural Diff