première version

This commit is contained in:
francois committed 2023-08-21 08:40:23 +02:00
1 parent c6d71faca7
commit 3e44eb5340
13 files changed
+3096 -3

No files matched your search

+2733
View File
File diff suppressed because it is too large. Load diff
+14
View File
@@ -0,0 +1,14 @@
all: testAutoText doc
./testAutoText < data/LesForcatsDuMariage-lower.txt
testAutoText: cpp/TestAutoText.cpp cpp/TextProdChar.cpp include/TextProdChar.hpp cpp/LexFreq.cpp include/LexFreq.hpp cpp/Context.cpp include/Context.hpp
g++ -g -I ./include/ cpp/TestAutoText.cpp cpp/TextProdChar.cpp cpp/LexFreq.cpp cpp/Context.cpp -o testAutoText
clean:
rm -fr *~ cpp/*~ include/*~
wipe: clean
rm -fr testAutoText autoTextDoc
doc:
doxygen Doxyfile >/dev/null
+3 -3
View File
@@ -1,5 +1,5 @@
# autoText
Exemple de production automatique de texte.
Ce que certains appel IA n'est que l'application statistique dénué de sémantique.
Exemple de production automatique de texte.
Ce que certains appel IA n'est que l'application statistique dénué de sémantique.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

+57
View File
@@ -0,0 +1,57 @@
#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <ctype.h>
#include "Context.hpp"
using namespace std;
// ========================================
const int Context::prevSize (10);
const string Context::end (".?!");
const string Context::sep (" ,;’-");
bool
Context::validChar (const char &c) {
if (isalpha (c))
return true;
return
end.find (c) != string::npos ||
sep.find (c) != string::npos;
}
bool
Context::isEnd (const string &c) {
return end.find (c) != string::npos;
}
bool
Context::isSep (const string &c) {
return sep.find (c) != string::npos;
}
void
Context::forward (string current) {
if (!prevSize)
return;
if (current == " " && prev.empty ())
return;
if (end.find (current) != string::npos) {
prev.clear ();
return;
}
prev += current;
if (prev.size () > prevSize) {
int count (prevSize);
for (auto rit (prev.crbegin ()); rit != prev.crend (); ++rit)
// (ASCII || start UTF) && countdown
if ((! (*rit & 0b10000000) || (*rit & 0b01000000)) && ! --count) {
prev = prev.substr (prev.crend () - rit -1);
break;
}
}
}
// ========================================
+44
View File
@@ -0,0 +1,44 @@
#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <ctype.h>
#include "LexFreq.hpp"
using namespace std;
// ========================================
ostream&
operator << (ostream& os, const LexFreq &freqLex) {
os << " size = " << freqLex.size << endl;
for (const auto& [key, value]: freqLex.hist)
os << key << " = " << value << endl;
return os;
}
LexFreq::LexFreq () :
size (0) {
}
void
LexFreq::addChar (const string &c) {
++hist [c];
++size;
}
string
LexFreq::getChar () const {
if (!size)
return "*";
long r (rand () % size);
for (const auto& [key, value]: hist) {
if (r <= value)
return key;
r -= value;
}
return "*";
}
// ========================================
+55
View File
@@ -0,0 +1,55 @@
/*
La Part du feu. Les Terreurs du bourgeois Prudence et de son ami Furibus, 1873 par M.-L. Gagneur (1832-1902).
https://gallica.bnf.fr/services/engine/search/sru?operation=searchRetrieve&exactSearch=false&collapsing=true&version=1.2&query=(dc.creator%20all%20%22Marie-Louise%20Gagneur%22%20or%20dc.contributor%20all%20%22Marie-Louise%20Gagneur%22%20)%20&suggest=10&keywords=Marie-Louise%20Gagneur
https://fr.wikisource.org/wiki/La_Part_du_feu?rk=42918;4
*/
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "TextProdChar.hpp"
using namespace std;
void
test () {
for (string line; getline (cin, line); ) {
for (string::iterator it (line.begin ());
it != line.end ();
++it) {
unsigned char c = *it;
if (c & 0b10000000) {
++it;
cout << c << *it << "\\";
continue;
}
cout << c << "/";
}
}
}
// ========================================
int
main (int argc, char** argv) {
cerr << endl << " ** Test TextProdChar" << endl;
// ifstream in ("in.txt");
// ofstream out ("out.txt");
TextProdChar textProdChar;
srand (0); //(time (0));
//test ();
textProdChar.learn (cin);
// cerr << textProdChar << endl;
textProdChar.prod (cout, 1000);
cerr << endl;
return 0;
}
// ========================================
+91
View File
@@ -0,0 +1,91 @@
#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <ctype.h>
#include <boost/algorithm/string.hpp>
#include "Context.hpp"
#include "LexFreq.hpp"
#include "TextProdChar.hpp"
using namespace std;
// ========================================
ostream&
operator << (ostream& os, const TextProdChar &ia) {
string empty;
os << ia.prevFreq.at(empty);
os << " size = " << ia.prevFreq.size () << endl;
for (const auto& [key, value]: ia.prevFreq)
os << key << " = " << value.getSize () << endl;
return os;
}
void
TextProdChar::learn (istream &in) {
string comp;
for (string line; getline (in, line); ) {
for (string::iterator it (line.begin ());
it != line.end ();
++it) {
char c = *it;
comp.clear ();
comp.push_back (c);
if (c & 0b10000000) {
if ((c & 0b11100000) == 0b11000000) {
++it; comp.push_back (*it);
} else if ((c & 0b11110000) == 0b11100000) {
++it; comp.push_back (*it);
++it; comp.push_back (*it);
} else if ((c & 0b11111000) == 0b11110000) {
++it; comp.push_back (*it);
++it; comp.push_back (*it);
++it; comp.push_back (*it);
} else {
cout << "*";
}
} else {
// ASCII
if (! Context::validChar (c))
continue;
}
if (context.empty () && (context.isSep (comp) || context.isEnd (comp)))
continue;
prevFreq[context.getState ()].addChar (comp);
context.forward (comp);
}
}
}
void
TextProdChar::prod (ostream &out, const long &size) {
context.reset ();
bool nl (false), end (false);
for (long i (0), col (0); ; ++i, ++col) {
if (i > size)
end = true;
if (col > 80)
nl = true;
bool maj (context.empty ());
string next (prevFreq[context.getState ()].getChar ());
context.forward (next);
if (maj)
boost::to_upper (next);
out << next;
if (context.isEnd (next) ||
(nl && context.isSep (next))) {
out << endl;
nl = false;
col = 0;
if (end && context.isEnd (next))
break;
}
}
out << endl;
}
// ========================================
+1
View File
@@ -0,0 +1 @@
parmi toutes les libertés revendiquées de nos jours, il n’en est pas qui soulève plus de questions et de controverses que le divorce. le divorce est-il juste ? est-il moral ? ou bien est-il nuisible aux liens de la famille, et partant à l’ordre social ? l’indissolubilité n’est-elle pas nécessaire à la dignité du mariage, au bonheur et à l’avenir des enfants ? la société a-t-elle le droit d’intervenir dans l’association de l’homme et de la femme ? a-t-elle le droit de leur prescrire des devoirs qui, dans l’ordre naturel, ne relèvent que de l’amour, et d’en punir la violation ? aux époux seuls n’appartient-il pas de juger ce qui est utile à leur bonheur et à leur progrès moral ? l’autorité sociale peut-elle exercer une pression sur l’âme et le corps des époux, s’immiscer dans leurs rapports intimes, sans porter une grave atteinte à la liberté individuelle ? est-ce que ce droit qu’elle s’arroge ne constitue pas un abus de pouvoir ? n’est-il pas admis dans notre législation comme un principe, que tout contrat d’association, aliénant perpétuellement la liberté des contractants, est nul de droit ? pourquoi cette exception pour l’association du mariage ? mais, d’abord, qu’est-ce que l’autorité sociale ? et qui lui confère le droit d’intervenir ? autrefois, elle reposait sur deux principes reconnus aujourd’hui radicalement faux : la sanction divine et l’inégalité. elle était un droit pour ceux qui l’exerçaient, qu’ils s’appelassent rois, aristocrates, prêtres. alors les inférieurs, stigmatisés comme tels, avaient le devoir d’obéir à leurs supérieurs, prétendus élus de dieu. c’était dieu qui avait dicté les lois, dieu qui nommait ses représentants. telle était l’idée autoritaire du passé. mais, dans l’opinion moderne, l’autorité n’est plus qu’une fonction déléguée par les intéressés pour exécuter leur propre volonté. or, quelle peut être la volonté de deux êtres qui s’unissent ? le bonheur, la garantie de ce bonheur, et pour les enfants, la sécurité de l’avenir. ici comme partout le droit nouveau est en lutte avec le droit ancien. nos lois portent encore l’empreinte de l’antique despotisme et de l’arbitraire d’une croyance et d’une loi morale qui croulent de toutes parts. sans doute la loi essentiellement chrétienne de l’indissolubilité, car ce fut d’abord un dogme avant d’être une loi, eut sa raison d’être. dans la primitive église, elle a joué incontestablement un rôle moralisateur. elle a sauvé alors la famille qui périssait à rome par le divorce ou plutôt par la répudiation trop facile. sans doute, dans ces temps à demi barbares, le système de l’indissolubilité fut lié au triomphe de la civilisation elle-même. on ne peut en nier d’ailleurs la grandeur morale. certes, l’éternité du lien conjugal serait l’idéal. c’est l’espérance de l’infini déposée dans les cœurs. il est impossible de s’aimer profondément, ardemment, sans souhaiter l’éternité de l’amour. en outre, l’amour a besoin de durée, parce que c’est un élément de perfectionnement et de progrès, et parce que la famille est son but ; or, on ne peut se modifier en quelques mois, ni élever des enfants en quelques années. enfin la polygamie énerve les populations qui la pratiquent. le changement de relations porte aux excès, et les excès produisent chez l’individu un affaiblissement moral et physique, qui vicie la génération dans son germe. quels doivent être en effet l’esprit et le but de toute loi morale ou sociale ? prévenir une souffrance, empêcher un mal. avant nos moralistes et nos législateurs, la nature a posé son code de morale : elle a mis le châtiment à côté du mal, la souffrance à côté de l’abus. mais si, pour prévenir les abus et les dangers réels de la polygamie, on tombe dans un mal pire, celui d’enchaîner pour la vie, comme deux forçats à un boulet, deux êtres qui se haïssent ; si l’on arrive à faire un enfer de cette vie conjugale qu’on a posée comme réalisant l’idéal de l’amour, n’est-il pas évident qu’il faut une loi qui brise le lien que la loi a formé, et qui répare les erreurs involontaires, si communes dans le mariage ? nous le répétons, l’intervention sociale ne peut être qu’une délégation des intéressés, et par conséquent ne doit pas s’exercer contrairement à leur vœu, à leur liberté intime et à leur bonheur. le but et la mission de la loi, c’est d’empêcher qu’on n’use de sa liberté pour faire tort à autrui. son rôle dans le mariage doit être principalement de garantir l’exécution du contrat, de veiller à ce que les époux respectent leurs intérêts réciproques, et à ce qu’ils remplissent les charges et les devoirs de la paternité. elle doit encore s’attacher à prévenir la démoralisation, la souffrance, l’appauvrissement social autaLine truncated
+33
View File
@@ -0,0 +1,33 @@
/*!
* @file Context.hpp
* @brief calcul de fréquence et prédiction
* @author F. Merciol
* @version 0.1
* @date 18 / août 2023
*/
#ifndef _Context_hpp_
#define _Context_hpp_
#include <iostream>
#include <map>
using namespace std;
// ========================================
class Context {
string prev;
static const int prevSize;
static const string end;
static const string sep;
public:
static bool validChar (const char &c);
static bool isEnd (const string &c);
static bool isSep (const string &c);
bool empty () { return prev.empty (); }
void reset () { prev.clear (); }
string getState () { return prev; }
void forward (string current);
};
// ========================================
#endif // _Context_hpp_
+30
View File
@@ -0,0 +1,30 @@
/*!
* @file LexFreq.hpp
* @brief calcul de fréquence et prédiction
* @author F. Merciol
* @version 0.1
* @date 18 / août 2023
*/
#ifndef _LexFreq_hpp_
#define _LexFreq_hpp_
#include <iostream>
#include <map>
using namespace std;
// ========================================
class LexFreq {
long size;
map<string, long> hist;
public:
friend ostream& operator << (ostream& os, const LexFreq &freqLex);
LexFreq ();
long getSize () const { return hist.size (); }
void addChar (const string &c);
string getChar () const;
};
// ========================================
#endif // _LexFreq_hpp_
+32
View File
@@ -0,0 +1,32 @@
/*!
* @file TextProdChar.hpp
* @brief calcul de fréquence et prédiction
* @author F. Merciol
* @version 0.1
* @date 18 / août 2023
*/
#ifndef _TextProdChar_hpp_
#define _TextProdChar_hpp_
#include <iostream>
#include <map>
#include "Context.hpp"
#include "LexFreq.hpp"
using namespace std;
// ========================================
class TextProdChar {
Context context;
map<string, LexFreq> prevFreq;
public:
friend ostream& operator << (ostream& os, const TextProdChar &ia);
void learn (istream &in);
void prod (ostream &out, const long &size);
};
// ========================================
#endif // _TextProdChar_hpp_
+3
View File
@@ -0,0 +1,3 @@
Exemple de production automatique de texte.