import re
import math

def lire_phrases(nom_fichier):
    phrases = None
    with open(nom_fichier, 'r', encoding="utf8") as fichier:
        contenu = fichier.read()
        print("Ouverture du fichier", nom_fichier, "réussie. ", len(contenu), "caractères lus.")
        # Passe tout en minuscules
        contenu = contenu.lower()
        # Efface certains caractères du texte
        contenu = re.sub('[\n\"\'\\-\\,:;\\(\\)\\_«»]', ' ', contenu)
        # Efface les espaces superflus
        contenu = re.sub(' +', ' ', contenu)
        # Enleve les accents de la langue française
        contenu = re.sub('[éèê]', 'e', contenu)
        contenu = re.sub('[àâ]', 'a', contenu)
        contenu = re.sub('ô', 'o', contenu)
        contenu = re.sub('ù', 'u', contenu)
        contenu = re.sub('î', 'i', contenu)
        contenu = re.sub('ç', 'c', contenu)

        # Coupe le texte en phrases selon le caractère . ! ou ?
        phrases = re.split('[\\.\\?!]', contenu)
        # Efface les espaces en trop au debut et a la fin
        phrases = [p.strip() for p in phrases if len(p) > 5]
        fichier.close()
    return phrases


p1 = lire_phrases('miserables.txt')
p2 = lire_phrases('scarlet.txt')
print("Le corpus français contient", len(p1), "phrases")
print("Le corpus anglais contient", len(p2), "phrases")
alpha = "abcdefghijklmnopqrstuvwxyz"

def bigramme(phrase):
    dictionnaire = {(u,v): 0 for u in alpha for v in alpha}
    n = len(phrase)
    for i in range(n-1):
        if phrase[i] in alpha and phrase[i+1] in alpha:
            dictionnaire[phrase[i], phrase[i+1]] += 1
    return dictionnaire

def dist(b1, b2):
    d = 0
    for u in alpha:
        for v in alpha:
            d += (b1[u,v] - b2[u, v]) ** 2
    return d

def plusprochevoisin(phrase, p1, p2):
    d = float("inf")
    ppv = None
    langue = None
    bcible = bigramme(phrase)
    for s in p1:
        b = bigramme(s)
        d2 = dist(bcible, b)
        if d2 < d:
            d = d2
            ppv = s
            langue = 1
    for s in p2:
        b = bigramme(s)
        d2 = dist(bcible, b)
        if d2 < d:
            d = d2
            ppv = s
            langue = 2
    return (d, ppv, langue)

# s = input("Entrez une phrase : ")
# print(plusprochevoisin(s, p1, p2))

import random
def extraire(l, n):
    q = random.sample(l, n)
    r = [phrase for phrase in l if phrase not in q]
    return q, r
    
n = 100
q1, r1 = extraire(p1, n)
q2, r2 = extraire(p2, n)

import numpy as np
M = np.zeros((2,2))
for i, phrase in enumerate(q1):
    d, ppv, langue = plusprochevoisin(phrase, r1, r2)
    if langue == 1:
        print("Classification n°", i, ":", phrase, " - français")
    else:
        print("Classification n°", i, ":", phrase, " - anglais")
    M[0,langue-1] += 1
for i, phrase in enumerate(q2):
    d, ppv, langue = plusprochevoisin(phrase, r1, r2)
    if langue == 1:
        print("Classification n°", i, ":", phrase, " - français")
    else:
        print("Classification n°", i, ":", phrase, " - anglais")
    M[1,langue-1] += 1
print("Matrice de confusion :")
print(M)
