Deviner la langue d’un texte#
Comment deviner la langue d’un texte sans savoir lire la langue ? Ce notebook aborde les dictionnaires, les fichiers et les graphiques.
L’objectif est de distinguer un texte anglais d’un texte français sans avoir à le lire. Le premier réflexe consisterait à chercher la présence de mots typiquement anglais ou français. Cette direction est sans doute un bon choix lorsque le texte considéré est une oeuvre littéraire. Mais sur Internet, les contenus mélangent fréquemment les deux langues : la présence de tel mot anglais n’est plus aussi discriminante. Il n’est plus aussi évident d’étiqueter un document de langue anglaise lorsque les mots anglais sont présents partout.
On ne cherche plus à déterminer la langue d’un texte mais plutôt la langue majoritaire. Il serait encore possible de compter les mots de chacune des langues à l’aide d’un dictionnaire réduit de mots anglais et français. La langue majoritaire correspondrait à celle dont les mots sont les plus fréquents. Mais construire un dictionnaire est d’abord fastidieux. Ensuite, il faudrait que celui-ci contienne des mots présents dans la plupart des textes. Il faudrait aussi étudier le problème des mots communs aux deux langues. Pour ces raisons, il paraît préférable d’étudier d’abord une direction plus simple quitte à y revenir plus tard.
Cette idée plus simple consiste à compter la fréquence des lettres. On s’attend à ce que certaines lettres soient plus fréquentes dans un texte anglais que dans un texte français.
Q1 : lire un fichier#
On commence par télécharger un texte sur le site Gutenberg et on écrit un programme pour le lire.
[1]:
def read_file(filename):
# ...
return something
Q2 : histogramme#
Construire un histogramme comptant les occurrences de chaque lettre dans ce texte. C’est-à-dire écrire une fonction qui prend comme argument une chaîne de caractères et qui retourne un dictionnaire dont vous choisirez ce que seront les clés et les valeurs.
[2]:
def histogram(texte):
# ...
return something
Q3 : normalisation#
Un texte inconnu contient 10 lettres I
. Que pouvez-vous en conclure ? Pensez-vous que les fréquences de la lettre I
dans un texte long et dans un texte court soient comparables ? Ecrire une fonction qui normalise toutes les valeurs du dictionnaire à un.
[3]:
def normalize(hist):
# ...
return something
Q4 : calcul#
Appliquer votre fonction à un texte anglais et à un autre français, … Que suggérez-vous comme indicateur pour distinguer un texte français d’un texte anglais ? Calculer votre indicateur pour dix textes de chaque langue. On pourra prendre les dix textes suivants : articles.zip.
[7]:
from teachpyx.tools.data_helper import download_and_unzip
url = "https://github.com/sdpython/teachpyx/raw/td/_data/articles.zip"
texts = download_and_unzip(url)
texts[:5]
[7]:
['./afp1.txt',
'./afp2.txt',
'./arthur_charpentier1.txt',
'./arthur_charpentier2.txt',
'./arthur_charpentier3.txt']
Q5 : score#
Le score est ici un nombre unique généré à partir des documents. Admettons que nous disposons de deux scores, la fréquence de la lettre E
et celle de la lettre W
, comment les combiner pour obtenir un score meilleur que les deux pris séparément ? Ce problème s’inscrit dans un problème plus général de classification. Il s’agit de déterminer un score, un indicateur numérique capable de déterminer automatiquement la langue d’un texte sans
avoir à le lire. Ces indicateurs ne sont pas infaillibles, il sera toujours possible de le duper particulièrement sur des petits textes mais cela ne veut pas dire que ce score ne pourrait pas être utilisé pour estimer de façon grossière la quantité de pages internet dans chaque langue.
[ ]: