reformulation
un seul mot a été ajouté/supprimé/modifiéunknown
python
2 years ago
8.2 kB
4
Indexable
import pyexcel from Levenshtein import ratio as levenshtein_ratio def verif_langue(entree_actuelle, entree_suivante, lexiqueFR, lexiqueEN): # Calculer le nombre de mots dans chaque entrée nb_mots_actuelle = len(entree_actuelle) nb_mots_suivante = len(entree_suivante) # Calculer le nombre de mots en français ou en anglais pour chaque entrée nb_fr_actuelle = sum(1 for mot in entree_actuelle if mot in lexiqueFR) nb_en_actuelle = sum(1 for mot in entree_actuelle if mot in lexiqueEN) nb_fr_suivante = sum(1 for mot in entree_suivante if mot in lexiqueFR) nb_en_suivante = sum(1 for mot in entree_suivante if mot in lexiqueEN) # Vérifier si 60% des mots dans entree_actuelle et entree_suivante sont en français if nb_fr_actuelle/nb_mots_actuelle >= 0.6 and nb_fr_suivante/nb_mots_suivante >= 0.6: return "fr" # Vérifier si 60% des mots dans entree_actuelle et entree_suivante sont en anglais elif nb_en_actuelle/nb_mots_actuelle >= 0.6 and nb_en_suivante/nb_mots_suivante >= 0.6: return "en" else: return "mixte" def classer_requete(requete, stop_words): mots = [mot for mot in ' '.join(requete).split() if mot.lower() not in stop_words] nb_mots = len(mots) if nb_mots <= 2: return "courte" elif nb_mots <= 4: return "moyenne" else: return "longue" def position_modification(mot_modifie, entree_actuelle): mots_entree_actuelle = list(entree_actuelle) #print(mot_modifie, "-->", mots_entree_actuelle) if mot_modifie == mots_entree_actuelle[0]: return "au début" elif mot_modifie == mots_entree_actuelle[-1]: return "à la fin" else: return "au milieu" fichier_lexiqueFR = open ("/usr/share/dict/french", mode="r") lexiqueFR=set() for mot in fichier_lexiqueFR: mot=mot.rstrip("\n") lexiqueFR.add(mot) fichier_lexiqueFR.close() fichier_lexique_uk = open("/usr/share/dict/british-english", mode="r") fichier_lexique_us = open("/usr/share/dict/american-english", mode="r") lexiqueEN = set() for mot in fichier_lexique_uk: mot = mot.rstrip("\n") lexiqueEN.add(mot) for mot in fichier_lexique_us: mot = mot.rstrip("\n") lexiqueEN.add(mot) fichier_lexique_uk.close() fichier_lexique_us.close() with open('stoplist.txt', 'r') as stop_file: stop_words = set([line.strip() for line in stop_file]) # Récupérer les données depuis le fichier ods donnees = pyexcel.get_sheet(file_name='CoSTQueries.ods') # Ouvrir le fichier de sortie en mode écriture fichier = open('output.tsv', 'w') # Parcourir les lignes de données for ligne in range(1, donnees.number_of_rows() - 1): # Récupérer l'entrée actuelle et l'entrée suivante entree_actuelle = set(donnees[ligne, 2].split()) entree_suivante = set(donnees[ligne+1, 2].split()) # Convertir les entrées en minuscule entree_actuelle = set([mot.lower() for mot in entree_actuelle]) entree_suivante = set([mot.lower() for mot in entree_suivante]) # Récupérer la tâche tache = donnees[ligne, 3] # Vérifier si la tâche ne contient pas "Med" if "Med" not in tache: # Vérifier si l'entrée actuelle et l'entrée suivante ont chacune au moins deux mots if len(entree_actuelle) >= 2 and len(entree_suivante) >= 2: # Initialiser les variables de différence de mots nombre_diff = 0 mots_ajoutes = "" mots_supprimes = "" mots_modifies = [] # Parcourir les mots de l'entrée actuelle for mot in entree_actuelle: # Ignorer stop words if mot in stop_words: continue # Vérifier si le mot est présent dans l'entrée suivante if mot not in entree_suivante: # Levenshtein ratio ratio_max = 0 for suivant_mot in entree_suivante: ratio = levenshtein_ratio(mot, suivant_mot) if ratio > ratio_max: ratio_max = ratio if ratio_max < 0.75: # Incrémenter le nombre de différences nombre_diff += 1 # Vérifier si le nombre de différences est supérieur à 2 if nombre_diff > 2: break # Ajouter les mots modifiés, ajoutés et supprimés dans les variables correspondantes mots_supprimes += (mot + " ") mots_modifies.append(mot + " ") # Parcourir les mots de l'entrée suivante pour chercher les mots ajoutés for mot in entree_suivante: # Ignorer stop words if mot in stop_words: continue # Vérifier si le mot est présent dans l'entrée actuelle if mot not in entree_actuelle: # Levenshtein ratio ratio_max = 0 for actuel_mot in entree_actuelle: ratio = levenshtein_ratio(mot, actuel_mot) if ratio > ratio_max: ratio_max = ratio if ratio_max < 0.75: # Incrémenter le nombre de différences nombre_diff += 1 # Vérifier si le nombre de différences est supérieur à 2 if nombre_diff > 2: break # Ajouter les mots ajoutés et modifiés dans les variables correspondantes mots_ajoutes += (mot + " ") mots_modifies.append(mot + " ") # Vérifier si le nombre de différences est égal à 1 if nombre_diff == 1: # Vérifier si l'entrée actuelle a plus de mots que l'entrée suivante if len(entree_actuelle) > len(entree_suivante): # Écrire les entrées dans le fichier de sortie fichier.write(donnees[ligne, 2] + '\t' + donnees[ligne+1, 2] + '\t') fichier.write('supprimé\t' + mots_supprimes.strip()+ '\t' + verif_langue(entree_actuelle, entree_suivante, lexiqueFR, lexiqueEN)+ \ '\t' + classer_requete(entree_actuelle, stop_words) + '\t' + position_modification(mots_supprimes.strip(), entree_actuelle) + '\n') # Vérifier si l'entrée actuelle a moins de mots que l'entrée suivante elif len(entree_actuelle) < len(entree_suivante): fichier.write(donnees[ligne, 2] + '\t' + donnees[ligne+1, 2] + '\t') fichier.write('ajouté\t' + mots_ajoutes.strip()+ '\t' + verif_langue(entree_actuelle, entree_suivante, lexiqueFR, lexiqueEN)+ \ '\t'+ classer_requete(entree_actuelle, stop_words) + '\t' + position_modification(mots_ajoutes.strip(), entree_suivante) +'\n') # Vérifier s'il y a des mots modifiés elif nombre_diff == 2 and len(entree_actuelle.difference(entree_suivante)) == 1 and len(entree_suivante.difference(entree_actuelle)) == 1: fichier.write(donnees[ligne, 2] + '\t' + donnees[ligne+1, 2] + '\t') fichier.write('modifié\t' + entree_actuelle.difference(entree_suivante).pop() + ' --> ' + entree_suivante.difference(entree_actuelle).pop()+ '\t' + \ verif_langue(entree_actuelle, entree_suivante, lexiqueFR, lexiqueEN)+ '\t' + classer_requete(entree_actuelle, stop_words) + \ '\t' + position_modification(entree_suivante.difference(entree_actuelle).pop(), entree_suivante) +'\n') fichier.close() print("Traitement terminé !")
Editor is loading...