Le blog de Jean David TECHER, un Réunionnais à Saint-Priest/Lyon

Aller au contenu | Aller au menu | Aller à la recherche


< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 >

samedi 3 février 2007

Le site http://lemotdujour.over-blog.com

Jeudi soir, j'ai matté ce site. Je m'étais dit que j'en ferais un billet. J'ai appris de ces mots! Mon cerveau s'est mis en ébullition! Purée, j'en ai appris des termes insoupçonnés de notre belle langue. Résultat, je me suis que je vais me faire une phrase que je noterais et que je ressortirais à l'occasion.

Vendredi matin, j'ai eu un RDV avec le boss...Quand il est parti, je lui ai sorti cette phrase:

Il appert que la deutergie des drogues douces puisse résulter à des philippiques envers autri.

Il a relu cette phrase en 3 fois pour essayer de bien comprendre. Héhé! Genre de phrase qu'il faut sortir pour montrer sa science! Celle-là aussi elle ne doit pas être mauvaise placé dans une discussion à l'orale:

J'ai ouïe dire qu'il appert que la deutergie des soins par les drogues douces puisse résulter à des philippiques envers autri. Mais de là, à succiter des interrogations, je m'en vais quérir un ami et vous laisser vaquer à vos occupations!

...Ca me rappelle la fois où j'ai matté le film «Liaisons dangeureuses» avec un pote! Purée à l'époque, on avait loué la cassette! On s'est tapé/retapé plusieurs passages (pas ceux que vous croyez...) où les termes usités étaient tellement forts qu'on a cogité au moins une bonne demi-heure après pour essayer de comprendre les phrases. Un petit regret! On ne parle plus comme celà de nos jours. Mais bon on s'instruit tout le temps!

http://lemotdujour.over-blog.com est le genre de sites que je en saurais que vous conseiller.

Cuisses de canard confit à la sauce soja

Hier soir avec Cat', nous avons essayé une variante des cuisses de canard confit. Vous savez les belles cuisses qui sont vendus dans de belles grosses boites vertes. J'ai dit à Catherine de gouter et que ce n'est qu'àprès que je lui dirais ce que j'ai mis dedans!

Ben rien de compliqué:

  • de la sauce de soja;
  • une pincée de gingembre;
  • deux morçeaux de sucre;
  • un oignon.

On s'est régalé ! Sinon on peut aussi remplacer le sucre par du miel. Un bon petit mélange sucré/salé à essayer en tout cas!

En tout cas les compliments n'ont pas manqués hier soir: «Tu es un chef!»,«Tu t'améliore dans ta cuisine!».......

Un geek qui s'est faire de la bonne cuisine est un geek en puissance ...! Ich bin ze best of les bests. Nous ne sommes pas que des grands enfants stochés devant l'ordi 24h/24h..Nous avons en réserve des talents bien cachés/insoupçonnés .

A ben tiens! La prochaine fois, je ferais un billet sur mon mélange d'épices pour un cari poulet massalet .

jeudi 1 février 2007

Utilisation de Tsearch2 avec PostgreSQL (Suite)

Bon dans mes tests avec Tsearch, je commence enfin à voir le bout du tunnel notamment pour les fichiers de stemmer!

MISE A JOUR DU BILLET le 2007-03-13

Suite à des erreurs signalées par un utilisateur - que j'ai croisé sur IRC - , je mets donc à jour ce billet! Les mises à jours concernent surtout

  • Les fichiers french.aff, french.dict, french.stop que vous pouvez désormais télécharger à http://www.davidgis.fr/download/tsearch2_french_files.zip => IL Y A UNE SECTION DANS MON BILLET QUE JE VOUS DEMANDERAIS DONC DE BIEN VOULOIR IGNORER "changement dans la base"! MERCI
  • j'ai corrigé le fichier article.sql utilisé ici en exemple dans ce billet
Le cadre

A la maison, j'ai PostgreSQL 8.2.1 sous Ubuntu Dapper avec des bases encodées en UTF-8

I-Installation

On s'assure que tsearch est installé comme il faut

Pour tsearch ici, il y a d'abord un patch à télécharger et à utiliser

cd /mnt/sources/postgresql-8.2.1/src/
wget http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/tsearch_snowball_82.gz
gunzip tsearch_snowball_82.gz
patch -p0 < tsearch_snowball_82

puis on installe tsearch2

cd /mnt/sources/postgresql-8.2.1/src/contrib/tsearch2/
make
make install 

On va générer les modèles de dictionnaire avec stemmer de snowball. Pour se faire, on peut consulter le fichier tsearch2/gendict/README.gendict

cd /mnt/sources/postgresql-8.2.1/src/contrib/tsearch2/gendict
wget http://snowball.tartarus.org/algorithms/french/tarball.tgz
tar xvzf tarball.tgz

La décompression donne un répertoire «french» contenant des fichiers stem_....{c,h}. Dans ce répertoire, ce sont les fichiers stem_UTF_8.{c,h} qui vont nous intéressés. Il faut copier les fichiers gendict/french/stem_UTF_8.{c,h} en gendict/stem.{c,h}. Cette étape est importante notamment pour le paramètre -p de ./config.sh. J'avais à un moment copier bêtement les fichier, dans le répertoire même de gendict et celà me générait beaucoup d'erreur.

cp french/stem_UTF_8.h stem.h 
cp french/stem_UTF_8.c stem.c
./config.sh -n fr -s -p french_UTF_8 -i -v -c stem.c -h stem.h -C'Snowball stemmer for French'

Celà aura pour effet de créer le répertoire contrib/dict_fr avec les stem.{c,h} attendus ainsi que le Makefile adapté.

cd ../../gendict
make
make install 
! ! ! PARTIE ANTERIEURE AU 2007-03-14: MERCI DE SAUTER CETTE SECTION ! ! !
Chargement dans une base

Ok Let's go ! On a besoin pour continuer d'utiliser des fichiers de IPSELL que l'on peut trouver sur le site de tsearch2 à l'url http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/. Nous allons téléchargés http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/dicts/ispell/ispell-french.tar.gz

wget http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/dicts/ispell/ispell-french.tar.gz
tar xvfz ispell-french.tar.gz

Attention!une fois les fichiers, il faut vérifier que ces derniers soient bien encodées en UTF-8 pour nous:

root@bremko:/home/david/test# tar xvzf ispell-french.tar.gz
ispell-french/
ispell-french/french.aff
ispell-french/french.dict
root@bremko:/home/david/test# file ispell-french/*
ispell-french/french.aff:  ISO-8859 text
ispell-french/french.dict: ISO-8859 text

Ah merde, chez moi c'est en UTf-8 , mais pas de souci, on a la solution grâce à recode

root@bremko:/home/david/test# apt-get install recode >> /dev/nul
root@bremko:/home/david/test# recode l9..u8 ispell-french/*
root@bremko:/home/david/test# file ispell-french/*
ispell-french/french.aff:  UTF-8 Unicode text
ispell-french/french.dict: UTF-8 Unicode text
root@bremko:/home/david/test#

Avant de continuer, je dois signaler que j'avais à un moment bêtement importer ces deux fichiers dans ma base! Et quand je faisais

SELECT lexize('fr_ispell','école')

j'obtenais l'erreur

ERROR:  Affix parse error at 130 line 

J'ai donc envoyé un mail à a mailing-list de OpenFTS. Et c'est Oleg qui m'a donnée les raisons pourquoi mon fichier french.aff n'était pas bon. Finalement plus tard, c'est klando sur le IRC de PostgreSQLFR qui m' a expliqué pourquoi. Le fichier de Oleg en fait à l'origine (dans le fichier compressé ispell-frenc.tar.gz) était mal formaté. Voilà pour la petite histoire. Entout cas merci à toi klando pour ton travail

Donc comme convenu dans le mail en question, il faut donc télécharger le nouveau fichier french-over.aff, le réencoder en UTF-8 et le renommer en french.aff. Ce qui ce fait en faisant:

cd /home/david/test/ispell-french
wget http://mira.sai.msu.su/~megera/french-over.aff
recode l9..u8 french-over.aff && mv french-over.aff french.aff
! ! ! FIN PARTIE ANTERIEURE AU 2007-03-14: MERCI D'AVOIR SAUTER CETTE SECTION :) ! ! !
II - TEST

Faisons nos tests

su postgres
createdb test
psql -d test -f /opt/pgsql/share/contrib/tsearch2.sql 
psql -d test -f /opt/pgsql/share/conrib/dict_fr.sql 

Une petite connexion à la base grâce à psql. Les tables que crée tsearch sont préfixées en pg_ts_

test=# \dt
            List of relations
 Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
 public | pg_ts_cfg    | table | postgres
 public | pg_ts_cfgmap | table | postgres
 public | pg_ts_dict   | table | postgres
 public | pg_ts_parser | table | postgres
(4 rows)

Un premier test

test=# select lexize('fr','hôpitaux');
  lexize
-----------
 {hôpital}
(1 row)

Un autre

test=# select lexize('fr','anticonstitutionnellement');
        lexize
-----------------------
 {anticonstitutionnel}
(1 row)

Très de bavardages, passons aux choses sérieuses. On va maintenant charger une table

CREATE TABLE article(id serial primary key,contenu text);

Pour le contenu, j'ai pris une page internet au hasard par exemple cellec-ci http://fr.wikipedia.org/wiki/Discussion_Wikip%C3%A9dia:Usage_raisonn%C3%A9_des_sources_de_presse. J'ai un peu modifié le contenu pour que ca passe sur ma machine. Vous pouvez trouvez le fichier SQL correspondant de la page. Pour le charger, il suffit de faire

psql -d test -f article.sql

Bon maintenant le plat de résistance. Avant de continuer, il me faur un fichier french.stop que j'ai trouvé ici (fichier à renommer en french.stop)

Avant de passer à la suite, nous avons besoin de télécharger des fichiers auxilaires http://www.davidgis.fr/download/tsearch2_french_files.zip

Nous allons les télécharger et les mettre par exemple dans le home directory de postgres

su postgres
cd
wget http://www.davidgis.fr/download/tsearch2_french_files.zip
unzip tsearch2_french_files.zip

Ok !


BEGIN TRANSACTION;

UPDATE pg_ts_dict SET dict_initoption='/home/postgres/french.stop' WHERE dict_name = 'fr';

INSERT INTO pg_ts_cfg (ts_name, prs_name, locale) VALUES ('default_french', 'default', 'fr_FR.UTF-8');


insert into pg_ts_cfgmap values ('default_french','email','{simple}');
insert into pg_ts_cfgmap values ('default_french','file','{simple}');
insert into pg_ts_cfgmap values ('default_french','float','{simple}');
insert into pg_ts_cfgmap values ('default_french','host','{simple}');
insert into pg_ts_cfgmap values ('default_french','hword','{simple}');
insert into pg_ts_cfgmap values ('default_french','int','{simple}');
insert into pg_ts_cfgmap values ('default_french','lhword','{fr_ispell}');
insert into pg_ts_cfgmap values ('default_french','lpart_hword','{fr_ispell}');
insert into pg_ts_cfgmap values ('default_french','nlhword','{simple}');
insert into pg_ts_cfgmap values ('default_french','nlpart_hword','{simple}');
insert into pg_ts_cfgmap values ('default_french','part_hword','{simple}');
insert into pg_ts_cfgmap values ('default_french','sfloat','{simple}');
insert into pg_ts_cfgmap values ('default_french','uint','{simple}');
insert into pg_ts_cfgmap values ('default_french','uri','{simple}');
insert into pg_ts_cfgmap values ('default_french','url','{simple}');
insert into pg_ts_cfgmap values ('default_french','version','{simple}');
insert into pg_ts_cfgmap values ('default_french','word','{fr_ispell,fr}');
insert into pg_ts_cfgmap values ('default_french','nlword','{fr_ispell}');
insert into pg_ts_cfgmap values ('default_french','lword','{fr_ispell,fr,simple}');


 INSERT INTO pg_ts_dict
               (SELECT 'fr_ispell',
                       dict_init,
                       'DictFile="/home/postgres/french.dict",'
                       'AffFile="/home/postgres/french.aff",'
                       'StopFile="/home/postgres/french.stop"',
                       dict_lexize
                FROM pg_ts_dict
                WHERE dict_name = 'ispell_template');




END TRANSACTION;

??? C'est quoi toutes ces lignes me demandiez-vous? Un exemple étant plus parlant qu'autre chose, prenons donc un exemple. Considérons par exemple la phrase pour laquelle je vais introduire la fonction ts_debug()

test=# select 'Je m appelle David ,j''habite à Montpellier et mon e-mail est davidtecher@yahoo.fr';
                                     ?column?
-----------------------------------------------------------------------------------
 Je m appelle David ,j'habite à Montpellier et mon e-mail est davidtecher@yahoo.fr
(1 ligne)

Maintenant, si je fais

test=# select ts_debug('Je m appelle David ,j'' habite à Montpellier et mon e-mail est davidtecher@yahoo.fr');
                                        ts_debug
-----------------------------------------------------------------------------------------
 (default_french,lword,"Latin word",Je,"{fr_ispell,fr,simple}","")
 (default_french,lword,"Latin word",m,"{fr_ispell,fr,simple}","")
 (default_french,lword,"Latin word",appelle,"{fr_ispell,fr,simple}","'peler' 'appelle'")
 (default_french,lword,"Latin word",David,"{fr_ispell,fr,simple}",'david')
 (default_french,lword,"Latin word",j,"{fr_ispell,fr,simple}","")
 (default_french,lword,"Latin word",habite,"{fr_ispell,fr,simple}",'habite')
 (default_french,nlword,"Non-latin word",à,{fr_ispell},"")
 (default_french,lword,"Latin word",Montpellier,"{fr_ispell,fr,simple}",'montpellier')
 (default_french,lword,"Latin word",et,"{fr_ispell,fr,simple}","")
 (default_french,lword,"Latin word",mon,"{fr_ispell,fr,simple}","")
 (default_french,lhword,"Latin hyphenated word",e-mail,{fr_ispell},'mail')
 (default_french,lpart_hword,"Latin part of hyphenated word",e,{fr_ispell},"")
 (default_french,lpart_hword,"Latin part of hyphenated word",mail,{fr_ispell},'mail')
 (default_french,lword,"Latin word",est,"{fr_ispell,fr,simple}","")
 (default_french,email,Email,davidtecher@yahoo.fr,{simple},'davidtecher@yahoo.fr')
(15 lignes)

Revenons maintenant à notre table article. Nos premières manip' seront d'après les diverses docs sur tsearch2

SELECT set_curdict('fr_ispell');
 ALTER TABLE article ADD COLUMN contenu_vectors tsvector;
UPDATE article SET contenu_vectors = to_tsvector(contenu);
VACUUM FULL ANALYZE ;
CREATE INDEX contenu_idx on article using gist(contenu_vectors);
VACUUM FULL ANALYZE ;

Par exemple maintenant si je cherche le mot «source» aussi bien au singulier qu'au pluriel

test=# SELECT id,contenu FROM article WHERE contenu_vectors @@ to_tsquery('source');
 id |                                                                                     contenu 
----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 59 | exemple, les résultats du recensement, la source officielle c'est l'INSEE, mais qui sont repris dans chaque canard) et parfois d'une exactitude approximative. Nguyenld 12 mai
 48 | Le journal est une source particulièrement utilisée pour le traitement de l'histoire immédiate c'est-à-dire pour des articles qui relèvent plus ou moins du journalisme. Les
 57 | C'est une source d'information incontournable, en particulier pour la vie locale : fêtes et manifestation d'un village, rappels historiques sur un monument, un personnage
  6 | L'encyclopédiste doit donc citer comme "source de l'article" l'historien qu'il a effectivement lu pour écrire l'article, et mettre un lien sur le texte de "j'accuse".
  7 | Dans la pratique, les contributeurs sont tentés de prendre les journaux comme source en matière d'histoire immédiate. Quelle sont les règles à observer pour le traitement de l
 10 | en aucun cas le point de vue, l'analyse ou la déclaration d'un journaliste peut être considéré comme une source pour un article encyclopédique sans être mis en perspective
 24 | Exemple de cas : Antiquus Mysticusque Ordo Rosae Crucis#Relation avec l'Ordre du Temple Solaire ?. Faut-il enlever les sources citées sous le motif que Libé ou l'AFP ne sont
 25 | spécialisée ni en droit ni en ésotérisme ? Et si on supprime ces sources, faut-il supprimer ce paragraphe (pour absence de source et d'attribution de PdV) ? Turb 5 mai 2006 à
 29 | Salut. A mon avis, il y a d'autres cas qui peuvent être admis dans "Comment utiliser les sources de presse à l'appui d'un article encyclopédique":
 31 | * Article citant des sources pouvant servir de présentation d'un POV sur une situation (ex. : selon l'ONG X, le tremblement de terre a fait tant de victimes)
 33 | En ce qui concerne "Dans quels cas les sources de presse sont-elles déconseillées ?", on peut ajouter :
(11 rows)

Mais on peut aussi essayer de ne retourner que les lignes qui ne contiennent que le mot source et le mot avis

test=# SELECT id,contenu FROM article WHERE contenu_vectors @@ to_tsquery('source&avis');
 id |                                                                      contenu
----+----------------------------------------------------------------------------------------------------------------------------------------------------
 29 | Salut. A mon avis, il y a d'autres cas qui peuvent être admis dans "Comment utiliser les sources de presse à l'appui d'un article encyclopédique":
(1 ligne)

Ou bien encore les phrases qui contiennent soit le mot avis ou histoire

test=# SELECT id,contenu FROM article WHERE contenu_vectors @@ to_tsquery('histoire|avis');
 id |                                                                                     contenu 
----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 47 | Histoire immédiate, journalisme, j'insiste [modifier]
 48 | Le journal est une source particulièrement utilisée pour le traitement de l'histoire immédiate c'est-à-dire pour des articles qui relèvent plus ou moins du journalisme. Les
 49 | usages autorisent ce genre d'articles, alors qu'à mon sens, la synthèse de l'histoire immédiate s'apparente à un travail de recherche prohibé par les principes fondateurs de
 51 | Cette page à l'usage des débutants prend parti clairement dans le débat: Elle légitime le journalisme. Mon avis personnel sur la question: Il faut déporter tous les articles à
 54 | Je suis d'accord avec toi, mais ce genre de proposition ne sera jamais acceptée à mon avis Le gorille Houba 8 mai 2006 à 15:55 (CEST)
  1 | L'histoire immédiate
  7 | Dans la pratique, les contributeurs sont tentés de prendre les journaux comme source en matière d'histoire immédiate. Quelle sont les règles à observer pour le traitement de l
  8 | 'histoire immédiate ? C'est une autre question, une vaste question, mais qu'on ne peut pas éluder dans cette page. --EdC / Contact 5 mai 2006 à 13:11 (CEST)
 15 | journaliste ou d'une organisation partisane nuit gravement à votre santé et à celle de votre entourage, à consommer avec modération". Mon avis est qu'on crève de
 29 | Salut. A mon avis, il y a d'autres cas qui peuvent être admis dans "Comment utiliser les sources de presse à l'appui d'un article encyclopédique":
(10 lignes)
III - QUE FAIRE SI LE MOT EST ECRIT SANS ACCENT

Une solution simple semble de rajouter une colonne qui duplique la colonne «contenu» ici qui enlève les accents

Un bon compromis serait aussi de créer un trigger sur la colonne contenu qui à chaque nouvelle insertion, insère aussi le code sans accent dans la colonne correspondante. La solution proposée ici est que pour des tests et pour le fun.

test=# ALTER TABLE article ADD column contenu_sans_accent text;
ALTER TABLE
test=# UPDATE article SET contenu_sans_accent=translate(contenu,'àéèêëîïù','aeeeeiiu');
UPDATE 66
test=# ALTER TABLE article ADD column contenu_sans_accent_vectors tsvector;
ALTER TABLE
test=# UPDATE article SET contenu_sans_accent_vectors = to_tsvector('simple',contenu_sans_accent);
UPDATE 66
test=#  VACUUM FULL ANALYZE ;
VACUUM
test=# CREATE INDEX contenu_sa_idx on article using gist(contenu_sans_accent_vectors);
CREATE INDEX
test=#  VACUUM FULL ANALYZE ;
Des exemples

Suppons que le cherche le mot "matière" mais qu'ici au lieu de l'écire comme il faut on a saisi "matiere". On supposera de même pour le mot synthèse

test=# SELECT id,contenu FROM article WHERE contenu_sans_accent_vectors @@ to_tsquery('simple','matiere');
 id |                                                                                     contenu 
----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  7 | Dans la pratique, les contributeurs sont tentés de prendre les journaux comme source en matière d'histoire immédiate. Quelle sont les règles à observer pour le traitement de l
(1 row)

test=# SELECT id,contenu FROM article WHERE contenu_sans_accent_vectors @@ to_tsquery('simple','synthese');
 id |                                                                                    contenu 
----+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 49 | usages autorisent ce genre d'articles, alors qu'à mon sens, la synthèse de l'histoire immédiate s'apparente à un travail de recherche prohibé par les principes fondateurs de
(1 row)

mardi 30 janvier 2007

Le blog de Paul RAMSEY - FOSS4G 2007

C'est sur le blog de Paul aujourd'hui que j'ai appris que le FOSS4G 2007 aurait lieu en Victoria au Canada! Bonne nouvelle! Apparement du beau monde serait attendu cette année!

Pour une fois c'est le grand manitou qui sera aux commandes pour piloter le projet , ça me fait plaisir!

Le FOSS4G devrait se tenir du 24 au 27 septembre 2007.

Le site du FOSS4G 2007: http://www.foss4g2007.org