Commit 9ffd72ac1638cf7af38dcf537a56549e9780d48d
1 parent
dcdaad1b02
Exists in
soap
ajout du test
Showing 4 changed files with 172 additions and 44 deletions Inline Diff
liaSoap.py
1 | from spyne.application import Application | 1 | from spyne.application import Application |
2 | from spyne.decorator import srpc | 2 | from spyne.decorator import srpc |
3 | from spyne.service import ServiceBase | 3 | from spyne.service import ServiceBase |
4 | from spyne.model.primitive import Integer | 4 | from spyne.model.primitive import Integer |
5 | from spyne.model.primitive import Unicode | 5 | from spyne.model.primitive import Unicode |
6 | from spyne.model.complex import Iterable | 6 | from spyne.model.complex import Iterable |
7 | from spyne.protocol.soap import Soap11 | 7 | from spyne.protocol.soap import Soap11 |
8 | from spyne.server.wsgi import WsgiApplication | 8 | from spyne.server.wsgi import WsgiApplication |
9 | from processor.Orkis import Orkis | 9 | from processor.Orkis import Orkis |
10 | 10 | ||
11 | class HelloWorldService(ServiceBase): | 11 | class getPhonService(ServiceBase): |
12 | @srpc(Unicode, _returns=Unicode) | 12 | @srpc(Unicode, _returns=Unicode) |
13 | def say_hello(name): | 13 | def get_phon(string): |
14 | orkis=Orkis(name) | 14 | orkis=Orkis(string) |
15 | orkis.getDico() | 15 | orkis.getDico() |
16 | return str(orkis) | 16 | return str(orkis) |
17 | 17 | ||
18 | application = Application([HelloWorldService], | 18 | application = Application([getPhonService], |
19 | tns='spyne.examples.hello', | 19 | tns='lia.tools.phon', |
20 | in_protocol=Soap11(), | 20 | in_protocol=Soap11(), |
21 | out_protocol=Soap11() | 21 | out_protocol=Soap11() |
22 | ) | 22 | ) |
23 | 23 | wsgi_app = WsgiApplication(application) | |
24 | if __name__ == '__main__': | 24 | if __name__ == '__main__': |
25 | # You can use any Wsgi server. Here, we chose | 25 | # You can use any Wsgi server. Here, we chose |
26 | # Python's built-in wsgi server but you're not | 26 | # Python's built-in wsgi server but you're not |
27 | # supposed to use it in production. | 27 | # supposed to use it in production. |
28 | from wsgiref.simple_server import make_server | 28 | from wsgiref.simple_server import make_server |
29 | 29 | ||
30 | wsgi_app = WsgiApplication(application) | ||
31 | server = make_server('0.0.0.0', 8000, wsgi_app) | 30 | server = make_server('0.0.0.0', 8000, wsgi_app) |
32 | server.serve_forever() | 31 | server.serve_forever() |
33 | 32 |
test/functional/data.txt
File was created | 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 | tion de Dirichlet latente (LDA), un modèle génératif probabiliste, pour détecter les concepts | ||
4 | implicites de la requête en utilisant les documents obtenus par un processus de retour de perti- | ||
5 | nence simulé (ou documents de | ||
6 | feedback | ||
7 | ). Notre approche estime automatiquement le nombre | ||
8 | de concepts ainsi que le nombre de documents de | ||
9 | feedback | ||
10 | sans aucun apprentissage préalable | ||
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- | ||
14 | nalistique, encyclopédique) à partir desquelles les documents de | ||
15 | feedback | ||
16 | sont extraits. Nous | ||
17 | comparons différentes approches état-de-l’art sur deux collections | ||
18 | ad-hoc | ||
19 | de TREC, et les ré- | ||
20 | sultats montrent que l’utilisation de concepts implicites identifiés par notre méthode améliore | ||
21 | significativement les performances de recherche documentaire. | ||
22 | ABSTRACT. | ||
23 | In this paper we introduce an unsupervised method for mining and modeling la- | ||
24 | tent search concepts. We use Latent Dirichlet Allocation (LDA), a generative probabilistic | ||
25 | topic model, to exhibit highly-specific query-related topics from pseudo-relevant feedback doc- | ||
26 | uments. Our approach automatically estimates the number of latent concepts as well as the | ||
27 | needed amount of feedback documents, without any prior training step. Latent concepts are | ||
28 | then weighted to reflect their relative adequacy and are further used to automatically reformu- | ||
29 | late the initial user query. We also explore the use of different types of sources of information for | ||
30 | modeling the latent concepts. For this purpose, we use four general sources of information of | ||
31 | various nature (web, news, encyclopedic) from which the feedback documents are extracted. We | ||
32 | evaluate our approach over two large ad-hoc TREC collections, and results show that it signif- | ||
33 | icantly improves document retrieval effectiveness while best results are achieved by combining | ||
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. | ||
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 | ||
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- | ||
52 | milaires représentant les thèmes de la recherche (Finkelstein | ||
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 | ||
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 | ||
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 | ||
60 | rapport à la requête sont traités comme des concepts implicites. Ils sont alors utilisés | ||
61 | pour reformuler la requête. Le problème avec cette approche est que chaque mot re- | ||
62 | présente un concept spécifique. Seulement un concept représente une notion et peut | ||
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 | ||
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 | ||
67 | concepts sous-jacents associés à une requête, améliorant indirectement les informa- | ||
68 | tions contextuelles liées à la recherche documentaire. Nous introduisons ainsi une | ||
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 | ||
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 | ||
73 | initialement récupérés par le système. Ces documents de | ||
74 | ous estimons la similarité entre deux modèles conceptuels en calculant les simi- | ||
75 | larités entre toutes les paires de concepts des deux modèles. Seulement, deux modèles | ||
76 | différents sont générés à partir de documents différents, ils ne partagent donc pas le | ||
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 | ||
79 | concepts. Les concepts sont donc ramenés à de simples sacs de mots, et nous utilisons | ||
80 | une mesure de similarité basée sur la fréquence inverse des mots dans les documents | ||
81 | de la collection. | ||
82 | La figure 1 présente des histogrammes traçant le nombre de requêtes en fonction | ||
83 | du nombre de concepts implicites estimé et du nombre de documents de | ||
84 | feedback | ||
85 | ,et | ||
86 | ce pour les deux collections. On voit que le comportement est relativement identique | ||
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 | ||
89 | nombre assez réduit de documents, entre deux et quatre pour les deux collections. | ||
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 | ||
92 | plus grand nombre est nécessaire pour la ressource Web. Ce comportement est très | ||
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 | ||
95 | devenu trop conséquent soit coupé en plusieurs autres articles traitant chacun un sujet | ||
96 | très spécifique. | ||
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 | ||
100 | ), les travaux de (Zipf, 1935; Zipf, | ||
101 | 1949) et de (Mandelbrot, 1953) où les auteurs font des consid | ||
102 | érations thermodynamiques d’éner- | ||
103 | gie et de température dans leurs études sur la Statistique Te | ||
104 | xtuelle. Dernièrement se sont servi des notions de polarisation des système | ||
105 | orientations sémantiques des mots (désirable ou indésirable) à partir de mots amorce. La sortie | ||
106 | de ce système est une liste de mots indiquant leurs orientati | ||
107 | ons estimés selon l’approximation | ||
108 | du champ moyen. Dans notre travail, nous avons utilisé diffé | ||
109 | remment la notion de spin des mots dans les documents. À | ||
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 | ||
113 | us avons étudié les problèmes du Trai- | ||
114 | tement Automatique de la Langue Naturelle (TALN) en utilisa | ||
115 | nt la notion d’énergie textuelle. | ||
116 |
test/functional/testLiaSoap.py
File was created | 1 | from suds.client import Client | |
2 | import time | ||
3 | import threading | ||
4 | |||
5 | ### TODO : Tester en parallele x4 un million de fois pour voir ### | ||
6 | url = 'http://lrc2-kija.univ-avignon.fr:8000/?wsdl' | ||
7 | client = Client(url) | ||
8 | filename = "data.txt" | ||
9 | file = open(filename, "r") | ||
10 | nb_times=4 | ||
11 | # Exp 1 | ||
12 | debut =time.time() | ||
13 | contents = file.read().decode("utf8").encode("ascii", errors='ignore').rstrip() | ||
14 | client.service.get_phon(contents) | ||
15 | duree= time.time()- debut | ||
16 | print (" Exper 1 : " + str(duree)) | ||
17 | # Exp 2 | ||
18 | debut =time.time() | ||
19 | file.seek(0) | ||
20 | lines = file.readlines() | ||
21 | for line in lines: | ||
22 | line = line.decode("utf8").encode("ascii", errors='ignore').rstrip() | ||
23 | if line is not None: | ||
24 | try: | ||
25 | client.service.get_phon(line) | ||
26 | except: | ||
27 | continue | ||
28 | duree= time.time()- debut | ||
29 | print (" Exper 2 line by line 1 corpus : " + str(duree)) | ||
30 | ##Exp 3 | ||
31 | debut = time.time() | ||
32 | file.seek(0) | ||
33 | contents = file.read().decode("utf8").encode("ascii", errors='ignore').rstrip() | ||
34 | tabs=[] | ||
35 | i=0 | ||
36 | while i <= nb_times : | ||
37 | tabs.append(contents) | ||
38 | i+=1 | ||
39 | client.service.get_phon("".join(tabs)) | ||
40 | duree= time.time()- debut | ||
41 | print ("Exper 3 2pow4 time the content in once shot " + str(duree)) | ||
42 | # EXP 4 | ||
43 | #debut = time.time() | ||
44 | #contents = file.read().decode("utf8").encode("ascii", errors='ignore').rstrip() | ||
45 | #def envoie(datas): | ||
46 | # client.service.get_phon(datas) | ||
47 | #i =0 | ||
48 | #threadTab= [] | ||
49 | #while i <= nb_times: | ||
50 | # threadTab.append(threading.Thread(None, envoie, None,contents,None)) | ||
51 | #duree = time.time() - debut | ||
52 |
webtagger.py
1 | # -*- coding: utf-8 -*- | File was deleted | |
2 | import subprocess | ||
3 | import os | ||
4 | import json | ||
5 | from lxml import etree | ||
6 | from flask import Flask, request, render_template | ||
7 | from processor.LiaTools import * | ||
8 | from processor.Orkis import Orkis | ||
9 | from flaskext.enterprise import Enterprise | ||
10 | from time import ctime | ||
11 | app = Flask(__name__) | ||
12 | enterprise = Enterprise(app) | ||
13 | |||
14 | @app.route("/") | ||
15 | def docs(): | ||
16 | return render_template('index.html') | ||
17 | |||
18 | @app.route("/tagger",methods=['POST']) | ||
19 | def cleaner(): | ||
20 | # Receive String from post parametre Raw text | ||
21 | dirtyString= request.values[u'string'] | ||
22 | # Charging Processor et check if they are okay ( aim is to dynamic charge later ) | ||
23 | orkisProc = Orkis(dirtyString) | ||
24 | # Processing | ||
25 | # Adding lemm of each words cause we went ther phonem too | ||
26 | taggedTable= orkisProc.getDico() | ||
27 | # Returning a row text to be parse client side | ||
28 | return unicode(taggedTable) | ||
29 | |||
30 | class OrkisService(enterprise.SOAPService): | ||
31 | @enterprise.soap(returns=enterprise._sp.String) | ||
32 | def get_phon(self): | ||
33 | return ctime() | ||
34 | |||
35 | if __name__ == '__main__': | ||
36 | app.debug = True | ||
37 | app.run(host='0.0.0.0') | ||
38 | 1 | # -*- coding: utf-8 -*- |