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
enableCER / enableWEROptimisation des performances pour les grands lots — ignorer Levenshtein quand seules les métriques structurelles ou de phrase sont nécessaires
enableComposite: falseSupprimer la note agrégée quand votre système consomme les valeurs individuelles directement
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/SegER/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.

Indicateurs de scoring

Six paramètres booléens contrôlent les métriques calculées par le moteur et si une note composite est renvoyée. Tous sont à true par défaut. Désactiver un indicateur ignore entièrement sa boucle de calcul — le champ est null dans la réponse, pas 0.

FlagDefaultWhat it measures · When to disable
enableCERtrue
Taux d'erreur de caractère sur toutes les colonnes (overallCER). Calculé via Levenshtein sur les chaînes de ligne sérialisées. Utilisez enableTranscriptCER pour contrôler indépendamment la variante colonne transcript uniquement.
Quand vous n'avez besoin que de métriques structurelles ou de phrase. Levenshtein est O(m×n) — ignorer CER + WER sur les grands lots (5 000+ longs segments) réduit notablement la latence.
enableTranscriptCERtrue
Calcule transcriptCER — CER limité à la colonne transcript uniquement. Indépendant de enableCER : désactiver enableCER supprime overallCER mais laisse transcriptCER actif, et inversement.
Quand vous avez besoin de overallCER mais pas de la décomposition transcript uniquement, ou inversement.
enableWERtrue
Taux d'erreur de mot sur toutes les colonnes (overallWER). Tokenise par espace blanc après suppression de la ponctuation. Utilisez enableTranscriptWER pour contrôler indépendamment la variante transcript uniquement.
Mêmes conditions qu'enableCER. Généralement désactivé en même temps.
enableTranscriptWERtrue
Calcule transcriptWER — WER limité à la colonne transcript uniquement. Indépendant de enableWER.
Quand vous avez besoin de overallWER mais pas de la décomposition transcript uniquement, ou inversement.
enableSegERtrue
Taux d'erreur de segmentation : événements limites (splits + merges + lignes ajoutées + supprimées) / nombre de segments attendus. Le signal de qualité structurelle — indépendant du contenu textuel.
Uniquement si votre pipeline ne s'intéresse qu'aux changements lexicaux et que les événements de segmentation sont non pertinents — rare pour la QA de transcriptions.
enableSERtrue
Taux d'erreur de phrase : lignes MODIFIED / (lignes UNCHANGED + MODIFIED). Fraction des lignes comparables avec au moins une modification. Renvoie null — pas 0 — quand le dénominateur est 0 (toutes les lignes sont des événements structurels sans paires comparables).
Quand vous n'avez besoin que de taux d'erreur caractère/mot sans signal au niveau phrase.
enableTranscriptSERtrue
SER au niveau phrase dans le texte de la colonne transcript. Découpe le contenu en phrases (sur . ! ? ؟ et sauts de ligne) et compte les phrases modifiées sur les lignes MODIFIED, MERGED et SPLIT. Analogue à transcriptWER mais au niveau phrase plutôt que mot — mesure le renouvellement de phrases dans le document, pas les modifications au niveau ligne.
Quand le SER au niveau ligne (enableSER) est suffisant et que la granularité phrase n'apporte pas de valeur diagnostique supplémentaire.
enableSACRtrue
Taux de changement d'attribution de locuteur : lignes où la colonne speaker a changé / lignes MODIFIED. Détection automatique des colonnes nommées speaker, talker ou spk. Renvoie null automatiquement sans colonne speaker — activer sur des données sans speaker ne coûte rien.
Uniquement pour supprimer explicitement le champ SACR de la réponse quelle que soit la présence d'une colonne speaker.
enableCompositetrue
Calcule la moyenne des notes par métrique (échelle 1–5) des métriques activées ayant produit une valeur non nulle. CER, Transcript CER, WER, Transcript WER, SegER, SER et Transcript SER contribuent — SACR est exclu car de nombreux jeux de données n'ont pas de colonne speaker, rendant un composite incluant SACR incomparable entre lots.
Quand votre système lit directement les valeurs individuelles sans afficher de note agrégée.
cerInCompositetrue
Inclure CER dans le calcul de la note composite. Quand false, CER est toujours calculé et renvoyé dans la réponse mais n'affecte pas le composite.
Quand CER est une métrique de diagnostic uniquement et que vous voulez que le composite reflète WER/SegER/SER seulement.
werInCompositetrue
Inclure WER dans le calcul de la note composite. Quand false, WER est calculé mais exclu de la moyenne composite.
Quand WER est suivi comme référence mais ne doit pas pénaliser le composite (ex. : segments très courts où le nombre de mots est peu fiable).
segerInCompositetrue
Inclure SegER dans le calcul de la note composite. Quand false, SegER est calculé mais exclu de la moyenne composite.
Quand la qualité de la segmentation est un problème séparé examiné indépendamment et ne doit pas faire baisser la note composite globale.
serInCompositetrue
Inclure SER dans le calcul de la note composite. Quand false, SER est calculé mais utilisé comme signal diagnostique autonome sans affecter le composite.
Quand le taux d'erreur de phrase est un signal de diagnostic uniquement et que vous voulez que CER/WER/SegER déterminent le composite.
transcriptCerInCompositetrue
Inclure le CER de transcription dans le calcul de la note composite. Quand false, transcriptCER est toujours calculé et renvoyé mais n'affecte pas le composite.
Quand le CER de la colonne transcript est une métrique de référence uniquement et que vous voulez que le composite reflète les autres métriques.
transcriptWerInCompositetrue
Inclure le WER de transcription dans le calcul de la note composite. Quand false, transcriptWER est calculé mais exclu de la moyenne composite.
Quand le WER de la colonne transcript est suivi comme référence mais ne doit pas influencer la note composite.
transcriptSerInCompositetrue
Inclure le SER de transcription dans le calcul de la note composite. Quand false, transcriptSER est calculé mais utilisé comme signal diagnostique de phrase sans affecter le composite.
Quand le taux de renouvellement de phrases est un signal secondaire et que vous voulez que CER/WER/SegER/SER déterminent le composite.
json
{
  "config": {
    "enableCER": false,
    "enableWER": false,
    "enableSACR": false
  }
}
Le composite est dynamique : désactivez WER ou définissez werInComposite: false et la moyenne se recalcule sur les métriques contribuant restantes. Utilisez cerInComposite, werInComposite, segerInComposite, serInComposite, transcriptCerInComposite, transcriptWerInComposite et transcriptSerInComposite pour suivre une métrique sans l'intégrer dans la note finale. La réponse inclut un tableau enabledMetrics listant exactement les métriques ayant contribué.
SACR ne nécessite pas d'opt-out manuel pour les jeux de données sans speaker. Si aucune colonne ne correspond à speaker, talker ou spk (insensible à la casse), SACR est null quel que soit l'indicateur. L'indicateur existe uniquement pour supprimer le champ quand vous voulez exclure explicitement les données speaker de la réponse. Pour ignorer la détection automatique et spécifier la colonne speaker explicitement, passez speakerColName : "<nom-colonne>" dans l'objet config (correspondance insensible à la casse, max 100 caractères).
SACR ne comptabilise que les lignes MODIFIED — le seul cas où le moteur peut comparer directement le locuteur original et le locuteur retravaillé. Si un reworker fragmente un segment et relabelle le locuteur simultanément, le moteur classe l'événement en MODIFIED + ADDED plutôt qu'en SPLIT unique : la ligne ADDED avec le nouveau locuteur est invisible pour SACR. SACR est fiable pour les corrections directes de locuteur ; il peut sous-estimer les relabellages liés à une re-segmentation.
Le moteur détecte et exclut automatiquement les lignes d'en-tête du scoring. Si chaque cellule d'une ligne est identique au nom de sa colonne (ex. : la première ligne contient "transcript", "start", "end" correspondant au schéma), elle est comptée UNCHANGED mais exclue de tous les dénominateurs de métriques (CER, WER, SER, transcriptSER). Cela empêche l'inclusion de l'en-tête de déflater silencieusement les taux d'erreur quand les appelants passent des données brutes sans retirer la ligne d'en-tête.

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