Jongler avec les dictionnaires dans Tsearch2

Jongler avec les dictionnaires dans Tsearch2 - SQL/NoSQL - Programmation

Marsh Posté le 25-03-2009 à 17:03:43    

Bonjour,
 
J'indexe une grosse base de données d'informations historiques, seulement voilà, le seul dictionnaire existant, fr_ispell, contient peu de (voire aucune) personnalités historiques.
 
Je pourrais augmenter le dictionnaire, mais ça me paraît inutile, pour peu qu'on puisse tout de même trouver certains mots.
 
J'ai essayé avec la config standard (anglaise) et la config française. Voici les résultats sur la même phrase :
 

Code :
  1. select * from ts_debug('je suis un président appelé mitterrand');
  2. -- Version anglaise
  3. "default";"lword";"Latin word";"je";"{en_stem}";"'je'"
  4. "default";"lword";"Latin word";"suis";"{en_stem}";"'sui'"
  5. "default";"lword";"Latin word";"un";"{en_stem}";"'un'"
  6. "default";"word";"Word";"président";"{simple}";"'président'"
  7. "default";"word";"Word";"appelé";"{simple}";"'appelé'"
  8. "default";"lword";"Latin word";"mitterrand";"{en_stem}";"'mitterrand'"
  9. -- Version française
  10. "default";"lword";"Latin word";"je";"{fr_ispell}";""
  11. "default";"lword";"Latin word";"suis";"{fr_ispell}";""
  12. "default";"lword";"Latin word";"un";"{fr_ispell}";""
  13. "default";"word";"Word";"président";"{fr_ispell}";"'président'"
  14. "default";"word";"Word";"appelé";"{fr_ispell}";"'appelé'"
  15. "default";"lword";"Latin word";"mitterrand";"{fr_ispell}";""


 
Dans le premier cas, il trouve tous les mots, ne sachant pas comment récupérer leur racine. Dans le second, il gère les racines (à priori) sauf pour la personnalité, pour qui il rend le mot "vide". Ce qui empêche toute recherche sur ce mot. En gros, si un mot n'est pas dans le dictionnaire, impossible de le trouver, ce qui est plutôt impossible à utiliser.
 
J'ai parcouru diverses docs sur le sujet, sans bien trop comprendre comment tout ça fonctionne. Notamment, j'ai vu qu'il était possible de trouver la racine des mots avec plusieurs stemmeurs :
 

Citation :


General rule: For each lexeme type it's possible to specify which dictionaries and in what order, will be used to process lexeme. This information is stored in table pg_ts_cfgmap. For example:

Code :
  1. ......skip.........................................
  2. default_russian | lword        | {astrosyn,en_stem}
  3. default_russian | lpart_hword  | {astrosyn,en_stem}
  4. default_russian | lhword       | {astrosyn,en_stem}


Note, that once lexeme gets recognized by one dictionary it will not pass to the next dictionary ! So, it's meaningless to specify {simple, en_stem}, or {en_stem, astrosyn}, because 'simple' and 'en_stem' recognize any lexeme by definition.  


 
Source
 
J'ai essayé en configurant français puis simple, en prenant soin d'ajouter aussi pour "word" :
 

Code :
  1. select * from pg_ts_cfgmap where ts_name='default' and tok_alias in ('lword', 'lpart_hword','lhword', 'word' );
  2. "default";"word";"{fr_ispell,simple}"
  3. "default";"lword";"{fr_ispell,simple}"
  4. "default";"lpart_hword";"{fr_ispell,simple}"
  5. "default";"lhword";"{fr_ispell,simple}"


 
On le retrouve bien à l'exécution de la première requête, mais toujours rien :
 

Code :
  1. "default";"lword";"Latin word";"je";"{fr_ispell,simple}";""
  2. "default";"lword";"Latin word";"suis";"{fr_ispell,simple}";""
  3. "default";"lword";"Latin word";"un";"{fr_ispell,simple}";""
  4. "default";"word";"Word";"président";"{fr_ispell,simple}";"'président'"
  5. "default";"word";"Word";"appelé";"{fr_ispell,simple}";"'appelé'"
  6. "default";"lword";"Latin word";"mitterrand";"{fr_ispell,simple}";""


 
Pire, en ne mettant que "simple", pour me rapprocher de la configuration par défaut, rien ne change :
 

Code :
  1. "default";"lword";"Latin word";"je";"{simple}";""
  2. "default";"lword";"Latin word";"suis";"{simple}";""
  3. "default";"lword";"Latin word";"un";"{simple}";""
  4. "default";"word";"Word";"président";"{simple}";"'président'"
  5. "default";"word";"Word";"appelé";"{simple}";"'appelé'"
  6. "default";"lword";"Latin word";"mitterrand";"{simple}";""


 
En gros, je ne sais pas comment faire. Il n'y a pas que les dictionnaires qui entrent en jeu, car dans deux conditions presque identiques (la différence étant l'intégration du dictionnaire français dans le second cas), on a deux résultats différents...
 
Help quoi... [:flclsd]

Reply

Marsh Posté le 25-03-2009 à 17:03:43   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed