Deux petites fonctions MS SQL Server pour créer des mots et phrases en « bolobolo » c’est à dire avec une vraisemblance importante par rapport au français.
Ces fonctions utilisent une table de fréquence de représentation des lettres dans la langue française, incluant la fréquence d’apparition de l’espace comme séparateur de mots.
Voici la table qui est utilisé pour stocker les fréquences d’apparition des lettres en français :
(CHR_ID SMALLINT NOT NULL PRIMARY KEY,
CHR_CHAR CHAR(1) NOT NULL UNIQUE,
CHR_NB INT,
CHR_MIN INT,
CHR_MAX INT);
GO
Et notre échantillon :
(0, ' ','322270', '1533912', '1856181'),
(1, 'e','225947', '1307965', '1533911'),
(2, 's','121895', '1186070', '1307964'),
(3, 'a','117110', '1068960', '1186069'),
(4, 'i','115465', '953495', '1068959'),
(5, 't','111103', '842392', '953494'),
(6, 'n','108812', '733580', '842391'),
(7, 'r','100500', '633080', '733579'),
(8, 'u','96785', '536295', '633079'),
(9, 'l','83668', '452627', '536294'),
(10, 'o','82762', '369865', '452626'),
(11, 'd','56269', '313596', '369864'),
(12, 'c','50003', '263593', '313595'),
(13, 'p','46335', '217258', '263592'),
(14, 'm','45521', '171737', '217257'),
(15, 'é','29206', '142531', '171736'),
(16, 'v','24975', '117556', '142530'),
(17, 'q','20889', '96667', '117555'),
(18, 'f','16351', '80316', '96666'),
(19, 'b','13822', '66494', '80315'),
(20, 'g','13288', '53206', '66493'),
(21, 'h','11298', '41908', '53205'),
(22, 'j','8351', '33557', '41907'),
(23, 'Ã ','7449', '26108', '33556'),
(24, 'x','5928', '20180', '26107'),
(25, 'y','4725', '15455', '20179'),
(26, 'è','4160', '11295', '15454'),
(27, 'ê','3445', '7850', '11294'),
(28, 'z','2093', '5757', '7849'),
(29, 'w','1747', '4010', '5756'),
(30, 'ç','1306', '2704', '4009'),
(31, 'ù','890', '1814', '2703'),
(32, 'k','745', '1069', '1813'),
(33, 'î','695', '374', '1068'),
(34, 'Å“','283', '91', '373'),
(35, 'ï','84', '7', '90'),
(36, 'ë','7', '0', '6');
GO
Au passage indexons correctement notre table :
GO
Nous avons besoin de cette vue, car notre fonction de génération ne peut pas utiliser directement l’appel à la fonction RAND() non déterministe
AS
SELECT RAND() AS RND
GO
Voici maintenant une fonction qui génère un mot (donc une chaine sans espace) :
RETURNS VARCHAR(256)
AS
BEGIN
DECLARE @I INT, @M INT, @C CHAR(1), @S VARCHAR(max);
SELECT @I = 1, @S = '';
SELECT @M = CHR_MIN - 1 FROM T_CHR WHERE CHR_CHAR = ' ';
WHILE @I < @NBLET
BEGIN
SELECT @C = CHR_CHAR
FROM T_CHR
INNER JOIN V_RAND
ON RND * @M BETWEEN CHR_MIN AND CHR_MAX;
SELECT @S = @S + @C, @I = @I + 1;
END
RETURN @S
END;
GO
Et voici la fonction qui génère une phrase composées de mots séparés par des espaces :
RETURNS VARCHAR(max)
AS
BEGIN
DECLARE @I INT, @M INT, @C CHAR(1), @S VARCHAR(max), @B BIT;
SELECT @I = 1, @S = '', @B = 1;
SELECT @M = CHR_MAX FROM T_CHR WHERE CHR_CHAR = ' ';
WHILE @I < @NBLET
BEGIN
SELECT @C = CHR_CHAR
FROM T_CHR
INNER JOIN V_RAND
ON RND * @M BETWEEN CHR_MIN AND CHR_MAX;
IF @B = 1 AND @C = ' '
CONTINUE;
SELECT @S = @S + @C, @I = @I + 1;
SET @B = CASE @C WHEN ' ' THEN 1 ELSE 0 END;
END
RETURN @S
END;
GO
Et voici comment tester le tout :
Ceci génère un mot aléatoire de 8 lettres et une phrase limitée à 250 caractères.
Frédéric Brouard, SQLpro – ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation…
* * * * * * Enseignant CNAM PACA – ISEN Toulon – CESI Aix en Provence * * * * * *