Skip to content

Instantly share code, notes, and snippets.

@0gust1
Last active January 26, 2016 08:51
Show Gist options
  • Save 0gust1/537531b7bfba16292520 to your computer and use it in GitHub Desktop.
Save 0gust1/537531b7bfba16292520 to your computer and use it in GitHub Desktop.
Markov haiku generator
premier jour de l’An
je pense à la solitude
des soirées d’automne
les fleurs de quel arbre
impossible de savoir
mais un tel parfum !
au milieu du champ
et libre de toute chose
l’alouette chante
mon père et ma mère
sans cesse je pense à eux
le cri du faisan
un vieil étang
une grenouille plonge
le bruit de l’eau
réveille-toi, réveille-toi
et deviens mon compagnon
papillon qui dort
avec chaque souffle
le papillon se déplace
sur le saule !
Au cours de sa chute
elle a déversé son eau
fleur de la camélia
la cloche se tait
parfum de fleur en écho
ah ! quelle soirée
tant et tant de choses
me reviennent à l'esprit
fleurs de cerisiers !
dans les pluies de mai
les pattes de cette grue
se sont raccourcies !
le printemps s'en va
pleurs des oiseaux et poissons
les larmes aux yeux
devant un éclair
l’homme qui ne comprend pas
est bien admirable !
Ah ! le coucou
il chante il chante et il vole
toujours occupé
Ah ! tranquillité
et jusqu'au fond des rochers
le chant des cigales
temple de Suma
j’entends la flûte qui s'est tue
dans l’ombre des arbres
cet automne-ci
pourquoi donc dois-je vieillir ?
oiseau dans les nuages
L’automne profond
quant à mon voisin, que fait
donc cet homme au juste ?
ce chemin-ci
n'est emprunté par personne
ce soir d'automne
la rosée blanche
sa saveur solitaire
ne l’oublie jamais !
ah ! belle-de-jour
qui non plus ne deviendra
jamais mon amie
cette solitude
viendrais-tu la partager ?
feuille de paulownia
voyageur
ainsi m'appellera-t-on
première bruine
ami, allume le feu
je vais te montrer quelque chose
une boule de neige !
désolation hivernale
dans le monde monochrome
le bruit du vent
fixé nulle part
et mon cœur errant aussi
kotatsu mobile !
reclus pour l’hiver-
je me blottirai encore
contre ce poteau !
la première pluie
le singe aussi a envie
d’un petit manteau
ma cruche éclatant
c’est le gel de la nuit qui
m’a réveillé !
malade en voyage
mes rêves parcourent seuls
les champs désolés
début de l’automne
la mer et les champs
du même vert
ô pluie du printemps !
un saule caresse
ma cape de voyageur...
à cheval assoupi
lune lointaine
la fumée du thé
le vent d'automne
plus blanc que les pierres
de la colline rocheuse
on rallonge
une patte de l’aigrette
en y ajoutant celle du faisan
La neige au loin couvre la terre nue ;
Les bois déserts étendent vers la nue
Leurs grands rameaux qui, noirs et séparés,
D’aucune feuille encor ne sont parés ;
La sève dort et le bourgeon sans force
Est pour longtemps engourdi sous l’écorce ;
L’ouragan souffle en proclamant l’hiver
Qui vient glacer l’horizon découvert.
Mais j’ai frémi sous d’invisibles flammes
Voix du printemps qui remuez les âmes,
Quand tout est froid et mort autour de nous,
Voix du printemps, ô voix, d’où venez-vous ?…
Dans le giron
de l’Enigme
endors-toi
paumes ouvertes
et visage lisse
Tes paupières closes
tiennent en respect
les destins contraires
A ton réveil
des cadeaux
seront déposés
par la Sagesse
au pied
de ta scintillante
patience
J’ai embrassé l’aube d’été.
Rien ne bougeait encore au front des palais. L’eau était morte. Les camps d’ombres ne quittaient pas la route
du bois. J’ai marché, réveillant les haleines vives et tièdes, et les pierreries regardèrent, et les ailes
se levèrent sans bruit.
La première entreprise fut, dans le sentier déjà empli de frais et blêmes éclats, une fleur qui me dit son nom.
Je ris au wasserfall blond qui s’échevela à travers les sapins : à la cime argentée je reconnus la déesse.
Alors je levai un à un les voiles. Dans l’allée, en agitant les bras. Par la plaine, où je l’ai dénoncée au coq.
A la grand’ville elle fuyait parmi les clochers et les dômes, et courant comme un mendiant sur les quais de marbre,
je la chassais.
En haut de la route, près d’un bois de lauriers, je l’ai entourée avec ses voiles amassés, et j’ai senti un peu
son immense corps. L’aube et l’enfant tombèrent au bas du bois.
Au réveil il était midi.
Et qu’importe d’où sont venus ceux qui s’en vont,
S’ils entendent toujours un cri profond
Au carrefour des doutes !
Mon corps est lourd, mon corps est las,
Je veux rester, je ne peux pas ;
L’âpre univers est un tissu de routes
Tramé de vent et de lumière ;
Mieux vaut partir, sans aboutir,
Que de s’asseoir, même vainqueur, le soir,
Devant son oeuvre coutumière,
Avec, en son coeur morne, une vie
Qui cesse de bondir au-delà de la vie.
Mes pleurs sont à moi, nul au monde
Ne les a comptés ni reçus,
Pas un oeil étranger qui sonde
Les désespoirs que j’ai conçus
L’être qui souffre est un mystère
Parmi ses frères ici-bas ;
Il faut qu’il aille solitaire
S’asseoir aux portes du trépas.
J’irai seule et brisant ma lyre,
Souffrant mes maux sans les chanter ;
Car je sentirais à les dire
Plus de douleur qu’à les porter
Tourmenté et blessé
respirer ces gens, quel placebo
surmontant mon passé
pour que l’instant me semble beau
Surgit soudain une paillette
qui bouge et chante, quelle illusion,
vibrant sur ma peau de bête
le souvenir de cette passion
La tenir à nouveau, quel bonheur
le monde autour disparaissant
capturer timidement son odeur
mon coeur à l’intérieur compatissant
Une parenthèse s’est ouverte
des mots et gestes enlassés
qu’il me faut déjà en alerte
quitter le pré-carré.
var metr = require('./metriques.js'),
markov = require('markov'),
fs = require('fs');
var m = markov(1);
var s = fs.createReadStream(__dirname +
'/corpus.txt');
m.seed(s, function() {
var res = m.respond("blah");
//console.log(res);
//console.log(res.split(" "));
//console.log(metr.elisioner(res));
var cinq1, cinq2, sept1;
while (metr.elisioner(res).nb !== 5) {
res = m.respond(" ");
cinq1 = res;
}
while (metr.elisioner(res).nb !== 7) {
res = m.respond(" ");
sept1 = res;
}
while (metr.elisioner(res).nb !== 5) {
res = m.respond(" ");
cinq2 = res;
}
console.log('|' + cinq1.join(' '));
console.log('|' + sept1.join(' '));
console.log('|' + cinq2.join(' '));
});
if (!Array.prototype.includes) {
Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
'use strict';
var O = Object(this);
var len = parseInt(O.length) || 0;
if (len === 0) {
return false;
}
var n = parseInt(arguments[1]) || 0;
var k;
if (n >= 0) {
k = n;
} else {
k = len + n;
if (k < 0) {
k = 0;
}
}
var currentElement;
while (k < len) {
currentElement = O[k];
if (searchElement === currentElement ||
(searchElement !== searchElement && currentElement !== currentElement)
) {
{
// NaN !== NaN
return true;
}
k++;
}
return false;
}
};
}
function sansAccents(s) {
var r = s.toLowerCase();
r = r.replace(/[àáâãäå]/g, "a");
r = r.replace(/[èéêë]/g, "e");
r = r.replace(/[ìíîï]/g, "i");
r = r.replace(/[òóôõö]/g, "o");
r = r.replace(/[ùúûü]/g, "u");
r = r.replace(/[ýÿ]/g, "y");
return r;
};
// Comptage et découpage d'un mot en syllabes avec les possibilités de diérèses gérées par la variable max
syllabify = function(s) {
if (s.toLowerCase() == "pays") { // Exception pour ce mot ingérable autrement
return ({
syllabes: ["pa", "ys"],
nb: 2,
max: 2
});
}
if (!s.trim().match(/[a-zA-Z]/g)) {
return {
syllabes: [],
nb: 0,
max: 0
};
}
var consonnes = ['b', 'B', 'c', 'C', 'ç', 'Ç', 'd', 'D', 'f', 'F', 'g', 'G',
'h', 'H', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'ñ', 'Ñ',
'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'v', 'V', 'w', 'W',
'x', 'X', 'y', 'Y', 'z', 'Z', '-'];
var voyellesFortes = ['a', 'A', 'á', 'Á', 'à', 'À', 'â', 'Â', 'e', 'E', 'é',
'É', 'è', 'È', 'ê', 'Ê', 'í', 'Í', 'o', 'ó', 'O', 'Ó', 'ô', 'Ô', 'ú',
'Ú'];
var voyellesFaibles = ['i', 'I', 'u', 'U', 'ü', 'Ü', 'ï', 'Ï', 'î', 'Î',
'û', 'Û'];
var voyelles = voyellesFortes.concat(voyellesFaibles, ['y', 'Y']);
var nb, coupure, voy;
var j = 0,
max = 0;
var n = s.length - 1;
var i = 0;
var syllabes = [];
while (i <= n) {
coupure = 0; // Ne coupe pas
if (consonnes.indexOf(s.charAt(i)) > -1) {
if (voyelles.indexOf(s.charAt(i + 1)) > -1) {
if (s.toLowerCase().charAt(i) == 'y') { // diérèse possible du y utilisé comme consonne
max++;
}
if (voyelles.indexOf(s.charAt(i - 1)) > -1) {
coupure = 1;
}
} else if ((['s', 'S'].indexOf(s.charAt(i)) > -1) && (['n', 'N'].indexOf(
s.charAt(i - 1)) > -1) && (consonnes.indexOf(s.charAt(i + 1)) > -1)) {
coupure = 2;
} else if ((consonnes.indexOf(s.charAt(i + 1)) > -1) && (voyelles.indexOf(
s.charAt(i - 1)) > -1)) {
if (['r', 'R'].indexOf(s.charAt(i + 1)) > -1) {
if (['b', 'B', 'c', 'C', 'd', 'D', 'f', 'F', 'g', 'G', 'k', 'K',
'p', 'P', 'r', 'R', 't', 'T', 'v', 'V'].indexOf(s.charAt(i)) >
-1) {
coupure = 1;
} else {
coupure = 2;
}
} else if (['l', 'L'].indexOf(s.charAt(i + 1)) > -1) {
if (['b', 'B', 'c', 'C', 'd', 'D', 'f', 'F', 'g', 'G', 'k', 'K',
'l', 'L', 'p', 'P', 't', 'T', 'v', 'V'].indexOf(s.charAt(i)) >
-1) {
coupure = 1;
} else {
coupure = 2;
}
} else if (['h', 'H'].indexOf(s.charAt(i + 1)) > -1) {
if (['c', 'C', 's', 'S', 'p', 'P'].indexOf(s.charAt(i)) > -1) {
coupure = 1;
} else {
coupure = 2;
}
} else if ((['t', 'T', 'p', 'P'].indexOf(s.charAt(i + 1)) > -1) && ([
's', 'S'].indexOf(s.charAt(i + 2)) > -1)) { // pour des mots comme "verts" ou "corps"
coupure = 0;
} else {
coupure = 2;
}
}
} else if (voyellesFortes.indexOf(s.charAt(i)) > -1) {
if ((voyellesFortes.indexOf(s.charAt(i - 1)) > -1) &&
(s.substring(i - 2, i).toLowerCase() != 'ge') &&
(s.substring(i - 1, i + 2).toLowerCase() != 'eau') &&
(s.substring(i - 1, i + 1).toLowerCase() != 'oe') &&
((s.substring(i - 1, i + 2).toLowerCase() != 'ée') && (s.substring(i +
1, i + 2).toLowerCase() != 'ées') && (s.substring(i + 1, i + 4).toLowerCase() !=
'éent'))) {
coupure = 1;
}
} else if (voyellesFaibles.indexOf(s.charAt(i)) > -1 && (s.substring(i -
1, i + 1).toLowerCase() != 'qu') && (s.substring(i - 1, i + 1).toLowerCase() !=
'gu')) { // Gestion de la diérèse éventuelle, sauf pour les cas avec "qu" / "gu"
if ((voyelles.indexOf(s.charAt(i + 1)) > -1) &&
(consonnes.indexOf(s.charAt(i - 1)) > -1) &&
(consonnes.indexOf(s.charAt(i - 2)) > -1) &&
(s.substring(i, i + 2).toLowerCase() != 'ui')) { // diérèse obligatoire si deux consonnes avant
if (s.toLowerCase().charAt(i + 1) == 'y') { // diérèse possible du y pour des mots comme "ennuyer" ou "essuyer"
max++;
}
coupure = 2;
} else if ((voyelles.indexOf(s.charAt(i + 1)) > -1)) {
if (((s.substring(i + 1, i + 4).toLowerCase() != 'ent') && (s.substring(
i + 1, i + 4).toLowerCase() != 'es')) || // Si terminaisons en "-aient" et en "-aie(s)" : pas de diérèse possible
(s.substring(i, i + 2).toLowerCase() != 'ui')) { // Si mot comme "fruit", "bruit", "impuissant", diérèse très rare mais tolérable
max++;
}
}
}
if (coupure == 1) { // Couper ici
voy = s.substring(j, i);
syllabes.push(voy);
j = i;
} else if (coupure == 2) { // Couper au caractère suivant
i++;
voy = s.substring(j, i);
syllabes.push(voy);
j = i;
}
i++;
}
nb = syllabes.length;
if ((j == n) && (nb > 0) && (consonnes.indexOf(s.charAt(n)) > -1)) { //Dernière lettre
syllabes[nb - 1] = syllabes[nb - 1] + s.charAt(n);
} else {
voy = s.substring(j, n + 1);
syllabes.push(voy); // Dernière syllabe
nb++;
}
return {
syllabes: syllabes,
nb: nb,
max: nb + max
};
};
// Prend un tableau de mots en entrée. Pour chaque mot dans le tableau (vers), applique syllabify avec les règles d'élision du e
elisioner = function(mots) {
var voyelles = ['a', 'A', 'á', 'Á', 'à', 'À', 'â', 'Â', 'e', 'E', 'é', 'É',
'è', 'È', 'ê', 'Ê', 'í', 'Í', 'o', 'ó', 'O', 'Ó', 'ô', 'Ô', 'ú', 'Ú',
'i', 'I', 'u', 'U', 'ü', 'Ü', 'û', 'Û', 'ï', 'Ï', 'î', 'Î'];
var elision = voyelles.concat(['h', 'H']);
var syllabes, nb = 0,
max = 0;
for (var i = 0; i < mots.length; i++) {
syllabes = syllabify(mots[i]);
nb += syllabes.nb;
max += syllabes.max;
if ((i > 0) &&
(mots[i - 1].toLowerCase().slice(-1) == 'e') &&
(elision.indexOf(mots[i].charAt(0)) > -1) &&
(sansAccents(mots[i - 1].toLowerCase().slice(-2, -1)) != sansAccents(
mots[i].charAt(0)))) { // élision du e de fin dans le mot précédent si liaison (MAIS élision interdite si même son, ex: "Thésée excusable")
nb--;
if (['h', 'H'].indexOf(mots[i].charAt(0)) < 0) {
max--;
}
}
if ((i == mots.length - 1) &&
(mots[i].toLowerCase().slice(-1) == 'e' || mots[i].toLowerCase().slice(-
2) == 'es' || mots[i].toLowerCase().slice(-3) == 'ent')) { // élision du e en fin de vers
nb--;
if (!((voyelles.indexOf(mots[i].toLowerCase().slice(-2, -1)) > -1) && (
mots[i].toLowerCase().slice(-1) == 'e')) && // Si finit par une voyelle + "e" : l'élision peut-être évitée en appuyant le e (ex: "patrie")
!((voyelles.indexOf(mots[i].toLowerCase().slice(-3, -2)) > -1) && (
mots[i].toLowerCase().slice(-2) == 'es')) &&
!((voyelles.indexOf(mots[i].toLowerCase().slice(-4, -3)) > -1) && (
mots[i].toLowerCase().slice(-3) == 'ent')) &&
(mots[i].toLowerCase().slice(-4) != 'ment')) { // Si c'est un adverbe, la syllabe finale est obligatoire donc on ne diminue pas max pour prévenir ces cas
max--;
}
}
}
return {
nb: nb,
max: max
};
};
// Compte le nombre de syllabes des vers d'un poème en suivant les règles classiques d'élision
metrify = function(s) {
s = s.replace(/[\.,…\/#!$%\^&\*;\?:{}=\_`~()]/g, "").replace(/[0-9]/g, '').replace(
/\s{2,}/g, " ").replace(/œ/g, "oe").replace(/æ/g, "ae").replace(
/\r\n|\r|\n/g, "<br>");
var vers = s.split("<br>");
vers = vers.filter(function(v) {
return v !== '';
});
var mots = [];
var nbsyllabes = [];
for (var i = 0; i < vers.length; i++) {
var lesmots = vers[i].split(" ");
lesmots = lesmots.filter(function(v) {
return v !== '';
});
mots[i] = lesmots; // range les mots dans un tableau différent pour chaque vers
}
// Appliquer elisioner au tableau de mots de chaque vers
for (var k = 0; k < mots.length; k++) {
nbsyllabes[k] = elisioner(mots[k]);
}
return {
vers: vers,
mots: mots,
nbsyllabes: nbsyllabes
};
};
module.exports = {
metrify: metrify,
elisioner: elisioner,
syllabify: syllabify
};
{
"name": "automate",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"markov": "0.0.7"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment