Nuance VOCALIZER - VEMBEDDED documentation du jeu de règles
Introduction
Les ensembles de règles permettent à l'utilisateur de spécifier des règles de "recherche et de remplacement" pour certaines chaînes de caractères dans le texte d'entrée. Alors que les dictionnaires utilisateur ne prennent en charge la fonctionnalité de recherche et de remplacement que pour les chaînes littérales qui sont des mots complets ou des fragments de mots multiples marqués, les jeux de règles prennent en charge tout modèle de recherche pouvant être exprimé à l'aide d'expressions régulières (par exemple, plusieurs mots, une partie d'un mot).
Les ensembles de règles sont appliqués avant toute autre normalisation du texte, y compris la consultation du dictionnaire de l'utilisateur.
La section suivante décrit en détail la manière dont la normalisation du texte peut être réglée par l'intermédiaire des ensembles de règles de l'utilisateur.
Un jeu de règles est essentiellement une collection de règles ; chaque règle spécifie un "modèle de recherche" et la "spécification de remplacement" correspondante.
La syntaxe et la sémantique du "motif de recherche" et de la "spécification de remplacement" correspondent à celles de la bibliothèque d'expressions régulières utilisée, à savoir PCRE v5.0, qui correspond à la syntaxe et à la sémantique de Perl 5. Pour la syntaxe des expressions régulières de Perl 5, veuillez vous référer à la page principale des expressions régulières de Perl à l'adresse http://perldoc.perl.org/perlre.html. Pour une description de PCRE, une bibliothèque libre d'expressions régulières, voir http://www.pcre.org/.
Plus de détails sur la syntaxe sont décrits dans la section "Format du jeu de règles".
Les règles d'un jeu de règles chargé ne sont appliquées que si la langue active correspond à la langue spécifiée dans la section d'en-tête du jeu de règles. En outre, un jeu de règles utilisateur peut avoir une portée globale ou être limité à un bloc de texte marqué d'un bloc de texte marqué d'une valeur tn particulière (avec la séquence de contrôle <ESC>\tn\)
Format des jeux de règles
Les jeux de règles sont décrits dans un fichier texte codé en UTF-8.
En général, un jeu de règles se compose d'une section d'en-tête, suivie d'une section de données. Le format d'un jeu de règles est décrit formellement ci-dessous à l'aide de la notation suivante :
Symbole Signification
{...} Partie facultative ; la partie située entre { et } peut se produire une fois, mais ce n'est pas obligatoire.
( ... )* La partie entre ( et ) peut se produire plus d'une fois.
<...> La partie comprise entre < et > spécifie une constante de chaîne variable.
A|B Partie OU, A est spécifié ou B est spécifié.
Un jeu de règles peut être décrit formellement comme suit :
jeu de règles :=
(<comment-line>|<ligne blanche>)*
<en-tête>
<section de données> ?
Les lignes de commentaire ont le caractère '#' comme premier caractère non vide.
Une ligne vierge est une ligne entièrement constituée de caractères d'espacement linéaires. En utilisant la syntaxe des expressions régulières, elles peuvent être exprimées comme suit :
ligne de commentaire := ^\s*#.*\n
ligne blanche := ^\s*\n
Section d'en-tête
La section "header" contient une ou plusieurs définitions de clés (la définition de la clé "language" est obligatoire, voir plus loin) ; chaque définition ne peut s'étendre que sur une seule ligne.
section d'en-tête :=
"[en-tête]"\n
(<comment-line>|<ligne blanche>|
<définition de clé>)+
Les lignes de commentaire et les lignes vierges peuvent être insérées partout.
Les définitions de clés ont la syntaxe suivante :
définition de clé :=<nom de clé> = <valeur de clé><commentaire>?\n
Les blancs (espaces ou tabulations) avant et après le signe égal sont facultatifs.
Si la valeur de la clé contient des espaces, elle doit être placée entre guillemets. Si un guillemet double est nécessaire dans la valeur, il doit être échappé (\"). La syntaxe réelle de la <valeur-clé> dépend du <nom-clé>.
Un <commentaire> peut suivre la <valeur-clé>, il dure jusqu'à la fin de la ligne.
commentaire :=#.*$
Les seuls noms de clés actuellement pris en charge sont les suivants : "language", "charset" et "type". Cela signifie que <définition de clé> peut être exprimée sémantiquement comme suit :
key-definition :=<language-definition>|<charset-definition> | <type-definition>
La <définition de la langue> est requise pour chaque en-tête, la valeur étant le code de langue Vocalizer à trois lettres, un groupe de langues ou le caractère générique "*" pour spécifier toutes les langues. Le code de langue à 3 lettres est également utilisé pour spécifier la langue des dictionnaires utilisateur, voir le tableau des codes de langue ci-dessus pour une liste.
Notez que le "\*" utilisé dans la spécification syntaxique suivante désigne le caractère astérisque littéral "*", et non une répétition.
définition de la langue :=
langue =
(<code-langue>|<groupe-langue>|\*)<commentaire>?\n
liste des codes-langue := <code-langue>(,<code-langue>)*
code-langue := ENA|ENG|ENU|DUN|FRC|GED|...
groupe de langue := EN\* | DU\* | FR\* | GE\* | ...
La <définition du jeu de caractères> est facultative et spécifie le jeu de caractères utilisé pour l'encodage des règles. Actuellement, le jeu de caractères doit être UTF-8.
charset-definition :=charset = <charset id> <comment> ? \n
jeu de caractères id := "utf-8"
La définition du type est facultative et spécifie que l'ensemble de règles s'applique au texte marqué pour une valeur tn particulière (avec la séquence de contrôle <ESC>\tn\). Un jeu de règles avec une définition de type est global.
définition de type := type = <nom de type><commentaire>?\n
Le nom du type est une séquence de caractères sans espace blanc et correspond à la valeur de la séquence de contrôle <ESC>\tn\N. Par exemple, un ensemble de règles utilisateur dont le nom de type est "financial:stocks" est accessible en utilisant <ESC>\tn=financial:stocks\.
Section des données
La section "données" contient zéro ou plusieurs "règles". Une règle ne peut occuper qu'une seule ligne.
section de données :=
"[données]"\n
(<comment-line>|<ligne blanche>|<règle>)*
Les commentaires peuvent également être insérés à la fin d'une règle et commencent par le caractère "#".
et s'étendent jusqu'à la fin de la ligne.
Une règle a la syntaxe suivante :
rule := <search-spec> "-->" <replacement-spec> <comment> ? \n
La syntaxe et la sémantique des <search-spec> et des <replacement-spec> correspondent à celles de la bibliothèque d'expressions régulières utilisée, à savoir PCRE v5.0, ce qui correspond à la syntaxe et à la sémantique de Perl 5. Pour la syntaxe des expressions régulières de Perl 5, veuillez vous référer à la page de manuel Perl regular expressions à l'adresse http://perldoc.perl.org/perlre.html. Pour une description de PCRE, une bibliothèque libre d'expressions régulières, voir http://www.pcre.org/.
Pour une description détaillée, voir le document "pcrepattern.html" dans le paquet de distribution de PCRE.
Si des balises sont utilisées (dans la source et/ou le motif de remplacement), elles doivent être dans le format de balisage natif de Vocalizer.
Notez que les caractères spéciaux et les caractères ayant une signification particulière doivent être échappés.
En voici quelques exemples :
Dans le modèle de recherche : les caractères non alphanumériques ayant une signification particulière, tels que le point (.), l'astérisque (*), le dollar ($), la barre oblique inverse (\), etc., doivent être précédés d'une barre oblique inverse lorsqu'ils sont utilisés littéralement dans un contexte où ils peuvent avoir une signification particulière (par exemple, utiliser \* pour *). Dans la spécification de remplacement, cela s'applique à des caractères tels que le dollar ($), la barre oblique inverse (\N) et le double guillemet (").
- Les caractères de contrôle comme \t (Tab), \n (Newline), \r (Return), etc.
- Codes de caractères : \xhh (hh est le code hexadécimal du caractère, par exemple \x1b pour Escape), \ooo (ooo est la notation octale, par exemple \033 pour Escape).
Perl5 prédéfinit également certains motifs comme "\s" (espace blanc) et "\d" (numérique).
Pour une description complète, veuillez vous référer aux pages de manuel de Perl5.
Exemple de règle
/David/ --> "Gourou du mois de mai"
Remplace chaque occurrence de la chaîne "David" par "Gourou du mois de mai".
Spécification de recherche
En général, le format de la spécification de recherche est le suivant :
Search-spec := <delimiteur> <expression régulière> <delimiteur> <modificateur>*
Le <délimiteur> est généralement '/', mais il peut s'agir de n'importe quel caractère non blanc, à l'exception des chiffres, de la barre oblique inversée ('\') et de '#'... Cela facilite la spécification d'une expression régulière qui contient '/', car il n'est pas nécessaire d'échapper le '/'.
<modificateur> := [imsx]
Modificateurs facultatifs :
i (la recherche est insensible à la casse) ;
m (les caractères '^' et '$' sont pris en compte, même s'ils contiennent des caractères de retour à la ligne) ;
s (permet au motif '.' de correspondre même aux caractères de retour à la ligne, par défaut '.' correspond à n'importe quel caractère arbitraire, à l'exception d'un retour à la ligne) ;
x (permet des extensions d'expressions régulières telles que l'insertion d'espaces blancs et de commentaires dans <expression régulière>).
Spécification de remplacement
Le format de la spécification de remplacement est une chaîne entre guillemets ("...") ou une chaîne non vide si la traduction est un mot unique. Il peut contenir des références rétroactives de la forme $n (n : 1, 2, 3, ...) qui renvoient à la correspondance réelle pour le n-ième sous-motif de capture dans <search-spec>. Par exemple, $1 indique le premier sous-modèle. Une référence arrière dont le nombre dépasse le nombre total de sous-motifs dans <search-spec> est traduite en une chaîne vide. Un signe de dollar littéral ($) doit être échappé (\$).
Tout ce qui suit <replacement-spec> et se trouve sur la même ligne est considéré comme un commentaire s'il commence par '#', sinon il est simplement ignoré.
Quelques exemples de règles
/<NUAN>/ --> "Nuance Communications"
Réécrit "<NUAN>" en "Nuance Communications".
/(Coin)/ --> ($1)
Remplace "Quack" par "(Quack)".
/(Coin)/ --> (2 $)
Remplace "Quack" par "()".
/(\s):-\)(\s)/ --> "$1ha ha$2"
Où "\s" correspond à n'importe quel caractère d'espacement, $1 correspond au caractère d'espacement de tête et $2 correspond au caractère d'espacement de fin. Cette règle réécrit par exemple " :-) " en " ha ha ".
/(\r?\n)-{3,} *Début du message inclus *-{3,}(\r?\n)/ --> "$1Début du message inclus:$2"
Réécrit par exemple ---- Début du message inclus ---- en Début du message inclus :
/\x80 ?(\d+)\.(\d{2})\d*/ --> "$1 euro $2 cents"
Réécrit par exemple "€9.751" en "9 euro 75 cents".
Restrictions on rulesets
La restriction suivante s'applique aux jeux de règles : les marqueurs générés pendant le chargement des jeux de règles ont des champs de position source qui représentent la position après l'application des jeux de règles.
Effet des jeux de règles sur les performances
Le chargement des jeux de règles peut affecter les performances du traitement de la synthèse, en augmentant la latence (temps pour le premier son) et l'utilisation globale de l'unité centrale. Certains modèles d'expressions régulières sont plus efficaces que d'autres, il est donc important de tenir compte de l'efficacité des modèles lors de l'écriture des jeux de règles et de tester le système avec et sans les jeux de règles pour s'assurer que les performances sont acceptables.
Par exemple, une classe de caractères (par exemple, "[aeiou]") est plus efficace que l'ensemble équivalent d'alternatives (par exemple, "(a|e|i|o|u)").
Voir la page principale "pcreperform.html" du paquetage PCRE pour plus de détails.