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