contrainte.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # outils
  4. import imports.arguments as ARG
  5. import imports.fichiers as fichiers
  6. import imports.dot as dot
  7. # pattern
  8. from pattern.fr import parse, split
  9. '''
  10. Intention :
  11. En utilisant le langage dot, créé un graphe du texte donné en entrée. Le programme tente de lier entre elles les phrases en prenant le mot commun le plus signifiant d'une phrase à l'autre, de m'anière à créer un graphe. La contrainte est alors d'écrire un texte avec des mots communs d'une phrase à l'autre afin de permettre le lien graphique dans le graphe.
  12. '''
  13. # on regarde si on à l'option -f spécifiée : fichier à importer
  14. fichier = ARG.obtenir( '-f' )
  15. # si option présente mais rien de spécifié = False
  16. if ( not isinstance( fichier, basestring) ):
  17. fichier == False
  18. print 'aide : python contrainte.py -f adresse/du/fichier.txt'
  19. print 'choisir le nom d\'export : python contrainte.py -f fichier.txt -o fichier_export.txt'
  20. export = ARG.obtenir( '-o' )
  21. # on regarde si on à l'option -o spécifiée : fichier à exporter
  22. export = ARG.obtenir( '-o' )
  23. if ( not isinstance( export, basestring) ):
  24. export == False
  25. # si on a un nom de fichier associé à l'option -f
  26. if ( fichier ):
  27. fichier = fichiers.importer( fichier )
  28. scores = {
  29. "CC" : 10, #u"conjonction de coordination",
  30. "CD" : 10, #u"nombre cardinal",
  31. "DT" : 10, #u"déterminant",
  32. "EX" : 7, #u"Existential there",
  33. "FW" : 4, #u"mot étranger",
  34. "IN" : 7, #u"préposition ou conjonction de subordination",
  35. "JJ" : 5, #u"adjectif",
  36. "JJR" : 5, #u"adjectif comparatif",
  37. "JJS" : 5, #u"adjectif superlatif",
  38. "LS" : 99, #u"marqueur d'élément de liste",
  39. "MD" : 6, #u"modal",
  40. "NN" : 2, #u"nm, singulier ou mass",
  41. "NNS" : 3, #u"nom, pluriel",
  42. "NNP" : 0, #u"nom propre, singulier",
  43. "NNPS" : 1, #u"nom propre, pluriel",
  44. "PDT" : 10, #u"predeterminer",
  45. "POS" : 10, #u"possessive ending",
  46. "PRP" : 2, #u"pronom personnel",
  47. "PRP$" : 2, #u"pronom possessif",
  48. "RB" : 4, #u"adverbe",
  49. "RBR" : 4, #u"adverbe, comparatif",
  50. "RBS" : 4, #u"adverbe, superlatif",
  51. "RP" : 10, #u"particle",
  52. "SYM" : -1, #u"symbole",
  53. }
  54. def traiter_ligne ( ligne ):
  55. '''
  56. pour chaque ligne :
  57. on analyse avec pattern
  58. on regarde les éléments communs avec la phrase d'avant, la phrase d'après
  59. on prend celui avec le meilleur score
  60. '''
  61. print ligne
  62. def traiter_phrase ( phrase_1, phrase_2=False, dernier_id_phrase_2=False ):
  63. ''''''
  64. # modèle de la sortie
  65. sortie = {
  66. 'sentence': phrase_1,
  67. 'correspondances': None,
  68. }
  69. # on gère les correspondances
  70. if ( phrase_2 != False ):
  71. sortie['correspondances'] = index_correspondances ( phrase_1, phrase_2, dernier_id_phrase_2 )
  72. # on filtre les correspondances (ne garder que la plus importante)
  73. sortie = filtrer_correspondances( sortie )
  74. return sortie
  75. def filtrer_correspondances ( data ):
  76. ''''''
  77. # si on a des correspondances
  78. if ( data['correspondances'] != None ):
  79. precedent = False # false ou index
  80. # pour chaque correspondance
  81. for i in range( len( data['correspondances']) ):
  82. # si on a une correspondance et qu'on en a déjà eu une
  83. if ( data['correspondances'][i] != False and precedent != False ):
  84. # on compare :
  85. resultat = comparer_score ( data['sentence'], i, precedent )
  86. # si meilleur score :
  87. if ( resultat ):
  88. # on supprime la précédente référence
  89. data['correspondances'][precedent] = False
  90. else:
  91. # sinon on supprime cette référence
  92. data['correspondances'][i] = False
  93. elif ( precedent == False ):
  94. precedent = i
  95. return data
  96. def obtenir_score ( type ):
  97. ''''''
  98. try:
  99. scores[ type ]
  100. except Exception as erreur:
  101. print erreur
  102. return False
  103. def comparer_score ( sentence, i, i_precedent=False):
  104. ''''''
  105. try:
  106. score = scores[ sentence.words[ i ].type ]
  107. if ( i_precedent != False ):
  108. score_precedent = scores[ sentence.words[ i_precedent ].type ]
  109. # si on a un meilleur score (plus faible)
  110. if ( score < score_precedent ):
  111. # on retourne vrai
  112. return True
  113. else:
  114. return False
  115. except Exception as erreur:
  116. print 'type sans score : ' + str( erreur )
  117. return False
  118. def phrase_vers_liste( phrase ):
  119. ''''''
  120. liste = []
  121. for mot in phrase:
  122. liste.append( mot.string )
  123. return liste
  124. def index_correspondances ( liste_1, liste_2, dernier_id_phrase_2=0 ):
  125. '''renvoie un tableau avec pour chaque mot, soit False si pas de correspondance, soit l'index dans la phrase + celle dans le texte'''
  126. sortie = len(liste_1) * [False]
  127. if ( not dernier_id_phrase_2 ):
  128. dernier_id_phrase_2 = 0
  129. for a in range( len(liste_1) ):
  130. for b in range( len(liste_2) ):
  131. if ( liste_1[a].string == liste_2[b].string ):
  132. #print( str(liste_1[a]) + ' = ' + str(liste_2[b]) )
  133. sortie[a] = [b, b + dernier_id_phrase_2]
  134. #else:
  135. #print( str(liste_1[a]) + ' != ' + str(liste_2[b]))
  136. return sortie
  137. def traiter_fichier ( fichier=False ):
  138. '''traite le fichier. Retourne une liste contenant des dictionnaires contenant :
  139. - sentence : la phrase au format pattern sentence
  140. - correspondance : un index indiquant les correspondances avec la phrase précédente'''
  141. # liste des phrases avant traitement
  142. phrases_a_traiter = []
  143. # la liste à retourner
  144. phrases_traitees = []
  145. # si on a bien un fichier
  146. if ( fichier != False ):
  147. # on lit les lignes
  148. lignes = fichier.readlines()
  149. # on ferme le fichier
  150. fichier.close()
  151. compteur_mots = 0;
  152. # pour chaque ligne
  153. for ligne in lignes:
  154. # on parse
  155. texte_traite = parse( ligne )
  156. # on sépare les phrases
  157. phrases_dans_la_ligne = split( texte_traite )
  158. # on ajoute les phrases de la ligne à la liste générale
  159. for phrase in phrases_dans_la_ligne:
  160. phrases_a_traiter.append ( phrase )
  161. # pour chaque phrase, on traite
  162. for i in range( len( phrases_a_traiter ) ):
  163. phrase_precedente = False
  164. if ( i > 0 ):
  165. phrase_precedente = phrases_a_traiter[ i - 1 ]
  166. phrases_traitees.append( traiter_phrase( phrases_a_traiter[i], phrase_precedente, compteur_mots ) )
  167. compteur_mots += len( phrases_a_traiter[i] )
  168. # for i in range( len( phrases_dans_la_ligne) ) :
  169. # compteur_phrases++
  170. # phrase_precedente = False
  171. # print('---')
  172. # print( 'i :' + str(i))
  173. # if ( compteur_phrases > 0 ):
  174. # phrase_precedente = phrases_dans_la_ligne[ i - 1 ]
  175. # phrases.append( traiter_phrase( phrases_dans_la_ligne[i], phrase_precedente ) )
  176. #print ('len' + str(len(phrases)))
  177. #for i in range( len( phrases) ):
  178. #print i
  179. #liste[i] = phrase_vers_liste( phrases[i] )
  180. #print str(phrases[i].__dict__.keys())
  181. #for mot in phrases[i].words:
  182. # print mot.string
  183. # print str(mot) + str( mot.__dict__.keys() )
  184. #print( '---' )
  185. #print(liste)
  186. #print( index_correspondances( liste[0], liste[1] ))
  187. #for lexeme in split( texte_traite )
  188. # on ajoute à la liste à retourner
  189. #liste_phrases.insert( len(liste_phrases), phrases )
  190. # on retourne la liste
  191. #return liste_phrases
  192. # print phrases
  193. # mots_des_phrases = len( phrases ) * [None]
  194. # for i in range( len( phrases ) ):
  195. # mots_des_phrases[i] = phrase_vers_liste( phrases[i] )
  196. # print( index_correspondances( mots_des_phrases[0], mots_des_phrases[i] ) )
  197. # return sortie
  198. return phrases_traitees
  199. def generer_graphe ( data ):
  200. '''génère le graphe à partir des données'''
  201. compteur_mots = 0 # pour les id des noeuds
  202. for p in range( len( data ) ):
  203. for m in range( len( data[p]['sentence'].words ) ):
  204. compteur_mots += 1
  205. id = compteur_mots
  206. a = data[p]['correspondances'][m]
  207. print a
  208. #if ( data[p]['correspondances'][m] != False ) :
  209. # id = data[p]['correspondances'][m][1]
  210. #print id
  211. # print( str(p) + ':' + str(m) + ' : ' + str( compteur_mots ) + ' mots.' )
  212. def main ():
  213. ''''''
  214. elements = traiter_fichier( fichier )
  215. print elements
  216. generer_graphe( elements )
  217. # for e in elements:
  218. # print('---')
  219. # for i in e:
  220. # print('>')
  221. # print(i)
  222. # construction = {
  223. # 'ligne precedente': False,
  224. # 'lignes a traiter': False,
  225. # 'lignes traitees': False,
  226. # }
  227. #
  228. # if ( fichier != False ):
  229. # construction['lignes a traiter'] = fichier.readlines()
  230. # fichier.close()
  231. # # fichiers.exporter( lignes )
  232. # for i in range(len( construction['lignes a traiter'] )):
  233. # #traiter_ligne( ligne )
  234. # print i
  235. # construction['lignes a traiter'][i] = '_'
  236. # print construction['lignes a traiter']
  237. main()