From 44c17c42360e2e98b06235928db740cbdad99242 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 31 Jul 2013 20:12:27 +0200 Subject: [PATCH] Accents Ok --- liaSoap.py | 6 ++-- processor/LiaTools.py | 27 +++++++------- processor/Orkis.py | 19 +++++----- test/functional/data.txt | 80 +++++++++++++++++++++--------------------- test/functional/testLiaSoap.py | 2 +- 5 files changed, 68 insertions(+), 66 deletions(-) diff --git a/liaSoap.py b/liaSoap.py index 7359d32..c7e694c 100644 --- a/liaSoap.py +++ b/liaSoap.py @@ -16,13 +16,13 @@ class getPhonService(ServiceBase): def get_phon(string): orkis=Orkis(string) orkis.getDico() - print(unicode(orkis)) + #print(unicode(orkis)) return unicode(orkis) application = Application([getPhonService], tns='lia.tools.phon', - in_protocol=Soap11(), - out_protocol=Soap11() + in_protocol=Soap11(encoding='UTF-8'), + out_protocol=Soap11(encoding='UTF-8') ) wsgi_app = WsgiApplication(application) if __name__ == '__main__': diff --git a/processor/LiaTools.py b/processor/LiaTools.py index 7fd61b5..df03c15 100644 --- a/processor/LiaTools.py +++ b/processor/LiaTools.py @@ -11,22 +11,23 @@ class Tagger(baseProcessor): Change text to iso and clean it one word by line and separate sentences with """ p=subprocess.Popen([os.environ["LIA_TAGG"]+'/script/lia_clean'],stdin=subprocess.PIPE,stdout=subprocess.PIPE) - (cleanString, err) = p.communicate(input=dirtyString.encode('iso8859-1','backslashreplace')) - return cleanString + (cleanString, err) = p.communicate(input=dirtyString.encode('iso8859-1')) + return cleanString.decode("iso8859-1").encode("utf8") def tagg(self,cleanString): """POS Tagg and lemm a string which come from clean""" p2=subprocess.Popen([os.environ["LIA_TAGG"]+'/script/lia_tagg+lemm','-guess'],stdin=subprocess.PIPE,stdout=subprocess.PIPE) - (taggedString,err) =p2.communicate(input=cleanString) - # This is used beceause lia_tagg deal with iso8859 only - return taggedString.decode('iso8859').encode("utf8") + (taggedString,err) =p2.communicate(input=cleanString.decode("utf8").encode('iso8859-1')) + # This is used beceause lia_tagg deal with iso8859 only + return taggedString.decode('iso8859-1').encode("utf8") def lemm(self,cleanString): - """ use the pos tagger to lemm word and return lemm only""" - taggedString = self.tagg(cleanString) - # sub the string to get only lemm ( cut markup and origin word ) Can be Delete with better use of lia_tagg - sub = re.sub(r' ','',re.sub(r' ',''," ".join([ x.rstrip().split().pop(2) for x in taggedString.rstrip().split("\n") if x]))) - return sub + """ use the pos tagger to lemm word and return lemm only""" + taggedString = self.tagg(cleanString) + # sub the string to get only lemm ( cut markup and origin word ) Can be Delete with better use of lia_tagg + sub = re.sub(r' ',u'', re.sub(r' ','',u" ".join([ x.rstrip().split().pop(2) for x in taggedString.rstrip().split(u"\n") if x]))) + return sub + def isReady(self): """ Check if the Tagger can be used ( depends on LIA_TAGG )""" os.environ["LIA_TAGG"] @@ -36,14 +37,14 @@ class Phoner(baseProcessor): """ a class which call the lia phoner """ def clean(self,dirtyString): p=subprocess.Popen([os.environ["LIA_PHON_REP"]+'/script/lia_nett'],stdin=subprocess.PIPE,stdout=subprocess.PIPE) - (cleanString, err) = p.communicate(input=dirtyString.encode('iso8859-1','backslashreplace')) - return cleanString + (cleanString, err) = p.communicate(input=dirtyString.decode("utf8").encode('iso8859-1')) + return cleanString.decode("iso8859-1").encode("utf8") def phon(self,cleanString): p2=subprocess.Popen([os.environ["LIA_PHON_REP"]+'/script/lia_lex2phon'],stdin=subprocess.PIPE,stdout=subprocess.PIPE) (taggedString,err) =p2.communicate(input=cleanString) # This is used beceause lia_phon deal with iso8859 only # We reconverte the output to utf8 back - return taggedString.decode('iso8859').encode("utf8") + return taggedString.decode('iso8859-1').encode("utf8") def isReady(self): os.environ["LIA_PHON_REP"] return True diff --git a/processor/Orkis.py b/processor/Orkis.py index b55b30e..89deddd 100644 --- a/processor/Orkis.py +++ b/processor/Orkis.py @@ -10,14 +10,15 @@ class Orkis(baseProcessor): self.tagger=Tagger() self.dico ={} self.string=dirtyString + print(dirtyString) def isReady(self): self.tagger.isReady() def __unicode__(self): string = u"" for word in self.dico: - string += ( unicode(word.decode("utf-8")))+unicode (u";") + string += word+u";" for lemWord in self.dico[word][0]: - string += (unicode(lemWord.decode("utf-8"))+ unicode(u" ")) + string += lemWord + u" " string+=u"\n" return string def clean(self): @@ -26,16 +27,16 @@ class Orkis(baseProcessor): def insertLem(self): self.lem=u"" self.cleanString=self.tagger.clean(self.string).rstrip() - taggedString=self.tagger.tagg(self.cleanString).rstrip() - self.tableLem = taggedString.rstrip().split("\n") - for line in taggedString.rstrip().split("\n"): - table = line.rstrip().split(" ") - print("table2" + table[2]) + taggedString=self.tagger.tagg(self.cleanString).rstrip().decode("utf8") + self.tableLem = taggedString.split(u"\n") + for line in taggedString.rstrip().split(u"\n"): + table = line.rstrip().split(u" ") + #print(u"table2" + table[2]) if not table[2].isspace(): if not table[0] in self.dico : self.dico[table[0]]=[set(),set()] self.dico[table[0]][0].add(table[2]) - self.lem = self.lem +"\n"+ table[2] + self.lem = self.lem +u"\n"+ table[2] def getDico(self): self.clean() self.insertLem() @@ -48,4 +49,4 @@ class Orkis(baseProcessor): list.append(indice) ligne= " ".join(list) self.table.append(ligne) - return "\n".join(self.table) + return u"\n".join(self.table) diff --git a/test/functional/data.txt b/test/functional/data.txt index c14eafa..6aead25 100644 --- a/test/functional/data.txt +++ b/test/functional/data.txt @@ -1,5 +1,5 @@ -Nous proposons dans cet article une méthode non supervisée pour l’identification et -la modélisation de concepts associés à une recherche d’information. Nous utilisons l’alloca- +Nous proposons dans cet article une méthode non supervisée pour l identification et +la modélisation de concepts associés à une recherche d information. Nous utilisons l alloca- tion de Dirichlet latente (LDA), un modèle génératif probabiliste, pour détecter les concepts implicites de la requête en utilisant les documents obtenus par un processus de retour de perti- nence simulé (ou documents de @@ -9,15 +9,15 @@ de concepts ainsi que le nombre de documents de feedback sans aucun apprentissage préalable ni paramétrage. Les concepts implicites sont pondérés afin de refléter leur importance relative -par rapport à la requête et sont utilisés pour modifier l’ordre des documents renvoyés à l’utili- -sateur. Nous utilisons quatre sources d’information générales de natures différentes (web, jour- +par rapport à la requête et sont utilisés pour modifier l ordre des documents renvoyés à l utili- +sateur. Nous utilisons quatre sources d information générales de natures différentes (web, jour- nalistique, encyclopédique) à partir desquelles les documents de feedback sont extraits. Nous -comparons différentes approches état-de-l’art sur deux collections +comparons différentes approches état-de-l art sur deux collections ad-hoc de TREC, et les ré- -sultats montrent que l’utilisation de concepts implicites identifiés par notre méthode améliore +sultats montrent que l utilisation de concepts implicites identifiés par notre méthode améliore significativement les performances de recherche documentaire. ABSTRACT. In this paper we introduce an unsupervised method for mining and modeling la- @@ -32,50 +32,50 @@ various nature (web, news, encyclopedic) from which the feedback documents are e evaluate our approach over two large ad-hoc TREC collections, and results show that it signif- icantly improves document retrieval effectiveness while best results are achieved by combining latent concepts modeled from all available sources. -Le but de la Recherche d’Information (RI) est de satisfaire le besoin d’information -d’un utilisateur, généralement en proposant des documents ou des passages provenant -d’une collection cible. Ce besoin est habituellement représenté par une requête com- -posée de quelques mots-clés, qui est soumise au système de recherche d’information. +Le but de la Recherche d Information (RI) est de satisfaire le besoin d information +d un utilisateur, généralement en proposant des documents ou des passages provenant +d une collection cible. Ce besoin est habituellement représenté par une requête com- +posée de quelques mots-clés, qui est soumise au système de recherche d information. Le système cherche alors les documents qui contiennent les mots-clés, afin de fournir -à l’utilisateur une liste de documents ordonnée en fonction de leur pertinence esti- -mée par rapport à la requête. Seulement, un besoin d’information complet peut être -trop complexe pour être exprimé en quelques mots, ou l’utilisateur peut ne pas avoir +à l utilisateur une liste de documents ordonnée en fonction de leur pertinence esti- +mée par rapport à la requête. Seulement, un besoin d information complet peut être +trop complexe pour être exprimé en quelques mots, ou l utilisateur peut ne pas avoir le vocabulaire ou les compétences nécessaires pour formuler efficacement la requête. -Ingwersen (1994) dit en effet que la formulation d’une requête par un utilisateur est la -représentation de son état cognitif actuel concernant un besoin d’information. Une re- -quête peut ne pas être correctement formulée si l’utilisateur cherche des informations -sur une thématique pour laquelle il n’a pas de connaissances. Ainsi, sans contexte ad- -ditionnel, le système de recherche d’information peut manquer des nuances ou des -détails que l’utilisateur n’a pas fourni dans la requête. Ce contexte peut prendre la -forme d’un modèle des intérêts de l’utilisateur basé sur son historique personnel (ou -ses interactions sociales), ou peut être composé d’éléments extraits de documents si- +Ingwersen (1994) dit en effet que la formulation d une requête par un utilisateur est la +représentation de son état cognitif actuel concernant un besoin d information. Une re- +quête peut ne pas être correctement formulée si l utilisateur cherche des informations +sur une thématique pour laquelle il n a pas de connaissances. Ainsi, sans contexte ad- +ditionnel, le système de recherche d information peut manquer des nuances ou des +détails que l utilisateur n a pas fourni dans la requête. Ce contexte peut prendre la +forme d un modèle des intérêts de l utilisateur basé sur son historique personnel (ou +ses interactions sociales), ou peut être composé d éléments extraits de documents si- milaires représentant les thèmes de la recherche (Finkelstein Ce deuxième type de contexte est plus généralement connu sous le nom de « re- -cherche d’information conceptuelle » et a reçu beaucoup d’attention au cours de ces -dernières années L’idée générale est d’étendre les requêtes avec des +cherche d information conceptuelle » et a reçu beaucoup d attention au cours de ces +dernières années L idée générale est d étendre les requêtes avec des ensembles de mots ou de multi-mots extraits de documents de -feedback. L’ensemble de feedback est composé de documents qui sont pertinents ou pseudo-pertinents par +feedback. L ensemble de feedback est composé de documents qui sont pertinents ou pseudo-pertinents par rapport à la requête initiale, et qui sont à même de contenir des informations impor- -tantes sur le contexte de la recherche. Les mots exprimant le plus d’information par +tantes sur le contexte de la recherche. Les mots exprimant le plus d information par rapport à la requête sont traités comme des concepts implicites. Ils sont alors utilisés pour reformuler la requête. Le problème avec cette approche est que chaque mot re- présente un concept spécifique. Seulement un concept représente une notion et peut être vu comme un ensemble de connaissances. Stock (2010) donne une définition qui -suit cette direction en affirmant qu’un concept est défini comme une classe contenant +suit cette direction en affirmant qu un concept est défini comme une classe contenant des objets possédant certaines propriétés et attributs. -L’objectif du travail présenté dans cet article est de représenter avec précision les +L objectif du travail présenté dans cet article est de représenter avec précision les concepts sous-jacents associés à une requête, améliorant indirectement les informa- tions contextuelles liées à la recherche documentaire. Nous introduisons ainsi une méthode entièrement non supervisée qui permet de détecter les concepts implicites -liés à une requête donnée et d’améliorer les performances d’un système de recherche +liés à une requête donnée et d améliorer les performances d un système de recherche documentaire en incorporant ces concepts à la requête initiale. Pour chaque requête, -les concepts implicites sont extraits d’un ensemble réduit de documents de +les concepts implicites sont extraits d un ensemble réduit de documents de initialement récupérés par le système. Ces documents de ous estimons la similarité entre deux modèles conceptuels en calculant les simi- larités entre toutes les paires de concepts des deux modèles. Seulement, deux modèles différents sont générés à partir de documents différents, ils ne partagent donc pas le même espace probabiliste. Les distributions de probabilités ne sont donc pas compa- -rables, le calcul de similarité ne peut se faire qu’en prenant en compte les mots des +rables, le calcul de similarité ne peut se faire qu en prenant en compte les mots des concepts. Les concepts sont donc ramenés à de simples sacs de mots, et nous utilisons une mesure de similarité basée sur la fréquence inverse des mots dans les documents de la collection. @@ -85,31 +85,31 @@ feedback ,et ce pour les deux collections. On voit que le comportement est relativement identique sur les deux collections. Entre deux et trois concepts sont identifiés pour la grande -majorité des requêtes. De même ces concepts sont généralement identifiés au sein d’un +majorité des requêtes. De même ces concepts sont généralement identifiés au sein d un nombre assez réduit de documents, entre deux et quatre pour les deux collections. Il est toutefois intéressant de noter la différence entre le nombre de documents de utilisés par les ressources Web et Wikipédia. On peut voir en effet que 2 -ou 3 articles Wikipédia suffisent pour un très grand nombre de requêtes, alors qu’un +ou 3 articles Wikipédia suffisent pour un très grand nombre de requêtes, alors qu un plus grand nombre est nécessaire pour la ressource Web. Ce comportement est très cohérent avec la nature même de Wikipédia, où les articles sont rédigés dans le but -d’être très précis et de ne pas trop s’éparpiller. Il est d’ailleurs fréquent qu’un article +d être très précis et de ne pas trop s éparpiller. Il est d ailleurs fréquent qu un article devenu trop conséquent soit coupé en plusieurs autres articles traitant chacun un sujet très spécifique. Des idées empruntées à la physique ont déjà été utilisées dan -s l’analyse de textes. Les exemples -plus notables sont l’approche entropique de (Shannon, 1948 +s l analyse de textes. Les exemples +plus notables sont l approche entropique de (Shannon, 1948 ), les travaux de (Zipf, 1935; Zipf, 1949) et de (Mandelbrot, 1953) où les auteurs font des consid -érations thermodynamiques d’éner- +érations thermodynamiques d éner- gie et de température dans leurs études sur la Statistique Te xtuelle. Dernièrement se sont servi des notions de polarisation des système orientations sémantiques des mots (désirable ou indésirable) à partir de mots amorce. La sortie de ce système est une liste de mots indiquant leurs orientati -ons estimés selon l’approximation +ons estimés selon l approximation du champ moyen. Dans notre travail, nous avons utilisé diffé remment la notion de spin des mots dans les documents. À partir de cet image, on aperçoit le document comme un matéria -ux composé d’un ensemble de -unités en interaction dont l’énergie peut être calculée. No +ux composé d un ensemble de +unités en interaction dont l énergie peut être calculée. No us avons étudié les problèmes du Trai- tement Automatique de la Langue Naturelle (TALN) en utilisa -nt la notion d’énergie textuelle. +nt la notion d énergie textuelle. diff --git a/test/functional/testLiaSoap.py b/test/functional/testLiaSoap.py index 0cfd934..bbb8625 100644 --- a/test/functional/testLiaSoap.py +++ b/test/functional/testLiaSoap.py @@ -10,7 +10,7 @@ file = open(filename, "r") nb_times=4 # Exp 1 debut =time.time() -contents = file.read().decode("utf8").encode("ascii", errors='ignore').rstrip() +contents = file.read().decode("utf8").rstrip() res =client.service.get_phon(contents) print(res) duree= time.time()- debut -- 1.8.2.3