API Structural DiffParamètres de configuration

Paramètres de configuration

Sachez exactement quel paramètre activer et pourquoi.

La configuration par défaut fonctionne bien pour la plupart des transcriptions. Ces paramètres existent pour gérer des workflows d'annotation spécifiques : QA arabe, comparaison positionnelle, exclusion de colonnes de métadonnées et contrôle de la détection structurelle. Chaque section montre la différence exacte produite dans les résultats.

Quand personnaliser la configuration

Commencez sans configuration. Lancez un diff et analysez les résultats. N'utilisez un paramètre que lorsque vous identifiez un problème précis :

stripDiacriticsTranscriptions arabes où les ajouts de diacritiques gonflent le nombre de MODIFIED
simpleModeQA purement de contenu — vous savez que l'annotateur n'a fait aucun changement structurel
ignoreColNamesColonnes de métadonnées (score de confiance, catégorie) qui diffèrent entre les couches QA mais ne sont pas la cible de comparaison
positionalModeDébogage d'alignements inattendus, ou traitement de grands ensembles de données uniformes
enableSplits: falseLes directives du projet interdisent les divisions à cette couche d'annotation
enableInlineDiff: falseGrands lots où seuls les statuts et scores sont nécessaires — supprimer le calcul du diff de transcription pour la vitesse
structuralTransformsLes lignes ont des préfixes ID, URL ou formats téléphoniques qui varient entre les couches mais ne font pas partie du contenu de la transcription

simpleMode

Par défaut, le moteur exécute un algorithme d'alignement en 8 passes qui fait correspondre les lignes par similarité sur l'ensemble de la transcription, même si elles ont changé de position. simpleMode désactive ceci : la ligne 0 est comparée à la ligne 0, la ligne 1 à la ligne 1, strictement par position.

Par défaut (simpleMode: false) : le moteur détecte qu'un long segment a été divisé en deux et l'étiquette SPLIT.

Original

{
  "original": [
    { "speaker": "Candidate", "words": "For new users we relied on content-based filtering. For new items we used metadata clustering to find similar items." }
  ],
  "reworked": [
    { "speaker": "Candidate", "words": "For new users, we relied on content-based filtering." },
    { "speaker": "Candidate", "words": "For new items, we used metadata clustering to find similar items." }
  ]
}

Reworked

/* config: {} (default) */

API Result

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

Avec simpleMode: true : le moteur compare la ligne 0 à la ligne 0 (trouve une différence → MODIFIED) et voit une ligne supplémentaire dans reworked (→ ADDED). L'intention structurelle est perdue, mais chaque modification de caractère est visible.

json
{
  "results": [
    {
      "status": "MODIFIED",
      "notes": "words changed",
      "snapData": ["Candidate", "For new users we relied on content-based filtering..."],
      "currData": ["Candidate", "For new users, we relied on content-based filtering."],
      "transcriptDiff": [
        { "type": "equal",  "value": "For new users" },
        { "type": "insert", "value": "," },
        { "type": "equal",  "value": " we relied on content-based filtering." }
      ]
    },
    {
      "status": "ADDED",
      "notes": "new row in reworked",
      "currData": ["Candidate", "For new items, we used metadata clustering..."]
    }
  ]
}

Utilisez quand vous êtes certain que l'annotateur n'a fait aucun changement structurel — seulement des corrections textuelles et de ponctuation. Également utile pour obtenir des diffs de caractères bruts sans interprétation structurelle.

simpleMode est plus rapide sur les grands ensembles de données car il ignore l'alignement. Le compromis est des faux comptes MODIFIED/ADDED/DELETED là où SPLIT/MERGED serait plus précis.

enableSplits / enableMerges

Alternatives plus granulaires à simpleMode. Au lieu de désactiver toute la détection structurelle, vous pouvez désactiver un seul type.

SPLIT

enableSplits: false — les candidats SPLIT sont émis comme MODIFIED (correspondance tronquée) + ADDED (lignes résiduelles). Utile quand vos directives interdisent les divisions à cette couche.

MERGED

enableMerges: false — les candidats MERGE deviennent MODIFIED (première ligne originale) + DELETED (originaux absorbés). Utile quand les fusions ne sont pas permises à cette couche.

json
{
  "config": {
    "enableSplits": false,
    "enableMerges": true
  }
}

Ces paramètres sont utiles dans les pipelines QA multi-couches où chaque couche a ses propres opérations autorisées. Désactiver une opération inattendue fait remonter les changements structurels non autorisés comme des ADDED/DELETED distincts.

stripDiacritics

Avant la comparaison, le moteur normalise les caractères arabes et accentués en supprimant les marques diacritiques. Pour l'arabe, cela inclut les harakat (voyelles courtes : fathah, dammah, kasrah), tanwin, shadda, sukun et variantes de hamza (U+064B–U+065F, U+0670). Ce paramètre est ACTIVÉ par défaut.

Scénario courant de QA arabe : un annotateur normalise le texte selon les guides de style de l'arabe écrit (ajout de harakat, normalisation de hamza). Avec le comportement par défaut (stripDiacritics: true), seules les différences lexicales et de segmentation sont comptées.

Comportement par défaut (stripDiacritics: true — aucune configuration nécessaire) : مرحبا → مرحباً est UNCHANGED car les marques diacritiques sont supprimées avant la comparaison, rendant les formes strippées identiques.

Original

{
  "original": [{ "speaker": "المذيع", "transcript": "مرحبا بكم في نشرة الاخبار" }],
  "reworked": [{ "speaker": "المذيع", "transcript": "مرحباً بكم في نشرة الأخبار" }]
}

Reworked

/* config: {} (default — stripDiacritics: true) */

API Result

json
{ "status": "UNCHANGED", "notes": "high similarity match (diacritics stripped)" }

Avec stripDiacritics: false (remplacement) : مرحبا → مرحباً est MODIFIED car le signe ً n'est plus supprimé — les différences de caractères bruts sont signalées.

json
{ "status": "MODIFIED", "notes": "transcript changed",
  "transcriptDiff": [
    { "type": "EQUAL",  "text": "مرحب" },
    { "type": "DELETE", "text": "ا" },
    { "type": "INSERT", "text": "اً" },
    { "type": "EQUAL",  "text": " بكم في نشرة ال" },
    { "type": "DELETE", "text": "ا" },
    { "type": "INSERT", "text": "أ" },
    { "type": "EQUAL",  "text": "خبار" }
  ]
}
json
{ "config": { "stripDiacritics": false } }

Le comportement par défaut (true) convient à la plupart des QA de transcriptions arabes. Remplacez par stripDiacritics: false uniquement quand vous vérifiez explicitement que l'annotateur a correctement ajouté ou supprimé des marques diacritiques — c'est-à-dire quand la précision diacritique est un critère QA suivi.

positionalMode

Ignore complètement l'algorithme d'alignement par similarité. Chaque ligne originale à l'indice N est comparée à la ligne retravaillée à l'indice N. Si les tableaux ont des longueurs différentes, les lignes supplémentaires sont ADDED ou DELETED.

Par défaut : si un annotateur corrige une phrase et elle passe de la position 4 à la position 6, le moteur les fait quand même correspondre (MODIFIED). Avec positionalMode, la ligne 4 de l'original est comparée à la ligne 4 du reworked — qui peut être une phrase complètement différente.

positionalMode produit des résultats trompeurs quand les lignes ont été réordonnées. N'utilisez que si vous pouvez garantir qu'aucune ligne n'a été ajoutée, supprimée ou réordonnée.

Utile pour le débogage et les ensembles de données très uniformes où la correspondance positionnelle est la vérité terrain.

json
{ "config": { "positionalMode": true } }

ignoreColNames

Un tableau de noms de colonnes à exclure de la détection MODIFIED. Une ligne n'est MODIFIED que si une colonne non ignorée a changé. Les colonnes ignorées sont toujours incluses dans la réponse mais ne déclenchent pas MODIFIED.

Scénario : vos données ont une colonne confidence définie par l'outil d'annotation. La couche QA 1 peut enregistrer confidence: 0.88 tandis que la couche QA 2 enregistre confidence: 0.91 pour la même utterance. Sans ignoreColNames, chaque ligne est MODIFIED même si la transcription est identique.

Without ignoreColNames

Original

{
  "original": [
    { "transcript": "The patient reports mild chest pain.", "speaker": "Doctor", "confidence": 0.88, "category": "symptom" }
  ],
  "reworked": [
    { "transcript": "The patient reports mild chest pain.", "speaker": "Doctor", "confidence": 0.94, "category": "complaint" }
  ]
}

Reworked

/* config: {} */

API Result

json
{ "status": "MODIFIED", "notes": "confidence, category changed" }

With ignoreColNames

json
{
  // request: { "config": { "ignoreColNames": ["confidence", "category"] } }
  "status": "UNCHANGED", "notes": "exact match (after ignoring confidence, category)"
}

Utilisez chaque fois que votre schéma inclut des colonnes de métadonnées qui changent indépendamment du contenu de la transcription : scores de confiance, IDs de réviseur, numéros de lot, étiquettes de catégorie, horodatages auto-générés.

enableInlineDiff

Contrôle si le moteur calcule un diff de caractères inline pour les lignes MODIFIED. Quand activé (défaut), chaque ligne MODIFIED inclut un tableau transcriptDiff pour afficher les changements en surbrillance. Le désactiver ignore entièrement le calcul du diff.

Avec enableInlineDiff: false, les lignes MODIFIED apparaissent toujours dans les résultats (statut et notes inchangés), mais le champ transcriptDiff est absent. À utiliser quand vous avez seulement besoin de comptages de statuts et de scores pour réduire la taille du payload.

json
{ "config": { "enableInlineDiff": false } }

Chaque segment transcriptDiff a la forme { type: "EQUAL" | "INSERT" | "DELETE", text: string }. Reconstruisez l'original en joignant tous les spans non-INSERT ; le reworked en joignant tous les spans non-DELETE. Note : les valeurs de type sont en MAJUSCULES.

json
// transcriptDiff format — type is UPPERCASE, field is "text"
[
  { "type": "EQUAL",  "text": "Hello " },
  { "type": "DELETE", "text": "world" },
  { "type": "INSERT", "text": "there" }
]

Désactivez (enableInlineDiff: false) pour le traitement de grands lots où vous n'avez besoin que de scores CER/WER/SER et de comptages de statuts. Cela réduit à la fois le CPU serveur et la taille du payload réseau. Réactivez pour les interfaces de révision interactives.

Le diff utilise LCS (Plus Longue Sous-séquence Commune). Pour les très longs segments (longueur combinée > CHAR_DIFF_LIMIT), il bascule automatiquement du niveau caractère au niveau mot — retourné dans le même format de tableau.

structuralTransforms

Un tableau de règles de recherche/remplacement appliquées au texte de la transcription AVANT que l'algorithme de scoring de similarité s'exécute. Cela permet au moteur d'aligner des lignes qui diffèrent uniquement par des préfixes ou des formats prévisibles et non-contenu.

Chaque règle : { find: string, replace: string, isRegex: boolean }. Les règles de chaîne font un remplacement littéral. Les règles regex (isRegex: true) supportent la syntaxe regex JavaScript standard (insensible à la casse). Jusqu'à 20 règles par requête.

json
{
  "config": {
    "structuralTransforms": [
      { "find": "^ID-\\d+:\\s*", "replace": "", "isRegex": true },
      { "find": "https?://[^\\s]+",  "replace": "[URL]", "isRegex": true }
    ]
  }
}
Les transformations s'appliquent au SCORING DE SIMILARITÉ uniquement — pas aux données renvoyées dans snapData / currData. Une ligne où seul le préfixe ID a changé sera toujours MODIFIED car le contenu brut diffère. Les transformations assurent l'ALIGNEMENT correct, pas l'absence de modification.

À utiliser quand vos données partagent un schéma commun mais les lignes incluent des IDs auto-générés, des préfixes de lot ou un formatage que l'annotateur a modifié. Sans transformations, l'algorithme traite les lignes avec des préfixes différents comme entièrement différentes — produisant de fausses paires ADDED/DELETED.

Seuils de similarité et de timing experts

Ces sept nombres contrôlent la sensibilité de l'algorithme de correspondance. Les valeurs par défaut sont calibrées pour des segments de transcription de longueur standard (5–30 secondes, 10–60 mots). Ne les ajustez qu'après avoir analysé les scores de similarité bruts.

ParameterDefaultWhen to adjust · Effect
SIM_CONFIDENT
nombre (0–1)
0.70
Deux lignes aussi similaires ou plus sont une correspondance certaine — validée dans la passe haute similarité.
Augmentez pour exiger des correspondances de texte très proches. Diminuez pour les courtes utterances.
SIM_MODERATE
nombre (0–1)
0.40
Correspondance plausible — acceptée quand le timing le confirme aussi.
Diminuez si les annotateurs réécrivent significativement les phrases tout en gardant le même sens.
SIM_WEAK
nombre (0–1)
0.20
Correspondance tentative — acceptée uniquement avec une forte preuve temporelle.
Diminuez à 0.10–0.15 pour les très courts segments (mots isolés, disfluences) qui ne peuvent atteindre 0.20.
TIME_EXACT_TOL
nombre (s)
0.05
Timestamps ≤ cela apart = correspondance exacte.
Augmentez à 0.5–1.0 si l'outil arrondit les timestamps à la seconde entière.
TIME_FUZZY_TOL
nombre (s)
2.5
Timestamps ≤ cela apart = correspondance floue.
Augmentez quand les annotateurs déplacent significativement les limites des segments.
SPLIT_COMBINED_MIN
nombre (0–1)
0.35
Score de texte combiné min pour accepter un SPLIT.
Augmentez pour réduire les faux splits. Diminuez si votre contenu a de très courts segments cibles.
MERGE_COMBINED_MIN
nombre (0–1)
0.65
Score de texte combiné min pour accepter un MERGE.
Augmentez pour réduire les faux merges. Diminuez pour les ensembles avec de nombreuses fusions légitimes.
CHAR_DIFF_LIMIT
entier (100–50000)
1500
Longueur de caractères combinée max avant de basculer vers un diff au niveau mot.
Augmentez pour les lots avec de très longs segments. Diminuez pour forcer les diffs au niveau mot sur tous les segments.
json
{
  "config": {
    "SIM_WEAK": 0.15,
    "TIME_EXACT_TOL": 1.0,
    "SPLIT_COMBINED_MIN": 0.70
  }
}
Guide des paramètres · API Structural Diff · Développé par Mohamed Yaakoubi← Retour à l'API Structural Diff