Last active
January 26, 2016 08:51
-
-
Save 0gust1/537531b7bfba16292520 to your computer and use it in GitHub Desktop.
Markov haiku generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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é. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(' ')); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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