Je dois dire que je trouve quand même curieux de comparer Slack et l’IRC, l’un est un service, l’autre un protocole.
Un collègue a commencé à pousser cette solution dans notre équipe. Pourquoi pas… À sa place j’aurais juste installé un jabberd (en interne…), mais il faut avouer que l’investissement, entre commissionner un serveur et l’administrer, ou bien, se créer simplement un compte sur un site web…
Pour le peu que j’ai pu utiliser ce service je peux dire que ça fait largement le job comme chat…
Quand je lis :
the community behind WordPress’ open-source software, recently abandoned its IRC channel and shifted to Slack, citing that IRC is complicated and unfriendly.
Je comprends pourquoi Slack m’accueil avec des phrases de Bisounours à chaque fois que je me connecte :)
Si c’est le cas sûrement d’une manière toute légaliste et bien vague… pas clairement… pas un simple tableau récapitulatif des groupes de protocoles interdits.
Le filtrage, le refus ou le bridage de certains types de trafic peut avoir un intérêt en terme de QoS pour les utilisateurs… Ça exige bien sûr de la transparence et de l’exactitude dans l’application :/
Bref, je ne suis pas sûr que la liste des port et protocoles soit écrites dans les divers contrats de FAI. J’espère ne pas me tromper car j’ai la flemme de vérifier.
Ça m’atterre de lire ça… Ça pourrait éventuellement être officiellement (expressément) interdit et bloqué mais par défaut c’est bien autorisé. Ça n’a pas a être « officiellement autorisé » !
« Fourniture d’accès à Internet » les gens… c’est ça qu’ils vendent (en tous cas sur les lignes fixes ADSL/Câble…).
Si c’est ne pouvoir passer que par une quantité limitée de ports et/ou utiliser un nombre limité de protocoles c’est de la tromperie sur marchandise ni plus ni moins. Ce n’est plus un accès à Internet mais au Web, au FTP, etc… voir comme pour le mobile : à Youtube, Wikipédia, etc… cela doit être clairement indiqué dans l’offre.
Il faudrait déjà que tu postes le programme en C que tu as commencé à écrire et on pourra peut-être te dire ce qui ne va pas… ou au moins que tu précises sur quel point tu penses avoir des difficultés…
Oui, le but c’est d’avoir la fréquence des phrases.
J’ai finalement modifié le script pour qu’il ne considère que c’est la fin d’un phrase seulement si ça termine par un point (.?!…:) suivi d’une espace ou d’un retour à la ligne. Ceci pour éviter de découper une URL (ou encore un sigle écrit avec des points, tel que U.R.S.S).
Ce n’est pas vraiment adapté à la tribune car il n’y a pas forcément un point à la fin de chaque post… Je pourrais ajouter un point à la fin de chaque post avant de les passer en entrée du script si nécessaire mais je m’oriente plus vers l’analyse de textes respectant la typographie française (littérature, article de jounrnal…)
À la base j’aurais pas dû poster ça dans un journal mais dans un forum. Le fait que ce soit un journal m’incite à continuer à poster mon code…
Voici donc la dernière version de Reader.py, script dont le but est de prendre n’importe quel fichier texte en entrée, le découper en « phrases » et stocker la fréquence d’apparition de ces « phrases » dans une base SQLite.
#!/usr/bin/env python3"""Reader.py: Read text for sentences frequencies."""__author__="M4rotte"__copyright__="Copyright 2015, Institut Marotte for Mouling"__license__="GPL"__version__="0.4"importsysimportreimportsqlite3fromcollectionsimportCounterclassReader:def__init__(self):self.sb=''self.characters=Counter()self.sentences=Counter()self.signature=''self.sig96=''self.start=re.compile(r'^(\n|)[\-–—«ÉÀÇÔÎÖÏA-Za-z]$')# If string buffer (self.sb) match, just read next character.self.stop=re.compile(r'(.|\n)+[.!?…:]( |\n)$')# If self.sb match, consider self.sb valid sentence, store it in self.sentences and reset self.sb.self.discard=re.compile(r'^(([0-9]+)([\\:]+)|##)(.*)(\n|)')# If self.sb match, just drop it.self.correct_tiret=re.compile(r'^( |)-')# If match (it's obviously part of a dialog), replace the tiret with the designed Unicode character.self.cancel_stop=re.compile(r'(.*|)( |\n)(M|Me)(\.)( |\n|)$');# If match (means it matched self.stop first…), just don't "stop" and read next character.self.nb_insert=0# Number of inserts off the last read()self.nb_update=0# Number of updates off the last read() self.nb_record=0# Number of records in the updated databasedefread(self,f):"""Read input and populate `sentences`"""whileTrue:c=f.read(1)ifnotc:breakifc=='\xa0':c=' 'self.characters[c]+=1self.sb+=cifself.sbin[' ','\n','»']:self.sb=''continueifself.discard.match(self.sb):self.sb=''continueifself.start.match(self.sb):continueifself.stop.match(self.sb)andnotself.cancel_stop.match(self.sb):ifself.correct_tiret.match(self.sb):self.sb=self.sb.replace('-','–')self.sentences[self.sb.strip()]+=1self.sb=''continueforcinself.characters.most_common():self.signature+=c[0]self.sig96=self.signature[:96].replace('\n',' ')defstore(self,dbfile='reader.sqlite'):""" Update the database from `sentences` """connection=sqlite3.connect(dbfile)cursor=connection.cursor()cursor.execute('create table if not exists sentences (sentence text primary key unique, freq int)')## For futur use :) # cursor.execute('create virtual table if not exists fts_strings using fts4(string text, freq int, tokenize=unicode61 "remove_diacritics=0" "tokenchars= ")')# Store `sentences` into databaseforsinself.sentences.most_common():try:cursor.execute("insert into sentences values (?, ?)",(s[0],s[1]))self.nb_insert+=1exceptsqlite3.IntegrityError:self.nb_update+=1cursor.execute("update sentences set freq=freq+? where sentence = ?",(s[1],s[0]))self.nb_record=cursor.execute('select count(*) from sentences;')sys.stderr.write('Database update: '+str(self.nb_insert)+' inserts '+str(self.nb_update)+' updates '+str(self.nb_record.fetchone()[0])+' records. SIG96 : '+str(self.sig96)+'\n')connection.commit()try:reader=Reader()reader.read(sys.stdin)reader.store()exceptKeyboardInterruptaserror:print('\n'+repr(error),file=sys.stderr)sys.stderr.flush()sys.stdout.flush()exit(1)
La sortie en partant d’une base inexistante et en la renseignant à partir de classiques de la littérature française, posts du bouchot et contenu issu de Wikipédia (histoire d’avoir des entrées assez hétérogènes) :
$ for f in *.txt; do ./Reader.py < "$f"; done; sqlite3 ../linuxfr.org.sqlite 'select message from posts;' | ./Reader.py ; sqlite3 ../Wikipedia.sqlite 'select fact from facts;' | ./Reader.py
Database update: 7498 inserts 0 updates 7498 records. SIG128 : eaistnrulodcmp v,é’fqh.gbàx-jyè;–ALê?«»zkC!SEJMKDI:WPçO…îôâQVNT#œû_ùwBUïRG1FYÀ2()É307H5486][9ÔX
Database update: 7533 inserts 74 updates 15031 records. SIG128 : eaistnrulodcpm v,é’qf.hbgàjx-yè–;AêL?«»kCzE!SM:JIPDKWîçVôNOTâQ_…û#ùœBw0RïU1ÀF2G()3YHÉ5][847°69ü
Database update: 7367 inserts 33 updates 22398 records. SIG128 : easitnrulodcmp ,év’f.qgbhàèxj-êyMIL;EPCS«»Az!RâçJ:DFVûîTô…?ùOGQ–UœNïÀB1É8H{Ç45/kë#0w397XÔ2Z)6—]
Database update: 2496 inserts 2 updates 24894 records. SIG128 : esatinrulodcpmé, v'qfgbh.àxèCy;jê-LAG\:IRzôSBçâTHPîDûVMEù12Q3O«4»N5ï0U687œ?9FÉJ)(_!…ëÀW
Database update: 10914 inserts 71 updates 35808 records. SIG96 : easitnrulodc mp,év’.bfhgqxà»!èj«;-yMAêIECLFDz?P:çSRâOVJîTôQUBùN—…ûHG()ïk1#8X3Ç2w4590Yë6óW7Z\áñú
Database update: 1359 inserts 15 updates 37167 records. SIG96 : esitanrulodpmc '.é,v-qbfghjàxJèIEC!:ML?TyAêçPzQOS»«BVHûRîâùXôÇDNU2ï1F3()69À05Éë8Z°;7
Database update: 10707 inserts 62 updates 47874 records. SIG96 : eaistnrulodmpc év,’q.fhbgàjMx-èJêyL;CIz–!ERSVAP?Dâç:ûôQî…FBTNOœUùÀ#XHGÉï1*()0»«8Kw637k°924YW5ÊZ
Database update: 5734 inserts 79 updates 53608 records. SIG96 : eastinrulodcmp év'.,fqgbh-àjTxèyIêL!çJEC«»A?kMHPSzDOB…Nô*Qûâ:RUîV{ùXœ_ÀÇwGF;1ÉW/()2ï][YZ07438}Î
Database update: 7114 inserts 64 updates 60722 records. SIG96 : easintrulodm,cp vé’qf.hgbàjxè—-yêM:L!zEACJ?IP;çD»…«FôSVùTâOûNBQîR–œUHGÀ1kÉw2X907K5ü84ï#ëäÇY3WÈÊ
Database update: 10690 inserts 123 updates 71412 records. SIG96 : eastinrulodc,mp vé'.fghbq-àjxè!yMEêLC;N…zIPçADSâF?VBT:OôJûùîGURHQZœ_À»«Çk*{Éw1Xïë4Ô05W2Ê73Y
Database update: 24771 inserts 29 updates 96183 records. SIG96 : eastinruol:cpdm1 20fh/vé'5b3.qg4-,j76<>98"wyx?à[]=ç͌!kèêzCA’_;&SET)LPMOINJD(FBRU\VHG%ô…+W̚҉Qû█«
Database update: 67825 inserts 14 updates 164008 records. SIG96 : eainrstoludcmép,. ghvbf1q'()y9L02ACxè-MSjPàBk†8DRJ3IGçF5746T:EzNê°HV’OKUwÉ«W»Xôûî;ïZâYQœ%áù/í"ë
On peut voir que l’intégration du contenu Wikipédia amène à certains biais (et c’est pas Me Soleil qui s’en plaindra…) mais que « Ah ! » et « Oh ! » restent des valeurs sûres :
$ sqlite3 reader.sqlite "select * from sentences order by freq desc limit 30;"
Signe du zodiaque :|358
M.|224
Ah !|194
« Ah !|181
– Ah !|180
Mgr Paul Guérin, Vie des saints ; t.|162
– Oh !|148
Pas de journée internationale répertoriée pour cette date.|134
Oh !|100
« Oh !|87
Les noms de plusieurs voies, places, sites ou édifices, de pays ou régions francophones, contiennent cette date sous diverses graphies :|66
– Eh bien !|59
France :|59
Eh bien !|56
États-Unis :|52
Décembre :|49
Bahaïsme :|47
Février :|46
Juin :|43
– Tiens !|40
Octobre :|40
Hein ?|39
–C'est quoi ça ?|39
Mai :|39
Fêtes religieuses romaines :|39
Mars :|38
« Non !|37
dit Frédéric.|36
Japon :|36
— Ah !|35
Posté par Marotte ⛧ .
En réponse au journal Analyse de texte.
Évalué à 2.
Dernière modification le 21 décembre 2015 à 23:36.
Merci encore pour toutes vos suggestions. Il faut souligner qu’elles étaient toutes plutôt pertinentes… J’ai pu appliquer beaucoup de vos conseils même si j’ai dû abandonner certains (je pense notamment au islice du module itertools, qui est exactement ce que je cherchais à faire…) parce que je suis parti sur d’autres types de variables et une nouvelle approche du problème.
D’une point de vue fonctionnel je désire ne plus saucissoner l’input à l’arrache mais essayer de découper sur les phrases en me basant sur les règles typographiques (une phrase finit par un point, '«' ouvre un dialogue (ou pas…), etc…). Ça fait nettement moins d’enregistrements en base !
D’un point de vue technique j’ai utilisé une classe afin que le code principal soit plus clair.
Donc voici le code, j’ai viré les commentaires inutiles et il est de toute façon plus concis.
#!/usr/bin/env python3"""Reader.py: Read text for sentences frequencies."""__author__="M4rotte"__copyright__="Copyright 2015, Institut Marotte for Mouling"__license__="GPL"__version__="0.3"importsysimportreimportsqlite3fromcollectionsimportCounterclassReader:def__init__(self):self.sb=''self.characters=Counter()self.sentences=Counter()self.start=re.compile(r'^(\n|)[\-–—«ÉÀÇÔÎÖÏA-Za-z]$')self.stop=re.compile(r'(.|\n)+[.!?…:]( |)$')self.nb_insert=0self.nb_update=0self.discard=re.compile(r'^(([0-9]+)([\\]+)|^//).')defread(self,f):"""Read input and populate `sentences`"""whileTrue:c=f.read(1)ifc=='\xa0':c=' 'self.sb+=cself.sb=self.sb.replace(' ',' ')ifnotc:breakifself.start.match(self.sb):continueifself.stop.match(self.sb):self.sentences[self.sb]+=1self.sb=''continueifself.sb==' 'orself.sb=='\n'orself.sb=='«'orself.sb=='»':self.sb=''defstore(self,dbfile):""" Update the database from `sentences` """connection=sqlite3.connect(dbfile)cursor=connection.cursor()cursor.execute('create table if not exists sentences (sentence text primary key unique, freq int)')## For futur use :) # cursor.execute('create virtual table if not exists fts_strings using fts4(string text, freq int, tokenize=unicode61 "remove_diacritics=0" "tokenchars= ")')# Store `sentences` into databaseforsinself.sentences.most_common():ifnotself.discard.match(s[0]):try:cursor.execute("insert into sentences values (?, ?)",(s[0],s[1]))self.nb_insert+=1exceptsqlite3.IntegrityError:self.nb_update+=1cursor.execute("update sentences set freq=freq+? where sentence = ?",(s[1],s[0]))sys.stderr.write('Database update: '+str(self.nb_insert)+' inserts '+str(self.nb_update)+' updates. \n')connection.commit()connection.commit()try:reader=Reader()reader.read(sys.stdin)reader.store('reader.sqlite')exceptKeyboardInterruptaserror:print('\n'+repr(error),file=sys.stderr)sys.stderr.flush()sys.stdout.flush()exit(1)
D’un point de vu performance je trouve que ça tourne pas mal (à partir d’une base inexistante) :
Les fichiers sont des classiques de la littérature issus de sites comme http://www.ebooksgratuits.com/ (principalement), convertis from EPUB par un script choppé sur github. Les fichiers ayant été ensuite légèrement toilettés à la main est au grep avant traitement… Ça représente 6,6M de texte UTF-8.
Voici le résultat de quelques requêtes effectuées sur la base suite au traitement de ces fichiers :
sqlite> select * from sentences order by freq desc limit 10;
M.|213
Ah !|184
« Ah !|181
- Oh !|112
- Ah !|98
Oh !|91
« Oh !|85
– Ah !|67
Eh bien !|54
- Tiens !|38
sqlite> select * from sentences where sentence like '%?' order by freq desc limit 10;
Hein ?|33
- Hein ?|27
– Pourquoi ?|18
« Eh bien ?|13
pourquoi ?|12
quoi ?|11
« Pourquoi ?|11
– Pourquoi cela ?|10
– Comment cela ?|9
« Comment ?|9
sqlite> select * from sentences where sentence like '%moule%' order by freq desc limit 10;
« Il n’y a plus de ténors, disait-il, le moule en est brisé.|1
Mme Arnoux fit exhiber les moules pour les ouvrages plus difficiles.|1
J’ai déjà noté que je devrais appliquer mon expression régulière "discard" dans la fonction read() plutôt qu’au niveau store()…
Ce qu’il dit, je pense, c’est que les gains apportés par le fait de faire le plus possible de chose en SQL (et je dois dire qu’on peut vraiment faire un tas de trucs insoupçonnés dans les différentes variantes SQL…), par le moteur SQL, ça prends plus de sens pour un SGBD client/serveur… ça évite des « aller-retours »…
Tu n'as pas besoin des propriété ACID. Il n'y a qu'un utilisateur à la fois sur ta db, non ?
Pour l’instant.
Entendons nous bien, ce n’est pas pour ce caractère que j’ai pris SQLite. En plus des raisons déjà évoquées c’est que MariaDB je connais pas mal alors que SQLite je découvre un peu.
Peut-être un redis qui travaille au maximum en mémoire avec un système clé / valeur.
Ou encore BerkeleyDB. Mais je ne veux pas me limiter à un système clé-valeur pour les autres fonctionnalités que j’ai en tête. Je compte utiliser les tables virtuelles avec recherche de texte (FTS), par exemple.
Attention avec les dict ça bouffe très vite énormément de mémoire.
Oui… quand on parcourt toutes les combinaisons possibles rien qu’entre caractères lus ça va vite très vite.
Pour la mémoire j’ai abandonné le deque pour stocker mon tampon, le problème étant qu’un deque n’est pas adressable à l’aide de slices ([:4])… contrairement à un string. J’ai bien profité du conseil concernant collections.Counter(), c’est vraiment le type de variable dont j’avais besoin.
J’ai un peu changé d’approche pour conserver les « strings » (sentences), je me base sur des expressions régulières, c’est plus propre. Dès que j’ai un truc correct je le postici.
De plus tu utilise sqlite, je ne connais pas les performance de ce moteur pour les update mais peut être que choisir mysql(ou mariadb)
Alors là attention, que ça puisse fonctionner plus ou ou moins vite sous MariaDB c’est clairement pas un angle d’étude pour le moment… J’utilise sqlite parce que c’est parfaitement adapté à la modélisation (et c’est par ailleurs l’un des meilleurs moteur opensource de base relationnelle). SQLite ça marche partout. sqlite passe le test ACID : https://fr.wikipedia.org/wiki/Propri%C3%A9t%C3%A9s_ACID je n’en suis pas si sûr pour MarioleDB…
C’est volontaire de vouloir prendre les signes de ponctuation…
Pour moi 'mice' et 'mice.' ne sont pas deux chaînes identiques. De la deuxième on peut présager que le mot « mice » a des chances de terminer une phrase. À part le remplacement des retour à la ligne par des espaces puis la réduction des espaces consécutives à une seule espace je travaille en mode suite de caractères.
[^] # Re: la pocon prie
Posté par Marotte ⛧ . En réponse au journal Mon insécurité à moi. Évalué à 5.
Pourtant un deux roues doit être plus adapté pour disperser des hordes de béliers !
[^] # Re: Comment l'industrie de l'automobile délibérément décidé de pourrir la vie des citadins.
Posté par Marotte ⛧ . En réponse au journal Mon insécurité à moi. Évalué à 2.
Tut! Tut!
^^
[^] # Re: Un agenda ?
Posté par Marotte ⛧ . En réponse au message rapelle de rendez vous. Évalué à 2.
Ça reste une extension…
# Un agenda ?
Posté par Marotte ⛧ . En réponse au message rapelle de rendez vous. Évalué à 2.
Tu peux essayer http://www.kolumbus.fi/~w408237/orage/ ou https://www.mozilla.org/en-US/projects/calendar/
Le premier, Orage, devrait être installable via ton gestionnaire de package. Le second est une extension pour Thunderbird.
# Mon expérience de Slack
Posté par Marotte ⛧ . En réponse au journal Slack remplace l'IRC, ou comment l'opensource qui ne réussit pas à se défaire de ses démons. Évalué à 1.
Je dois dire que je trouve quand même curieux de comparer Slack et l’IRC, l’un est un service, l’autre un protocole.
Un collègue a commencé à pousser cette solution dans notre équipe. Pourquoi pas… À sa place j’aurais juste installé un jabberd (en interne…), mais il faut avouer que l’investissement, entre commissionner un serveur et l’administrer, ou bien, se créer simplement un compte sur un site web…
Pour le peu que j’ai pu utiliser ce service je peux dire que ça fait largement le job comme chat…
Quand je lis :
Je comprends pourquoi Slack m’accueil avec des phrases de Bisounours à chaque fois que je me connecte :)
[^] # Re: Slack c'est quoi ?
Posté par Marotte ⛧ . En réponse au journal Slack remplace l'IRC, ou comment l'opensource qui ne réussit pas à se défaire de ses démons. Évalué à 0.
Madame Michu n’a pas sa fille au bout de la terre. Ton argument est invalide.
# User experience
Posté par Marotte ⛧ . En réponse au journal Slack remplace l'IRC, ou comment l'opensource qui ne réussit pas à se défaire de ses démons. Évalué à 10.
[^] # Re: 3515 mavie (puisque c'est la question)
Posté par Marotte ⛧ . En réponse au message Opérateur 4G autorisant le SSH?. Évalué à 2.
Si c’est le cas sûrement d’une manière toute légaliste et bien vague… pas clairement… pas un simple tableau récapitulatif des groupes de protocoles interdits.
Le filtrage, le refus ou le bridage de certains types de trafic peut avoir un intérêt en terme de QoS pour les utilisateurs… Ça exige bien sûr de la transparence et de l’exactitude dans l’application :/
Bref, je ne suis pas sûr que la liste des port et protocoles soit écrites dans les divers contrats de FAI. J’espère ne pas me tromper car j’ai la flemme de vérifier.
[^] # Re: porter plainte
Posté par Marotte ⛧ . En réponse au message Opérateur 4G autorisant le SSH?. Évalué à 4.
Se faire chier dans quel sens exactement ?
[^] # Re: 3515 mavie (puisque c'est la question)
Posté par Marotte ⛧ . En réponse au message Opérateur 4G autorisant le SSH?. Évalué à 4.
Ça m’atterre de lire ça… Ça pourrait éventuellement être officiellement (expressément) interdit et bloqué mais par défaut c’est bien autorisé. Ça n’a pas a être « officiellement autorisé » !
« Fourniture d’accès à Internet » les gens… c’est ça qu’ils vendent (en tous cas sur les lignes fixes ADSL/Câble…).
Si c’est ne pouvoir passer que par une quantité limitée de ports et/ou utiliser un nombre limité de protocoles c’est de la tromperie sur marchandise ni plus ni moins. Ce n’est plus un accès à Internet mais au Web, au FTP, etc… voir comme pour le mobile : à Youtube, Wikipédia, etc… cela doit être clairement indiqué dans l’offre.
# Coucou
Posté par Marotte ⛧ . En réponse au message Opérateur 4G autorisant le SSH?. Évalué à 2.
Est-ce que tu les as questionné pour savoir pourquoi SSH était bloqué ? Leur réponse pourrait être forte intéressante…
Est-ce que SSH sur un port autre que 22 est également bloqué ?
[^] # Re: comment je peux faire??
Posté par Marotte ⛧ . En réponse au message connexion entre deux serveurs linux. Évalué à 2.
Ah non, le double point d’interrogation n’est pas répété. ;)
# Bonjour
Posté par Marotte ⛧ . En réponse au message Traduction d'un programme C++ en C. Évalué à 4.
Il faudrait déjà que tu postes le programme en C que tu as commencé à écrire et on pourra peut-être te dire ce qui ne va pas… ou au moins que tu précises sur quel point tu penses avoir des difficultés…
Pourquoi veux-tu traduire ce programme en C ?
[^] # Re: Version 0.3
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
Oui, le but c’est d’avoir la fréquence des phrases.
J’ai finalement modifié le script pour qu’il ne considère que c’est la fin d’un phrase seulement si ça termine par un point (.?!…:) suivi d’une espace ou d’un retour à la ligne. Ceci pour éviter de découper une URL (ou encore un sigle écrit avec des points, tel que U.R.S.S).
Ce n’est pas vraiment adapté à la tribune car il n’y a pas forcément un point à la fin de chaque post… Je pourrais ajouter un point à la fin de chaque post avant de les passer en entrée du script si nécessaire mais je m’oriente plus vers l’analyse de textes respectant la typographie française (littérature, article de jounrnal…)
# Ça avance
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
À la base j’aurais pas dû poster ça dans un journal mais dans un forum. Le fait que ce soit un journal m’incite à continuer à poster mon code…
Voici donc la dernière version de Reader.py, script dont le but est de prendre n’importe quel fichier texte en entrée, le découper en « phrases » et stocker la fréquence d’apparition de ces « phrases » dans une base SQLite.
La sortie en partant d’une base inexistante et en la renseignant à partir de classiques de la littérature française, posts du bouchot et contenu issu de Wikipédia (histoire d’avoir des entrées assez hétérogènes) :
On peut voir que l’intégration du contenu Wikipédia amène à certains biais (et c’est pas Me Soleil qui s’en plaindra…) mais que « Ah ! » et « Oh ! » restent des valeurs sûres :
Vous pouvez reprendre une activité normale.
[^] # Re: Version 0.3
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
En modifiant un peu le code voilà ce que ça donne sur un extrait de bouchot standard :
Ça donne des informations intéressantes sur les domaines des liens POSTé :)
[^] # Re: Version 0.3
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2. Dernière modification le 22 décembre 2015 à 00:06.
Je devrais je pense créer un re.reset pour celle là…
[^] # Re: Version 0.3
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
J’ai zappé le time :/
# Version 0.3
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2. Dernière modification le 21 décembre 2015 à 23:36.
Merci encore pour toutes vos suggestions. Il faut souligner qu’elles étaient toutes plutôt pertinentes… J’ai pu appliquer beaucoup de vos conseils même si j’ai dû abandonner certains (je pense notamment au islice du module itertools, qui est exactement ce que je cherchais à faire…) parce que je suis parti sur d’autres types de variables et une nouvelle approche du problème.
D’une point de vue fonctionnel je désire ne plus saucissoner l’input à l’arrache mais essayer de découper sur les phrases en me basant sur les règles typographiques (une phrase finit par un point, '«' ouvre un dialogue (ou pas…), etc…). Ça fait nettement moins d’enregistrements en base !
D’un point de vue technique j’ai utilisé une classe afin que le code principal soit plus clair.
Donc voici le code, j’ai viré les commentaires inutiles et il est de toute façon plus concis.
D’un point de vu performance je trouve que ça tourne pas mal (à partir d’une base inexistante) :
Les fichiers sont des classiques de la littérature issus de sites comme http://www.ebooksgratuits.com/ (principalement), convertis from EPUB par un script choppé sur github. Les fichiers ayant été ensuite légèrement toilettés à la main est au grep avant traitement… Ça représente 6,6M de texte UTF-8.
Voici le résultat de quelques requêtes effectuées sur la base suite au traitement de ces fichiers :
J’ai déjà noté que je devrais appliquer mon expression régulière "discard" dans la fonction read() plutôt qu’au niveau store()…
[^] # Re: Tout faire en base
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
Ce qu’il dit, je pense, c’est que les gains apportés par le fait de faire le plus possible de chose en SQL (et je dois dire qu’on peut vraiment faire un tas de trucs insoupçonnés dans les différentes variantes SQL…), par le moteur SQL, ça prends plus de sens pour un SGBD client/serveur… ça évite des « aller-retours »…
[^] # Re: En memoire
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
Pour l’instant.
Entendons nous bien, ce n’est pas pour ce caractère que j’ai pris SQLite. En plus des raisons déjà évoquées c’est que MariaDB je connais pas mal alors que SQLite je découvre un peu.
Ou encore BerkeleyDB. Mais je ne veux pas me limiter à un système clé-valeur pour les autres fonctionnalités que j’ai en tête. Je compte utiliser les tables virtuelles avec recherche de texte (FTS), par exemple.
[^] # Re: En memoire
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
Oui… quand on parcourt toutes les combinaisons possibles rien qu’entre caractères lus ça va vite très vite.
Pour la mémoire j’ai abandonné le deque pour stocker mon tampon, le problème étant qu’un deque n’est pas adressable à l’aide de slices ([:4])… contrairement à un string. J’ai bien profité du conseil concernant collections.Counter(), c’est vraiment le type de variable dont j’avais besoin.
J’ai un peu changé d’approche pour conserver les « strings » (sentences), je me base sur des expressions régulières, c’est plus propre. Dès que j’ai un truc correct je le postici.
Alors là attention, que ça puisse fonctionner plus ou ou moins vite sous MariaDB c’est clairement pas un angle d’étude pour le moment… J’utilise sqlite parce que c’est parfaitement adapté à la modélisation (et c’est par ailleurs l’un des meilleurs moteur opensource de base relationnelle). SQLite ça marche partout. sqlite passe le test ACID : https://fr.wikipedia.org/wiki/Propri%C3%A9t%C3%A9s_ACID je n’en suis pas si sûr pour MarioleDB…
[^] # Re: I like =
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
Je viens de tester avec
=
à la place delike
les performances sont bien meilleures effectivement :)Merci à vous deux. Le temps d’exécution est passé de 15 min à 40 s (environ)…
Pour le nombre de chaque requête je ne sais pas encore, je garde en tête ta remarque très judicieuse sur l’ordre d’exécution.
[^] # Re: Je ne ferais pas ça comme ça.
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 2.
En incluant les suites telles que "a ma" je peux toujours par la suite filtrer avec une expression régulière pour n’avoir que les mots.
[^] # Re: occurrence des mots
Posté par Marotte ⛧ . En réponse au journal Analyse de texte. Évalué à 3.
C’est volontaire de vouloir prendre les signes de ponctuation…
Pour moi 'mice' et 'mice.' ne sont pas deux chaînes identiques. De la deuxième on peut présager que le mot « mice » a des chances de terminer une phrase. À part le remplacement des retour à la ligne par des espaces puis la réduction des espaces consécutives à une seule espace je travaille en mode suite de caractères.