-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathextractionTerme.py
176 lines (143 loc) · 6.31 KB
/
extractionTerme.py
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
# -*- coding: utf-8 -*-
"""
Programme principale pour l'extraction de terme.
A appeler avec un fichier de config en argument
"""
import sys
import os
import csv
from config.config import Config,METHODES_EXTRACTION,METHODES_SCORING
from indexeur.indexeur import Indexeur
from extracteur.extracteurSpacy import ExtracteurSpacy
from extracteur.extracteurNGrammes import ExtracteurNGrammes
from parserCorpus.parserArticle import ParserArticle
from parserCorpus.parserSplit import ParserSplit
from classeur.classeurTFIDF import ClasseurTFIDF
from classeur.classeurFrequence import ClasseurFrequence
from classeur.classeurCValue import ClasseurCValue
from classeur.classeurOkapi import ClasseurOkapi
PATH_CORPUSREF = 'ressources/corpus_ref.fr'
def recupererIndexeurReference(config):
"""Permet de récupérer l'indexeur du corpus de référence correspondant à
la configuration.
Comme le traitement est long, si l'indexeur a déjà été créé alors il est chargé,
sinon il est calculé puis enregistré pour les prochaines fois.
Parameters
----------
config : Config
objet de configuration
Returns
-------
Indexeur
L'indexeur du corpus de référence correspondant à la configuration
"""
pathInd = 'ressources/indRef_'+str(config.getMethodeExtraction().name)+ \
'_'+str(config.getStem())+'.pkl'
#si le fichier existe
if(os.path.exists(pathInd)):
return Indexeur.charger(pathInd)
#sinon on le crée
else:
#On modifie la config pour que tous les chargements soit moins long
#Pour l'indexeur du corpus de référence on prend toujours une config où la longueur
#des termes est comprise entre 1 et 8.
#Comme ça, on ne créé pas un indexeur pour chaque configuration de longueur différente.
#Et ça ne change rien, si on demande les termes plus petit ils seront présent dans celui là.
#Si on demande plus grand ça ne changera pas ou peu l'idf car il est peu probable de
#trouver les mêmes termes de longueur plus grande que 8 dans le corpus de référence.
configRef = config.copy()
configRef.longueurMin = 1
configRef.longueurMax = 8
#récupère le corpus de référence
corpusRef = ParserArticle().parse(PATH_CORPUSREF)
#on crée l'extracteur correspondant au fichier de config
extracteur = recupererExtracteur(configRef)
#on extrait les termes du corpus de référence
corpusRef.extraction(extracteur)
#on crée l'indexation et on la sauvegarde pour ne pas recalculer la prochaine fois
indexation = Indexeur(corpusRef)
indexation.sauvegarder(pathInd)
return indexation
def recupererExtracteur(config):
"""Permet de récupérer l'extracteur correspondant à la configuration
Parameters
----------
config : Config
objet de configuration
Returns
-------
Extracteur
L'extracteur correspondant à la configuration
"""
#on crée l'extracteur correspondant au fichier de config
if(config.getMethodeExtraction() == METHODES_EXTRACTION.POSTAG):
return ExtracteurSpacy(config)
if(config.getMethodeExtraction() == METHODES_EXTRACTION.NGRAMMES):
return ExtracteurNGrammes(config)
def recupererClasseur(config,indexCorpusRef):
"""Permet de récupérer le classeur correspondant à la configuration
Parameters
----------
config : Config
objet de configuration
indexCorpusRef: Indexeur
Certains classeurs ont besoin d'un corpus de référence
Returns
-------
Classeur
Classeur correspondant à la configuration
"""
#on crée l'extracteur correspondant au fichier de config
if(config.getMethodeScoring() == METHODES_SCORING.FREQUENCE):
return ClasseurFrequence(config)
elif(config.getMethodeScoring() == METHODES_SCORING.TFIDF_STANDARD or\
config.getMethodeScoring() == METHODES_SCORING.TFIDF_LOG):
return ClasseurTFIDF(config,indexCorpusRef)
elif(config.getMethodeScoring() == METHODES_SCORING.OKAPI):
return ClasseurOkapi(config,indexCorpusRef)
def ecrireCSV(lignes,csvpath):
"""Ecrit dans un fichier csv le classement des termes obtenus avant.
Noms des champs du csv -> rang;terme;score.
Parameters
----------
lignes : zip[list[int],list[tuple(str*)],list[float]]
Zip du rang, du terme, de son score. Ce qui va correspondre à une
ligne du csv rang;terme;score.
"""
with open(csvpath,'w',encoding='utf-8',newline='') as fcsv:
csvWriter = csv.writer(fcsv,delimiter=';')
csvWriter.writerow(['Rang','Terme','Score'])
for i,terme,score in lignes:
strTerme = ' '.join(terme)
csvWriter.writerow([str(i),strTerme,str(score)])
if __name__=='__main__':
#on récupère le chemin d'où on appelle le script
cheminAppel = os.getcwd()
#Pour la suite on se place dans le repértoire qui contient le script
os.chdir(os.path.abspath(os.path.dirname( __file__)))
#récupération du fichier de config et initialise l'objet Config
pathConfig = sys.argv[1]
config = Config(os.path.join(cheminAppel,pathConfig))
#on récupère l'indexation de référence
indRef = recupererIndexeurReference(config)
#on récupère le corpus à traiter
pathCorpus = config.getCorpusPath()
corpus = ParserSplit().parse(os.path.join(cheminAppel,pathCorpus))
#on extrait les termes du corpus
extracteur = recupererExtracteur(config)
corpus.extraction(extracteur)
#on index le corpus à traiter
indexCorpus = Indexeur(corpus)
#on récupère le classeur pour classer les termes du corpus
classeur = recupererClasseur(config,indRef)
#on récupère les termes classés avec leur score
listeTermesTrie = classeur.classer(indexCorpus)
#on découpe la liste des termes et scores
listeTermes = [terme for terme,score in listeTermesTrie]
listeScores = [score for terme,score in listeTermesTrie]
#si stem = True alors on reconstruit les stems en des termes plus compréhensibles
if(config.getStem()):
listeTermes = extracteur.stemToTerme(listeTermes)
#on écrit dans un csv le résultat
lignes = zip(list(range(1,len(listeTermes)+1)),listeTermes,listeScores)
ecrireCSV(lignes,os.path.join(cheminAppel,config.getOutputPath()))