Teaching - 3i005


3i005 : Statistiques et Informatique

Rappel des consignes de base:

  • Calculer les entropies des différentes langues en unigrammes et bigrammes
  • Etudier l'évolution de la taille des dictionnaires en fonction de la taille des N-grammes considérés
  • Construire un classifieur de langues basé sur l'entropie

Explorations possibles (liste non-exhaustive !):

  • Influence des majuscules, espaces... Sur le calcul de l'entropie et sur les classifieurs
  • Comparaison des performances en classification pour différents protocoles/pré-traitements
  • Tracés des distributions de lettres pour plusieurs langues
  • Approche itérative de suppression des caractères du dictionnaire pour maximiser l'entropie: étude des performances en classification pour différents sous-dictionnaires

Ouverture du fichier en UTF8 et élimination des caractères spéciaux spécifiques à chaque langue

import codecs
import unicodedata
with codecs.open(fn,encoding="utf-8") as f:
        s=f.read()
s=unicodedata.normalize("NFKD",s).encode("ascii","ignore")

Substitution des caractères

import string
table=string.maketrans("abc","bcd") #table des correspondances
#a -> b, b->c , c->d
s=string.translate(s,table,"z")

Expression régulières

import re
re = re.sub("\s"," ",re.sub("\s(?=\s)"," ",s))

Liste des bibliothèques pouvant être utiles (à importer) pour se simplifier la vie:

import numpy as  np
import codecs
import matplotlib.pyplot as plt
import unicodedata
import re
from collections import Counter,defaultdict
import os
import string

Mix des instructions précédentes pour un chargements sans soucis


import numpy as  np
import codecs
import matplotlib.pyplot as plt
import unicodedata
import re
from collections import Counter,defaultdict
import os
import string

# Etape 1: lecture d'un fichier (revoie le contenu)
def read_file(fn):
    with codecs.open(fn,encoding="utf-8") as f:
        return f.read()

# Etape 2: se focaliser sur les caractères qui nous intéressent = preprocessing
def preprocess(s):
    table =string.maketrans(string.punctuation, ' '*len(string.punctuation))
    #table =string.maketrans(string.punctuation + string.digits, ' '*(len(string.punctuation)+len(string.digits)))
    s = string.translate(unicodedata.normalize("NFKD",s).encode("ascii","ignore"),table).lower()
    return re.sub("\s"," ",re.sub("\s(?=\s)"," ",s))

# Etape 3: compter les mots dans une chaine "propre"
def count_ngrams(s,n=2,dic=None):
    if dic is None: # init par defaut du dictionnaire
        dic=Counter()
    for i in range(len(s)): # double boucle paramétrique pour compter les n-gram
        for j in range(i+1,min(i+n+1,len(s))):
            # TODO : commande à ajouter pour compter
    return dic

# Etape 4: charger l'ensemble d'un repertoire (pour faire un dictionnaire)
def process_dir(path,n=2):
    res = None
    for l in os.listdir(path):
        if l[-3:]!="txt": # termine par txt
            continue
        print("treating %s" % (l,))
        res = count_ngrams(preprocess(read_file(os.path.join(path,l))),n,res)
    return res


prefix = "txts/"
lang = ["fr/","ge/","en/"]

res = process_dir(prefix+lang[0],n=2)

# suppression des ' '
# res.pop(' ')