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
# coding: utf-8
# --------BAO3 Version: Python-RegEx----------------
# Le programme prend en entrée :
# 1. le nom du fichier de sortie Talismane issu de BAO2
# 2. le patron cible
# Le programme construit en sortie :
# 1. un fichier texte brut avec des formes classees et triees
# Ce script est lancé de la manière suivante
# python3 BAO3.py
# >>> nomDufichier
# >>> NOM/ADJ
# ---------------------------------------

from re import findall

# ex. sortie_talismane_3208
filename = input('Saisissez un fichier de sortie Talismane:\n> ')
# ex. NOM/ADJ 
patterns = input('Saisissez les patrons (séparés par un /):\n> ')

# on récupère les patrons saisis
patterns_list_input = patterns.split('/')
# on nettoie les saisies pour corriger les potentielles erreurs de frappe
patterns_list = list(map(lambda x: findall(r'\w+', x), patterns_list_input))

# on initialise les deux dictionnaires
patterns_dico = {}
patrons_dico = {}

for pattern in patterns_list:
    patrons_dico[' '.join(pattern)] = []
    try:
        # s'il existe déjà un patron qui commence par le même POS tag, on met à jour la liste
        patterns_dico[pattern[0]].append(pattern)
    except KeyError:
        # sinon on crée une entrée
        patterns_dico[pattern[0]] = [pattern]

# on récupère le contenu du fichier
with open(filename, 'r', encoding='utf-8', newline='\n') as fichier:
    contenu = fichier.read()

# on sépare les phrases 
sentence_list = contenu.split('\n\n')
sentence_list.pop()

# on traite phrase par phrase
for sentence in sentence_list:
    lines = sentence.split('\n')
    # on filtre les commentaires
    words = list(filter(lambda x: x and x.startswith("#") is False, lines))

    # on ignore les phrases à un token
    if len(words) == 1:
        continue
        
    # on génère les listes de tokens et de tags
    tokens = []
    tags = []
    
    # on lit chaque ligne de tableau et on récupère les champs qui nous intéressent
    for word in words:
        champs = word.split('\t')
        tokens.append(champs[1])
        tags.append(champs[3])
    
    # on parcourt la liste de tags
    for i, tag in enumerate(tags):
        
        # pour chaque tag, on regarde s'il est présent dans la liste des POS tags initiaux des patrons
        if tag in patterns_dico.keys():
            # si oui on récupère les patrons correspondants
            pat_list = patterns_dico[tag]
            
            # pour chaque patron on calcule sa longueur et on choppe une suite de même longueur dans tags 
            for ele in pat_list:
                pat_leng = len(ele)
                
                # si le patron est identique à la suite, on récupère le n-gram et on l'ajoute dans le dictionnaire
                if tags[i:i+pat_leng] == ele:
                    n_gram = ' '.join(tokens[i:i+pat_leng])
                    key = ' '.join(ele)
                    patrons_dico[key].append(n_gram)

# on ouvre le fichier de sortie
with open('sortie_non_trie.txt', 'w', encoding='utf-8', newline='\n') as sortie:
    # on parcourt le dictionnaire
    for pattern, patrons in patrons_dico.items():
        for patron in patrons:
            # on écrit les patrons
            sortie.write(patron + '\n')
					
# on initialise le compteur
# à noter qu'il compte le nombre total des patrons trouvés, sans distinction entre les patterns
countresult = 0

# pour chaque entrée dans patrons_dico
for pattern, patrons in patrons_dico.items():
    # on inisitalise un dictionnaire temporaire
    tmp = {}
    for patron in patrons:
        # on compte le nombre d'occurrences de chaque patron
        try:
            tmp[patron] += 1
        except KeyError:
            tmp[patron] = 1

    # on trie les entrées
    tmplist = sorted(tmp.items(), key=lambda x: x[1], reverse=True)
    # on met à jour le compteur
    countresult += len(patrons)
    # on met à jour le dictionnaire
    patrons_dico[pattern] = tmplist

# on écrit le résultat dans un fichier
with open('sortie_trie.txt', 'w', encoding='utf-8', newline='\n') as sortie:
    sortie.write('{} éléments trouvés\n'.format(countresult))
    for pattern, patrons in patrons_dico.items():
        sortie.write("Type de pattern: {}\n\n".format(pattern))
        tmp = list(map(lambda x: sortie.write("{0}\t{1}\n".format(x[1], x[0])), patrons))
        sortie.write('\n\n')