<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bouvier</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bouvier"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Bouvier"/>
	<updated>2026-04-16T16:07:39Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10328</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10328"/>
		<updated>2018-05-26T18:23:08Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore &#039;&#039;data mining&#039;&#039;, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentations graphiques qui permettent de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage &#039;&#039;« Exercices de style »&#039;&#039; de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraires et de mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un fichier contenant tous les textes du corpus sera disponible en annexe.&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de ligne ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de textes doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes ceux-ci ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier) et écrira le texte modifié dans un nouveau fichier nommé &amp;lt;code&amp;gt;&amp;quot;modif{:03}.txt&amp;quot;.format(i)&amp;lt;/code&amp;gt; . Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau (disponible en annexe). En utilisant la commande &amp;lt;code&amp;gt;len(stocke_mots_dossier(dossier))&amp;lt;/code&amp;gt;, on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils (disponible en annexe) qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrences de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une procédure qui prend en paramètres le corpus de textes et un entier n et qui affiche la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette procédure nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une procédure similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour arguments un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle affichera la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (&#039;&#039;Term-Frequency&#039;&#039;) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF, tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (&#039;&#039;inverse document frequency&#039;&#039;) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;, autrement dit le mot doit se trouver dans au moins un texte du corpus)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en arguments un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment (dans l&#039;exemple, le nombre total de documents est de 3) :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » a le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Nous allons commencer par écrire une fonction qui permette de calculer l&#039;intégralité des TF de chaque mot, texte par texte. Pour cela, nous aurons besoin des fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_TF(fichier,mot)&amp;lt;/code&amp;gt; vues précédemment. Cette fonction devra prendre en argument un dossier de fichiers textes (le corpus de textes) et renverra une matrice rectangulaire qui contient sur chaque ligne le TF de chaque mot du corpus pour un texte donné. Le matrice devra donc avoir 100 lignes et 3774 colonnes et sera donc de la forme suivante :&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774  \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première ligne représentant le 1er texte, la deuxième le 2ème, etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tf_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
&lt;br /&gt;
    #Création de la matrice rectangulaire&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
        &lt;br /&gt;
    #Remplissage de la matrice rectangulaire&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        fichier = liste_fichiers[i]&lt;br /&gt;
        for j in range (len(liste_mots)) :&lt;br /&gt;
            mot = liste_mots[j]&lt;br /&gt;
            TF = calcul_TF(fichier,mot)&lt;br /&gt;
            mat[i][j] = TF&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice totale étant plutôt grande, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 5 &amp;amp; 1 &amp;amp; 3 &amp;amp; 1 &amp;amp; 10 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 2 &amp;amp; 0 &amp;amp; 5 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 8 &amp;amp; 0 &amp;amp; 9 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de construire une fonction qui permette d&#039;avoir l&#039;idf de chaque mot dans le corpus. Nous utiliserons donc les fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_idf(dossier,mot,nombre_docs)&amp;lt;/code&amp;gt;. Cette fonction a pour paramètre un dossier de fichiers textes (le corpus de textes) et renvoie un tableau qui contient l&#039;idf de chaque mot apparaissant dans le corpus (le corpus contenant 3774 mots différents, la longueur de ce tableau est de 3774).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def idf_par_mot(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #3774&lt;br /&gt;
    T = [0]*len(liste_mots)&lt;br /&gt;
    for i in range (len(T)):&lt;br /&gt;
        mot = liste_mots[i]&lt;br /&gt;
        idf = calcul_idf(dossier,mot,nombre_docs=100)&lt;br /&gt;
        T[i] = idf&lt;br /&gt;
    return T&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un aperçu du résultat obtenu pour les premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;, &amp;quot;voyageur&amp;quot;, &amp;quot;attend&amp;quot;, &amp;quot;bus&amp;quot;). Les résultats sont arrondis au centième:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 0.22 &amp;amp; 4.61 &amp;amp; 0.13 &amp;amp; 4.61 &amp;amp; 0.12 &amp;amp; 2.04 &amp;amp; 4.61 &amp;amp; 3.00 &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons la matrice des TF et le tableau des idf de chaque mot, nous pouvons créer une fonction qui calculera le TF-idf de chaque mot. Celle-ci prendra en argument un dossier contenant des fichiers textes (le corpus de textes) et renverra une matrice qui contiendra le TF-idf de chaque mot pour chaque texte et qui sera de la même taille (100x3774) et de la même forme que celle des TF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def matrice_TFidf(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation de la matrice finale&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
&lt;br /&gt;
    #Remplissage de la matrice finale&lt;br /&gt;
    matrice_TF = tf_par_texte(dossier)&lt;br /&gt;
    tableau_idf = idf_par_mot(dossier)&lt;br /&gt;
    for i in range (len(matrice_TF)):&lt;br /&gt;
        for j in range (len(matrice_TF[i])):&lt;br /&gt;
             mat[i][j] = ((matrice_TF[i][j])*(tableau_idf[j]))&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice finale étant trop grande pour apparaître ici, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes. Les résultats sont arrondis au centième :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 1.12 &amp;amp; 4.61 &amp;amp; 0.38 &amp;amp; 4.61 &amp;amp; 1.17 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 0.26 &amp;amp; 0.00 &amp;amp; 0.58 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 1.02 &amp;amp; 0.00 &amp;amp; 0.105 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les résultats n&#039;étant pas facilement visibles sous forme de matrice, on peut maintenant créer une procédure qui permettra de mieux les visualiser. Cette procédure prend en argument le corpus de textes et renvoie les 10 TF-idf les plus élevés de chaque texte du corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def Top10_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier)&lt;br /&gt;
    matrice = matrice_TFidf(dossier)&lt;br /&gt;
    for i in range (len(matrice)):&lt;br /&gt;
        print(&amp;quot;Texte {:03}&amp;quot;.format(i+1))&lt;br /&gt;
        for j in range (10):&lt;br /&gt;
            liste_TFidf = matrice[i]&lt;br /&gt;
            TFidf_max = max(liste_TFidf)&lt;br /&gt;
            position = liste_TFidf.index(TFidf_max)&lt;br /&gt;
            mot = liste_mots[position]&lt;br /&gt;
            print(&amp;quot;{:02}. Mot : {:30} TFidf = {:10}&amp;quot;.format(j+1,mot,str(TFidf_max)))&lt;br /&gt;
            matrice[i][position] = 0&lt;br /&gt;
        print(&amp;quot;\n \n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La liste étant relativement longue, elle sera disponible en annexe et les résultats de cette procédure pour quelques textes seront exploités dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certains textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
La liste des 10 TF-idf les plus élevés de chaque texte du corpus permet de mettre en avant les spécificités des différents textes.&lt;br /&gt;
&lt;br /&gt;
En effet, pour le texte 098, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 098&lt;br /&gt;
01. Mot : heu                            TFidf = 13.815510557964275&lt;br /&gt;
02. Mot : oh                             TFidf = 13.815510557964275&lt;br /&gt;
03. Mot : eh                             TFidf = 10.519673691959945&lt;br /&gt;
04. Mot : peuh                           TFidf = 7.824046010856292&lt;br /&gt;
05. Mot : ah                             TFidf = 7.013115794639964&lt;br /&gt;
06. Mot : tiens                          TFidf = 5.318520073865556&lt;br /&gt;
07. Mot : interjections                  TFidf = 4.605170185988092&lt;br /&gt;
08. Mot : psst                           TFidf = 4.605170185988092&lt;br /&gt;
09. Mot : hum                            TFidf = 4.605170185988092&lt;br /&gt;
10. Mot : ouf                            TFidf = 4.605170185988092&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette liste, on peut supposer que ce texte est écrit uniquement à l&#039;aide d&#039;« interjections », mot qui apparaît d&#039;ailleurs à la 7ème place. Cela peut donc donner une idée de comment le texte est écrit sans même avoir à le lire. En effet, si on lit le texte 98, on peut vérifier que nos suppositions sont vraies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Interjections.&lt;br /&gt;
Psst ! heu ! ah ! oh ! hum ! ah ! ouf ! eh ! tiens ! oh ! peuh ! pouah ! ouïe ! ou ! aïe ! eh ! hein ! heu ! pfuitt !&lt;br /&gt;
Tiens ! eh ! peuh ! oh ! heu ! bon !&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple, si on choisit le texte 045, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 045&lt;br /&gt;
01. Mot : scène                          TFidf = 23.472138032568875&lt;br /&gt;
02. Mot : premier                        TFidf = 14.026231589279927&lt;br /&gt;
03. Mot : acte                           TFidf = 13.815510557964275&lt;br /&gt;
04. Mot : drelin                         TFidf = 13.815510557964275&lt;br /&gt;
05. Mot : voyageur                       TFidf = 12.241324971159328&lt;br /&gt;
06. Mot : ii                             TFidf = 11.736069016284437&lt;br /&gt;
07. Mot : monnaie                        TFidf = 9.210340371976184&lt;br /&gt;
08. Mot : i                              TFidf = 8.987196820661973&lt;br /&gt;
09. Mot : second                         TFidf = 7.824046010856292&lt;br /&gt;
10. Mot : comédie                        TFidf = 7.824046010856292&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous remarquons plusieurs mots comme &amp;quot;scène&amp;quot;, &amp;quot;acte&amp;quot;, &amp;quot;ii&amp;quot;, &amp;quot;premier&amp;quot; qui se rapportent au vocabulaire utilisé dans les pièces de théâtre. Si on regarde le texte correspondant à cette liste, on peut voir que son titre est &amp;quot;comédie&amp;quot;, qui apparaît dans la liste à la 10ème position et qu&#039;il est effectivement écrit sous la forme d&#039;une pièce de théâtre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Comédie.&lt;br /&gt;
Acte premier&lt;br /&gt;
Scène I&lt;br /&gt;
(Sur la plate-forme arrière d&#039;un autobus S, un jour, vers midi.)&lt;br /&gt;
Le Receveur. -la monnaie, s&#039;iou plaît. (Des voyageurs lui passent la monnaie.)&lt;br /&gt;
Scène II&lt;br /&gt;
(L&#039;autobus s&#039;arrête.)&lt;br /&gt;
Le Receveur. - laissons descendre. Priorités ? Une priorité ! C&#039;est complet. Drelin, drelin, drelin.&lt;br /&gt;
Acte second&lt;br /&gt;
Scène I&lt;br /&gt;
(Même décor.)&lt;br /&gt;
Premier Voyageur (Jeune, long cou, une tresse autour du chapeau).&lt;br /&gt;
- On dirait, monsieur, que vous le faites exprès de me marcher sur les pieds chaque fois qu&#039;il passe des&lt;br /&gt;
gens. Second Voyageur (hausse les épaules)&lt;br /&gt;
Scène II&lt;br /&gt;
(Un troisième voyageur descend.)&lt;br /&gt;
Premier Voyageur (s&#039;adressant au public) : Chouette ! une place libre ! J&#039;y cours. (Il se précipite dessus et&lt;br /&gt;
l&#039;occupe.)&lt;br /&gt;
Acte troisième&lt;br /&gt;
Scène I&lt;br /&gt;
(La Cour de Rome.)&lt;br /&gt;
Un Jeune Élégant (au premier voyageur, maintenant piéton). -l&#039;échancrure de ton pardessus est trop&lt;br /&gt;
large. Tu devrais la fermer un peu en faisant remonter le bouton du haut.&lt;br /&gt;
Scène II&lt;br /&gt;
(À bord d&#039;un autobus S passant devant la cour de Rome.)&lt;br /&gt;
Quatrième Voyageur. -Tiens, le type qui se trouvait tout à l&#039;heure avec moi dans l&#039;autobus et qui&lt;br /&gt;
s&#039;engueulait avec un bonhomme. Curieuse rencontre. J&#039;en ferai une comédie en trois actes et en prose.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode des TF-idf permet donc bien de mettre en avant les différences qu&#039;il peut y avoir entre les textes.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Ici a été présentée la méthode des TF-idf car elle est puissante et que c&#039;est une technique fondamentale de la fouille de données, mais il existe de nombreuses autres méthodes qui peuvent permettent d&#039;arriver à des résultats différents selon les caractéristiques que l&#039;on souhaite mettre en avant. Il existe par exemple des variantes du TF-idf qui permettent de mieux gérer les cas où les textes du corpus ont des tailles extrêmement différentes les uns des autres ou encore les techniques de LDA qui permettent d&#039;extraire automatiquement les thématiques d&#039;un corpus afin de construire des regroupements par thème.&lt;br /&gt;
&lt;br /&gt;
Page réalisée par Rémi Bouvier, étudiant en L1 CMI-Info (2017-2018), dans le cadre du cours de VISI201.&lt;br /&gt;
&lt;br /&gt;
Tuteur : Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediafire.com/file/xafo0xzc49ba6va/Exercices_de_style.txt Textes du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/ni07ftjd3w0bn9c/Liste_mots_corpus.txt Liste des mots du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/riboz97iahtehoe/Liste_mots-outils.txt Liste des mots-outils] inspirée de [https://www.ranks.nl/stopwords/french cette liste].&lt;br /&gt;
* [http://www.mediafire.com/file/gzd435ccm3m04wc/50_mots_premi%C3%A8re_approche.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/8tb1n5gktqt3d8j/50_mots_premi%C3%A8re_approche_sans_mots_outils.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus sans mots-outils]&lt;br /&gt;
* [http://www.mediafire.com/file/749cfscgnsh7n0k/50_premiers_TFidf.txt/file Top 50 des mots ayant le TFidf le plus élevé]&lt;br /&gt;
* [http://www.mediafire.com/file/k5n5n8nwpca52s6/Top10_TF_IDF_par_texte.txt/file Top 10 des TFidf les plus élevés pour chaque texte]&lt;br /&gt;
* [http://www.mediafire.com/file/07argu9or5ruu6r/code_python.py Code python complet]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia :&lt;br /&gt;
&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es Exploration de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Analyse_des_donn%C3%A9es Analyse de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/TF-IDF TF-IDF]&lt;br /&gt;
&lt;br /&gt;
Livre :&lt;br /&gt;
* &#039;&#039;&amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot;&#039;&#039; de Amini et Gaussier aux éditions Eyrolles.&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10327</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10327"/>
		<updated>2018-05-26T18:18:36Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : Ajout de 2 annexes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore &#039;&#039;data mining&#039;&#039;, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentations graphiques qui permettent de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage &#039;&#039;« Exercices de style »&#039;&#039; de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraires et de mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un fichier contenant tous les textes du corpus sera disponible en annexe.&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de ligne ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de textes doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes ceux-ci ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier) et écrira le texte modifié dans un nouveau fichier nommé &amp;lt;code&amp;gt;&amp;quot;modif{:03}.txt&amp;quot;.format(i)&amp;lt;/code&amp;gt; . Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau (disponible en annexe). En utilisant la commande &amp;lt;code&amp;gt;len(stocke_mots_dossier(dossier))&amp;lt;/code&amp;gt;, on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils (disponible en annexe) qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrences de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une procédure qui prend en paramètres le corpus de textes et un entier n et qui affiche la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette procédure nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une procédure similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour arguments un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle affichera la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (&#039;&#039;Term-Frequency&#039;&#039;) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF, tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (&#039;&#039;inverse document frequency&#039;&#039;) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;, autrement dit le mot doit se trouver dans au moins un texte du corpus)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en arguments un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment (dans l&#039;exemple, le nombre total de documents est de 3) :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » a le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Nous allons commencer par écrire une fonction qui permette de calculer l&#039;intégralité des TF de chaque mot, texte par texte. Pour cela, nous aurons besoin des fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_TF(fichier,mot)&amp;lt;/code&amp;gt; vues précédemment. Cette fonction devra prendre en argument un dossier de fichiers textes (le corpus de textes) et renverra une matrice rectangulaire qui contient sur chaque ligne le TF de chaque mot du corpus pour un texte donné. Le matrice devra donc avoir 100 lignes et 3774 colonnes et sera donc de la forme suivante :&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774  \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première ligne représentant le 1er texte, la deuxième le 2ème, etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tf_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
&lt;br /&gt;
    #Création de la matrice rectangulaire&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
        &lt;br /&gt;
    #Remplissage de la matrice rectangulaire&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        fichier = liste_fichiers[i]&lt;br /&gt;
        for j in range (len(liste_mots)) :&lt;br /&gt;
            mot = liste_mots[j]&lt;br /&gt;
            TF = calcul_TF(fichier,mot)&lt;br /&gt;
            mat[i][j] = TF&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice totale étant plutôt grande, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 5 &amp;amp; 1 &amp;amp; 3 &amp;amp; 1 &amp;amp; 10 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 2 &amp;amp; 0 &amp;amp; 5 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 8 &amp;amp; 0 &amp;amp; 9 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de construire une fonction qui permette d&#039;avoir l&#039;idf de chaque mot dans le corpus. Nous utiliserons donc les fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_idf(dossier,mot,nombre_docs)&amp;lt;/code&amp;gt;. Cette fonction a pour paramètre un dossier de fichiers textes (le corpus de textes) et renvoie un tableau qui contient l&#039;idf de chaque mot apparaissant dans le corpus (le corpus contenant 3774 mots différents, la longueur de ce tableau est de 3774).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def idf_par_mot(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #3774&lt;br /&gt;
    T = [0]*len(liste_mots)&lt;br /&gt;
    for i in range (len(T)):&lt;br /&gt;
        mot = liste_mots[i]&lt;br /&gt;
        idf = calcul_idf(dossier,mot,nombre_docs=100)&lt;br /&gt;
        T[i] = idf&lt;br /&gt;
    return T&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un aperçu du résultat obtenu pour les premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;, &amp;quot;voyageur&amp;quot;, &amp;quot;attend&amp;quot;, &amp;quot;bus&amp;quot;). Les résultats sont arrondis au centième:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 0.22 &amp;amp; 4.61 &amp;amp; 0.13 &amp;amp; 4.61 &amp;amp; 0.12 &amp;amp; 2.04 &amp;amp; 4.61 &amp;amp; 3.00 &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons la matrice des TF et le tableau des idf de chaque mot, nous pouvons créer une fonction qui calculera le TF-idf de chaque mot. Celle-ci prendra en argument un dossier contenant des fichiers textes (le corpus de textes) et renverra une matrice qui contiendra le TF-idf de chaque mot pour chaque texte et qui sera de la même taille (100x3774) et de la même forme que celle des TF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def matrice_TFidf(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation de la matrice finale&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
&lt;br /&gt;
    #Remplissage de la matrice finale&lt;br /&gt;
    matrice_TF = tf_par_texte(dossier)&lt;br /&gt;
    tableau_idf = idf_par_mot(dossier)&lt;br /&gt;
    for i in range (len(matrice_TF)):&lt;br /&gt;
        for j in range (len(matrice_TF[i])):&lt;br /&gt;
             mat[i][j] = ((matrice_TF[i][j])*(tableau_idf[j]))&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice finale étant trop grande pour apparaître ici, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes. Les résultats sont arrondis au centième :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 1.12 &amp;amp; 4.61 &amp;amp; 0.38 &amp;amp; 4.61 &amp;amp; 1.17 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 0.26 &amp;amp; 0.00 &amp;amp; 0.58 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 1.02 &amp;amp; 0.00 &amp;amp; 0.105 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les résultats n&#039;étant pas facilement visibles sous forme de matrice, on peut maintenant créer une procédure qui permettra de mieux les visualiser. Cette procédure prend en argument le corpus de textes et renvoie les 10 TF-idf les plus élevés de chaque texte du corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def Top10_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier)&lt;br /&gt;
    matrice = matrice_TFidf(dossier)&lt;br /&gt;
    for i in range (len(matrice)):&lt;br /&gt;
        print(&amp;quot;Texte {:03}&amp;quot;.format(i+1))&lt;br /&gt;
        for j in range (10):&lt;br /&gt;
            liste_TFidf = matrice[i]&lt;br /&gt;
            TFidf_max = max(liste_TFidf)&lt;br /&gt;
            position = liste_TFidf.index(TFidf_max)&lt;br /&gt;
            mot = liste_mots[position]&lt;br /&gt;
            print(&amp;quot;{:02}. Mot : {:30} TFidf = {:10}&amp;quot;.format(j+1,mot,str(TFidf_max)))&lt;br /&gt;
            matrice[i][position] = 0&lt;br /&gt;
        print(&amp;quot;\n \n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La liste étant relativement longue, elle sera disponible en annexe et les résultats de cette procédure pour quelques textes seront exploités dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certains textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
La liste des 10 TF-idf les plus élevés de chaque texte du corpus permet de mettre en avant les spécificités des différents textes.&lt;br /&gt;
&lt;br /&gt;
En effet, pour le texte 098, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 098&lt;br /&gt;
01. Mot : heu                            TFidf = 13.815510557964275&lt;br /&gt;
02. Mot : oh                             TFidf = 13.815510557964275&lt;br /&gt;
03. Mot : eh                             TFidf = 10.519673691959945&lt;br /&gt;
04. Mot : peuh                           TFidf = 7.824046010856292&lt;br /&gt;
05. Mot : ah                             TFidf = 7.013115794639964&lt;br /&gt;
06. Mot : tiens                          TFidf = 5.318520073865556&lt;br /&gt;
07. Mot : interjections                  TFidf = 4.605170185988092&lt;br /&gt;
08. Mot : psst                           TFidf = 4.605170185988092&lt;br /&gt;
09. Mot : hum                            TFidf = 4.605170185988092&lt;br /&gt;
10. Mot : ouf                            TFidf = 4.605170185988092&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette liste, on peut supposer que ce texte est écrit uniquement à l&#039;aide d&#039;« interjections », mot qui apparaît d&#039;ailleurs à la 7ème place. Cela peut donc donner une idée de comment le texte est écrit sans même avoir à le lire. En effet, si on lit le texte 98, on peut vérifier que nos suppositions sont vraies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Interjections.&lt;br /&gt;
Psst ! heu ! ah ! oh ! hum ! ah ! ouf ! eh ! tiens ! oh ! peuh ! pouah ! ouïe ! ou ! aïe ! eh ! hein ! heu ! pfuitt !&lt;br /&gt;
Tiens ! eh ! peuh ! oh ! heu ! bon !&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple, si on choisit le texte 045, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 045&lt;br /&gt;
01. Mot : scène                          TFidf = 23.472138032568875&lt;br /&gt;
02. Mot : premier                        TFidf = 14.026231589279927&lt;br /&gt;
03. Mot : acte                           TFidf = 13.815510557964275&lt;br /&gt;
04. Mot : drelin                         TFidf = 13.815510557964275&lt;br /&gt;
05. Mot : voyageur                       TFidf = 12.241324971159328&lt;br /&gt;
06. Mot : ii                             TFidf = 11.736069016284437&lt;br /&gt;
07. Mot : monnaie                        TFidf = 9.210340371976184&lt;br /&gt;
08. Mot : i                              TFidf = 8.987196820661973&lt;br /&gt;
09. Mot : second                         TFidf = 7.824046010856292&lt;br /&gt;
10. Mot : comédie                        TFidf = 7.824046010856292&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous remarquons plusieurs mots comme &amp;quot;scène&amp;quot;, &amp;quot;acte&amp;quot;, &amp;quot;ii&amp;quot;, &amp;quot;premier&amp;quot; qui se rapportent au vocabulaire utilisé dans les pièces de théâtre. Si on regarde le texte correspondant à cette liste, on peut voir que son titre est &amp;quot;comédie&amp;quot;, qui apparaît dans la liste à la 10ème position et qu&#039;il est effectivement écrit sous la forme d&#039;une pièce de théâtre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Comédie.&lt;br /&gt;
Acte premier&lt;br /&gt;
Scène I&lt;br /&gt;
(Sur la plate-forme arrière d&#039;un autobus S, un jour, vers midi.)&lt;br /&gt;
Le Receveur. -la monnaie, s&#039;iou plaît. (Des voyageurs lui passent la monnaie.)&lt;br /&gt;
Scène II&lt;br /&gt;
(L&#039;autobus s&#039;arrête.)&lt;br /&gt;
Le Receveur. - laissons descendre. Priorités ? Une priorité ! C&#039;est complet. Drelin, drelin, drelin.&lt;br /&gt;
Acte second&lt;br /&gt;
Scène I&lt;br /&gt;
(Même décor.)&lt;br /&gt;
Premier Voyageur (Jeune, long cou, une tresse autour du chapeau).&lt;br /&gt;
- On dirait, monsieur, que vous le faites exprès de me marcher sur les pieds chaque fois qu&#039;il passe des&lt;br /&gt;
gens. Second Voyageur (hausse les épaules)&lt;br /&gt;
Scène II&lt;br /&gt;
(Un troisième voyageur descend.)&lt;br /&gt;
Premier Voyageur (s&#039;adressant au public) : Chouette ! une place libre ! J&#039;y cours. (Il se précipite dessus et&lt;br /&gt;
l&#039;occupe.)&lt;br /&gt;
Acte troisième&lt;br /&gt;
Scène I&lt;br /&gt;
(La Cour de Rome.)&lt;br /&gt;
Un Jeune Élégant (au premier voyageur, maintenant piéton). -l&#039;échancrure de ton pardessus est trop&lt;br /&gt;
large. Tu devrais la fermer un peu en faisant remonter le bouton du haut.&lt;br /&gt;
Scène II&lt;br /&gt;
(À bord d&#039;un autobus S passant devant la cour de Rome.)&lt;br /&gt;
Quatrième Voyageur. -Tiens, le type qui se trouvait tout à l&#039;heure avec moi dans l&#039;autobus et qui&lt;br /&gt;
s&#039;engueulait avec un bonhomme. Curieuse rencontre. J&#039;en ferai une comédie en trois actes et en prose.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode des TF-idf permet donc bien de mettre en avant les différences qu&#039;il peut y avoir entre les textes.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Ici a été présentée la méthode des TF-idf car elle est puissante et que c&#039;est une technique fondamentale de la fouille de données, mais il existe de nombreuses autres méthodes qui peuvent permettent d&#039;arriver à des résultats différents selon les caractéristiques que l&#039;on souhaite mettre en avant. Il existe par exemple des variantes du TF-idf qui permettent de mieux gérer les cas où les textes du corpus ont des tailles extrêmement différentes les uns des autres ou encore les techniques de LDA qui permettent d&#039;extraire automatiquement les thématiques d&#039;un corpus afin de construire des regroupements par thème.&lt;br /&gt;
&lt;br /&gt;
Page réalisée par Rémi Bouvier, étudiant en L1 CMI-Info (2017-2018), dans le cadre du cours de VISI201.&lt;br /&gt;
&lt;br /&gt;
Tuteur : Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediafire.com/file/xafo0xzc49ba6va/Exercices_de_style.txt Textes du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/ni07ftjd3w0bn9c/Liste_mots_corpus.txt Liste des mots du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/riboz97iahtehoe/Liste_mots-outils.txt Liste des mots-outils] inspirée de [https://www.ranks.nl/stopwords/french cette liste].&lt;br /&gt;
* [http://www.mediafire.com/file/gzd435ccm3m04wc/50_mots_premi%C3%A8re_approche.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/8tb1n5gktqt3d8j/50_mots_premi%C3%A8re_approche_sans_mots_outils.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus sans mots-outils]&lt;br /&gt;
* [http://www.mediafire.com/file/749cfscgnsh7n0k/50_premiers_TFidf.txt/file Top 50 des mots avec le TFidf le plus élevé]&lt;br /&gt;
* [http://www.mediafire.com/file/k5n5n8nwpca52s6/Top10_TF_IDF_par_texte.txt/file Top 10 des TFidf pour chaque texte]&lt;br /&gt;
* [http://www.mediafire.com/file/07argu9or5ruu6r/code_python.py Code python complet]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia :&lt;br /&gt;
&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es Exploration de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Analyse_des_donn%C3%A9es Analyse de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/TF-IDF TF-IDF]&lt;br /&gt;
&lt;br /&gt;
Livre :&lt;br /&gt;
* &#039;&#039;&amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot;&#039;&#039; de Amini et Gaussier aux éditions Eyrolles.&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10273</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10273"/>
		<updated>2018-05-21T17:50:49Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore &#039;&#039;data mining&#039;&#039;, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentations graphiques qui permettent de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage &#039;&#039;« Exercices de style »&#039;&#039; de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraires et de mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un fichier contenant tous les textes du corpus sera disponible en annexe.&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de ligne ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de textes doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes ceux-ci ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier) et écrira le texte modifié dans un nouveau fichier nommé &amp;lt;code&amp;gt;modif{:03}.txt&amp;quot;.format(i)&amp;lt;/code&amp;gt; . Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau (disponible en annexe). En utilisant la commande &amp;lt;code&amp;gt;len(stocke_mots_dossier(dossier))&amp;lt;/code&amp;gt;, on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils (disponible en annexe) qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrences de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une procédure qui prend en paramètres le corpus de textes et un entier n et qui affiche la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette procédure nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une procédure similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour arguments un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle affichera la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (&#039;&#039;Term-Frequency&#039;&#039;) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF, tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (&#039;&#039;inverse document frequency&#039;&#039;) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;, autrement dit le mot doit se trouver dans au moins un texte du corpus)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en arguments un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment (dans l&#039;exemple, le nombre total de documents est de 3) :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » a le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Nous allons commencer par écrire une fonction qui permette de calculer l&#039;intégralité des TF de chaque mot, texte par texte. Pour cela, nous aurons besoin des fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_TF(fichier,mot)&amp;lt;/code&amp;gt; vues précédemment. Cette fonction devra prendre en argument un dossier de fichiers textes (le corpus de textes) et renverra une matrice rectangulaire qui contient sur chaque ligne le TF de chaque mot du corpus pour un texte donné. Le matrice devra donc avoir 100 lignes et 3774 colonnes et sera donc de la forme suivante :&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774  \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première ligne représentant le 1er texte, la deuxième le 2ème, etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tf_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
&lt;br /&gt;
    #Création de la matrice rectangulaire&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
        &lt;br /&gt;
    #Remplissage de la matrice rectangulaire&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        fichier = liste_fichiers[i]&lt;br /&gt;
        for j in range (len(liste_mots)) :&lt;br /&gt;
            mot = liste_mots[j]&lt;br /&gt;
            TF = calcul_TF(fichier,mot)&lt;br /&gt;
            mat[i][j] = TF&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice totale étant plutôt grande, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 5 &amp;amp; 1 &amp;amp; 3 &amp;amp; 1 &amp;amp; 10 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 2 &amp;amp; 0 &amp;amp; 5 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 8 &amp;amp; 0 &amp;amp; 9 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de construire une fonction qui permette d&#039;avoir l&#039;idf de chaque mot dans le corpus. Nous utiliserons donc les fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_idf(dossier,mot,nombre_docs)&amp;lt;/code&amp;gt;. Cette fonction a pour paramètre un dossier de fichiers textes (le corpus de textes) et renvoie un tableau qui contient l&#039;idf de chaque mot apparaissant dans le corpus (le corpus contenant 3774 mots différents, la longueur de ce tableau est de 3774).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def idf_par_mot(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #3774&lt;br /&gt;
    T = [0]*len(liste_mots)&lt;br /&gt;
    for i in range (len(T)):&lt;br /&gt;
        mot = liste_mots[i]&lt;br /&gt;
        idf = calcul_idf(dossier,mot,nombre_docs=100)&lt;br /&gt;
        T[i] = idf&lt;br /&gt;
    return T&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un aperçu du résultat obtenu pour les premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;, &amp;quot;voyageur&amp;quot;, &amp;quot;attend&amp;quot;, &amp;quot;bus&amp;quot;). Les résultats sont arrondis au centième:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 0.22 &amp;amp; 4.61 &amp;amp; 0.13 &amp;amp; 4.61 &amp;amp; 0.12 &amp;amp; 2.04 &amp;amp; 4.61 &amp;amp; 3.00 &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons la matrice des TF et le tableau des idf de chaque mot, nous pouvons créer une fonction qui calculera le TF-idf de chaque mot. Celle-ci prendra en argument un dossier contenant des fichiers textes (le corpus de textes) et renverra une matrice qui contiendra le TF-idf de chaque mot pour chaque texte et qui sera de la même taille (100x3774) et de la même forme que celle des TF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def matrice_TFidf(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation de la matrice finale&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
&lt;br /&gt;
    #Remplissage de la matrice finale&lt;br /&gt;
    matrice_TF = tf_par_texte(dossier)&lt;br /&gt;
    tableau_idf = idf_par_mot(dossier)&lt;br /&gt;
    for i in range (len(matrice_TF)):&lt;br /&gt;
        for j in range (len(matrice_TF[i])):&lt;br /&gt;
             mat[i][j] = ((matrice_TF[i][j])*(tableau_idf[j]))&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice finale étant trop grande pour apparaître ici, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes. Les résultats sont arrondis au centième :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 1.12 &amp;amp; 4.61 &amp;amp; 0.38 &amp;amp; 4.61 &amp;amp; 1.17 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 0.26 &amp;amp; 0.00 &amp;amp; 0.58 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 1.02 &amp;amp; 0.00 &amp;amp; 0.105 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les résultats n&#039;étant pas facilement visibles sous forme de matrice, on peut maintenant créer une procédure qui permettra de mieux les visualiser. Cette procédure prend en argument le corpus de textes et renvoie les 10 TF-idf les plus élevés de chaque texte du corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def Top10_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier)&lt;br /&gt;
    matrice = matrice_TFidf(dossier)&lt;br /&gt;
    for i in range (len(matrice)):&lt;br /&gt;
        print(&amp;quot;Texte {:03}&amp;quot;.format(i+1))&lt;br /&gt;
        for j in range (10):&lt;br /&gt;
            liste_TFidf = matrice[i]&lt;br /&gt;
            TFidf_max = max(liste_TFidf)&lt;br /&gt;
            position = liste_TFidf.index(TFidf_max)&lt;br /&gt;
            mot = liste_mots[position]&lt;br /&gt;
            print(&amp;quot;{:02}. Mot : {:30} TFidf = {:10}&amp;quot;.format(j+1,mot,str(TFidf_max)))&lt;br /&gt;
            matrice[i][position] = 0&lt;br /&gt;
        print(&amp;quot;\n \n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La liste étant relativement longue, elle sera disponible en annexe et les résultats de cette procédure pour quelques textes seront exploités dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certains textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
La liste des 10 TF-idf les plus élevés de chaque texte du corpus permet de mettre en avant les spécificités des différents textes.&lt;br /&gt;
&lt;br /&gt;
En effet, pour le texte 098, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 098&lt;br /&gt;
01. Mot : heu                            TFidf = 13.815510557964275&lt;br /&gt;
02. Mot : oh                             TFidf = 13.815510557964275&lt;br /&gt;
03. Mot : eh                             TFidf = 10.519673691959945&lt;br /&gt;
04. Mot : peuh                           TFidf = 7.824046010856292&lt;br /&gt;
05. Mot : ah                             TFidf = 7.013115794639964&lt;br /&gt;
06. Mot : tiens                          TFidf = 5.318520073865556&lt;br /&gt;
07. Mot : interjections                  TFidf = 4.605170185988092&lt;br /&gt;
08. Mot : psst                           TFidf = 4.605170185988092&lt;br /&gt;
09. Mot : hum                            TFidf = 4.605170185988092&lt;br /&gt;
10. Mot : ouf                            TFidf = 4.605170185988092&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette liste, on peut supposer que ce texte est écrit uniquement à l&#039;aide d&#039;« interjections », mot qui apparaît d&#039;ailleurs à la 7ème place. Cela peut donc donner une idée de comment le texte est écrit sans même avoir à le lire. En effet, si on lit le texte 98, on peut vérifier que nos suppositions sont vraies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Interjections.&lt;br /&gt;
Psst ! heu ! ah ! oh ! hum ! ah ! ouf ! eh ! tiens ! oh ! peuh ! pouah ! ouïe ! ou ! aïe ! eh ! hein ! heu ! pfuitt !&lt;br /&gt;
Tiens ! eh ! peuh ! oh ! heu ! bon !&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple, si on choisit le texte 045, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 045&lt;br /&gt;
01. Mot : scène                          TFidf = 23.472138032568875&lt;br /&gt;
02. Mot : premier                        TFidf = 14.026231589279927&lt;br /&gt;
03. Mot : acte                           TFidf = 13.815510557964275&lt;br /&gt;
04. Mot : drelin                         TFidf = 13.815510557964275&lt;br /&gt;
05. Mot : voyageur                       TFidf = 12.241324971159328&lt;br /&gt;
06. Mot : ii                             TFidf = 11.736069016284437&lt;br /&gt;
07. Mot : monnaie                        TFidf = 9.210340371976184&lt;br /&gt;
08. Mot : i                              TFidf = 8.987196820661973&lt;br /&gt;
09. Mot : second                         TFidf = 7.824046010856292&lt;br /&gt;
10. Mot : comédie                        TFidf = 7.824046010856292&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous remarquons plusieurs mots comme &amp;quot;scène&amp;quot;, &amp;quot;acte&amp;quot;, &amp;quot;ii&amp;quot;, &amp;quot;premier&amp;quot; qui se rapportent au vocabulaire utilisé dans les pièces de théâtre. Si on regarde le texte correspondant à cette liste, on peut voir que son titre est &amp;quot;comédie&amp;quot;, qui apparaît dans la liste à la 10ème position et qu&#039;il est effectivement écrit sous la forme d&#039;une pièce de théâtre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Comédie.&lt;br /&gt;
Acte premier&lt;br /&gt;
Scène I&lt;br /&gt;
(Sur la plate-forme arrière d&#039;un autobus S, un jour, vers midi.)&lt;br /&gt;
Le Receveur. -la monnaie, s&#039;iou plaît. (Des voyageurs lui passent la monnaie.)&lt;br /&gt;
Scène II&lt;br /&gt;
(L&#039;autobus s&#039;arrête.)&lt;br /&gt;
Le Receveur. - laissons descendre. Priorités ? Une priorité ! C&#039;est complet. Drelin, drelin, drelin.&lt;br /&gt;
Acte second&lt;br /&gt;
Scène I&lt;br /&gt;
(Même décor.)&lt;br /&gt;
Premier Voyageur (Jeune, long cou, une tresse autour du chapeau).&lt;br /&gt;
- On dirait, monsieur, que vous le faites exprès de me marcher sur les pieds chaque fois qu&#039;il passe des&lt;br /&gt;
gens. Second Voyageur (hausse les épaules)&lt;br /&gt;
Scène II&lt;br /&gt;
(Un troisième voyageur descend.)&lt;br /&gt;
Premier Voyageur (s&#039;adressant au public) : Chouette ! une place libre ! J&#039;y cours. (Il se précipite dessus et&lt;br /&gt;
l&#039;occupe.)&lt;br /&gt;
Acte troisième&lt;br /&gt;
Scène I&lt;br /&gt;
(La Cour de Rome.)&lt;br /&gt;
Un Jeune Élégant (au premier voyageur, maintenant piéton). -l&#039;échancrure de ton pardessus est trop&lt;br /&gt;
large. Tu devrais la fermer un peu en faisant remonter le bouton du haut.&lt;br /&gt;
Scène II&lt;br /&gt;
(À bord d&#039;un autobus S passant devant la cour de Rome.)&lt;br /&gt;
Quatrième Voyageur. -Tiens, le type qui se trouvait tout à l&#039;heure avec moi dans l&#039;autobus et qui&lt;br /&gt;
s&#039;engueulait avec un bonhomme. Curieuse rencontre. J&#039;en ferai une comédie en trois actes et en prose.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode des TF-idf permet donc bien de mettre en avant les différences qu&#039;il peut y avoir entre les textes.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Ici a été présentée la méthode des TF-idf car elle est puissante et que c&#039;est une technique fondamentale de la fouille de données, mais il existe de nombreuses autres méthodes qui peuvent permettent d&#039;arriver à des résultats différents selon les caractéristiques que l&#039;on souhaite mettre en avant. Il existe par exemple des variantes du TF-idf qui permettent de mieux gérer les cas où les textes du corpus ont des tailles extrêmement différentes les uns des autres ou encore les techniques de LDA qui permettent d&#039;extraire automatiquement les thématiques d&#039;un corpus afin de construire des regroupements par thème.&lt;br /&gt;
&lt;br /&gt;
Page réalisée par Rémi Bouvier, étudiant en L1 CMI-Info (2017-2018), dans le cadre du cours de VISI201.&lt;br /&gt;
&lt;br /&gt;
Tuteur : Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediafire.com/file/xafo0xzc49ba6va/Exercices_de_style.txt Textes du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/ni07ftjd3w0bn9c/Liste_mots_corpus.txt Liste des mots du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/riboz97iahtehoe/Liste_mots-outils.txt Liste des mots-outils] inspirée de [https://www.ranks.nl/stopwords/french cette liste].&lt;br /&gt;
* [http://www.mediafire.com/file/gzd435ccm3m04wc/50_mots_premi%C3%A8re_approche.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/8tb1n5gktqt3d8j/50_mots_premi%C3%A8re_approche_sans_mots_outils.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus sans mots-outils]&lt;br /&gt;
* [http://www.mediafire.com/file/07argu9or5ruu6r/code_python.py Code python complet]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia :&lt;br /&gt;
&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es Exploration de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Analyse_des_donn%C3%A9es Analyse de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/TF-IDF TF-IDF]&lt;br /&gt;
&lt;br /&gt;
Livre :&lt;br /&gt;
* &#039;&#039;&amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot;&#039;&#039; de Amini et Gaussier aux éditions Eyrolles.&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10270</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10270"/>
		<updated>2018-05-21T14:41:39Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : Ajout des sources et des annexes + modifications mineures&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore &#039;&#039;data mining&#039;&#039;, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentations graphiques qui permettent de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage &#039;&#039;« Exercices de style »&#039;&#039; de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraires et de mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un fichier contenant tous les textes du corpus sera disponible en annexe.&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de ligne ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de texte doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes ceux-ci ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier) et écrira le texte modifié dans un nouveau fichier nommé &amp;lt;code&amp;gt;modif{:03}.txt&amp;quot;.format(i)&amp;lt;/code&amp;gt; . Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau (disponible en annexe). En utilisant la commande &amp;lt;code&amp;gt;len(stocke_mots_dossier(dossier))&amp;lt;/code&amp;gt;, on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils (disponible en annexe) qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrences de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une procédure qui prend en paramètres le corpus de textes et un entier n et qui affiche la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette procédure nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une procédure similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour arguments un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle affichera la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus (la liste des 50 premiers mots est disponible en annexe) :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (&#039;&#039;Term-Frequency&#039;&#039;) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF, tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (&#039;&#039;inverse document frequency&#039;&#039;) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;, autrement dit le mot doit se trouver dans au moins un texte du corpus)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en arguments un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment (dans l&#039;exemple, le nombre total de documents est de 3) :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » a le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Nous allons commencer par écrire une fonction qui permette de calculer l&#039;intégralité des TF de chaque mot, texte par texte. Pour cela, nous aurons besoin des fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_TF(fichier,mot)&amp;lt;/code&amp;gt; vues précédemment. Cette fonction devra prendre en argument un dossier de fichiers textes (le corpus de textes) et renverra une matrice rectangulaire qui contient sur chaque ligne le TF de chaque mot du corpus pour un texte donné. Le matrice devra donc avoir 100 lignes et 3774 colonnes et sera donc de la forme suivante :&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774  \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première ligne représentant le 1er texte, la deuxième le 2ème, etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tf_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
&lt;br /&gt;
    #Création de la matrice rectangulaire&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
        &lt;br /&gt;
    #Remplissage de la matrice rectangulaire&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        fichier = liste_fichiers[i]&lt;br /&gt;
        for j in range (len(liste_mots)) :&lt;br /&gt;
            mot = liste_mots[j]&lt;br /&gt;
            TF = calcul_TF(fichier,mot)&lt;br /&gt;
            mat[i][j] = TF&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice totale étant plutôt grande, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 5 &amp;amp; 1 &amp;amp; 3 &amp;amp; 1 &amp;amp; 10 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 2 &amp;amp; 0 &amp;amp; 5 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 8 &amp;amp; 0 &amp;amp; 9 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de construire une fonction qui permette d&#039;avoir l&#039;idf de chaque mot dans le corpus. Nous utiliserons donc les fonctions &amp;lt;code&amp;gt;stocke_mots_dossier(dossier)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;calcul_idf(dossier,mot,nombre_docs)&amp;lt;/code&amp;gt;. Cette fonction a pour paramètre un dossier de fichiers textes (le corpus de textes) et renvoie un tableau qui contient l&#039;idf de chaque mot apparaissant dans le corpus (le corpus contenant 3774 mots différents, la longueur de ce tableau est de 3774).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def idf_par_mot(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #3774&lt;br /&gt;
    T = [0]*len(liste_mots)&lt;br /&gt;
    for i in range (len(T)):&lt;br /&gt;
        mot = liste_mots[i]&lt;br /&gt;
        idf = calcul_idf(dossier,mot,nombre_docs=100)&lt;br /&gt;
        T[i] = idf&lt;br /&gt;
    return T&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un aperçu du résultat obtenu pour les premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;, &amp;quot;voyageur&amp;quot;, &amp;quot;attend&amp;quot;, &amp;quot;bus&amp;quot;). Les résultats sont arrondis au centième:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 0.22 &amp;amp; 4.61 &amp;amp; 0.13 &amp;amp; 4.61 &amp;amp; 0.12 &amp;amp; 2.04 &amp;amp; 4.61 &amp;amp; 3.00 &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons la matrice des TF et le tableau des idf de chaque mot, nous pouvons créer une fonction qui calculera le TF-idf de chaque mot. Celle-ci prendra en argument un dossier contenant des fichiers textes (le corpus de textes) et renverra une matrice qui contiendra le TF-idf de chaque mot pour chaque texte et qui sera de la même taille (100x3774) et de la même forme que celle des TF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def matrice_TFidf(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation de la matrice finale&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
&lt;br /&gt;
    #Remplissage de la matrice finale&lt;br /&gt;
    matrice_TF = tf_par_texte(dossier)&lt;br /&gt;
    tableau_idf = idf_par_mot(dossier)&lt;br /&gt;
    for i in range (len(matrice_TF)):&lt;br /&gt;
        for j in range (len(matrice_TF[i])):&lt;br /&gt;
             mat[i][j] = ((matrice_TF[i][j])*(tableau_idf[j]))&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice finale étant trop grande pour apparaître ici, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes. Les résultats sont arrondis au centième :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 1.12 &amp;amp; 4.61 &amp;amp; 0.38 &amp;amp; 4.61 &amp;amp; 1.17 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 0.26 &amp;amp; 0.00 &amp;amp; 0.58 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 1.02 &amp;amp; 0.00 &amp;amp; 0.105 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les résultats n&#039;étant pas facilement visibles sous forme de matrice, on peut maintenant créer une procédure qui permettra de mieux les visualiser. Cette procédure prend en argument le corpus de textes et renvoie les 10 TF-idf les plus élevés de chaque texte du corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def Top10_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier)&lt;br /&gt;
    matrice = matrice_TFidf(dossier)&lt;br /&gt;
    for i in range (len(matrice)):&lt;br /&gt;
        print(&amp;quot;Texte {:03}&amp;quot;.format(i+1))&lt;br /&gt;
        for j in range (10):&lt;br /&gt;
            liste_TFidf = matrice[i]&lt;br /&gt;
            TFidf_max = max(liste_TFidf)&lt;br /&gt;
            position = liste_TFidf.index(TFidf_max)&lt;br /&gt;
            mot = liste_mots[position]&lt;br /&gt;
            print(&amp;quot;{:02}. Mot : {:30} TFidf = {:10}&amp;quot;.format(j+1,mot,str(TFidf_max)))&lt;br /&gt;
            matrice[i][position] = 0&lt;br /&gt;
        print(&amp;quot;\n \n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La liste étant relativement longue, elle sera disponible en annexe et les résultats de cette procédure pour quelques textes seront exploités dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certains textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
La liste des 10 TF-idf les plus élevés de chaque texte du corpus permet de mettre en avant les spécificités des différents textes.&lt;br /&gt;
&lt;br /&gt;
En effet, pour le texte 098, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 098&lt;br /&gt;
01. Mot : heu                            TFidf = 13.815510557964275&lt;br /&gt;
02. Mot : oh                             TFidf = 13.815510557964275&lt;br /&gt;
03. Mot : eh                             TFidf = 10.519673691959945&lt;br /&gt;
04. Mot : peuh                           TFidf = 7.824046010856292&lt;br /&gt;
05. Mot : ah                             TFidf = 7.013115794639964&lt;br /&gt;
06. Mot : tiens                          TFidf = 5.318520073865556&lt;br /&gt;
07. Mot : interjections                  TFidf = 4.605170185988092&lt;br /&gt;
08. Mot : psst                           TFidf = 4.605170185988092&lt;br /&gt;
09. Mot : hum                            TFidf = 4.605170185988092&lt;br /&gt;
10. Mot : ouf                            TFidf = 4.605170185988092&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette liste, on peut supposer que ce texte est écrit uniquement à l&#039;aide d&#039;« interjections », mot qui apparaît d&#039;ailleurs à la 7ème place. Cela peut donc donner une idée de comment le texte est écrit sans même avoir à le lire. En effet, si on lit le texte 98, on peut vérifier que nos suppositions sont vraies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Interjections.&lt;br /&gt;
Psst ! heu ! ah ! oh ! hum ! ah ! ouf ! eh ! tiens ! oh ! peuh ! pouah ! ouïe ! ou ! aïe ! eh ! hein ! heu ! pfuitt !&lt;br /&gt;
Tiens ! eh ! peuh ! oh ! heu ! bon !&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple, si on choisit le texte 045, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 045&lt;br /&gt;
01. Mot : scène                          TFidf = 23.472138032568875&lt;br /&gt;
02. Mot : premier                        TFidf = 14.026231589279927&lt;br /&gt;
03. Mot : acte                           TFidf = 13.815510557964275&lt;br /&gt;
04. Mot : drelin                         TFidf = 13.815510557964275&lt;br /&gt;
05. Mot : voyageur                       TFidf = 12.241324971159328&lt;br /&gt;
06. Mot : ii                             TFidf = 11.736069016284437&lt;br /&gt;
07. Mot : monnaie                        TFidf = 9.210340371976184&lt;br /&gt;
08. Mot : i                              TFidf = 8.987196820661973&lt;br /&gt;
09. Mot : second                         TFidf = 7.824046010856292&lt;br /&gt;
10. Mot : comédie                        TFidf = 7.824046010856292&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous remarquons plusieurs mots comme &amp;quot;scène&amp;quot;, &amp;quot;acte&amp;quot;, &amp;quot;ii&amp;quot;, &amp;quot;premier&amp;quot; qui se rapportent au vocabulaire utilisé dans les pièces de théâtre. Si on regarde le texte correspondant à cette liste, on peut voir que son titre est &amp;quot;comédie&amp;quot;, qui apparaît dans la liste à la 10ème position et qu&#039;il est effectivement écrit sous la forme d&#039;une pièce de théâtre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Comédie.&lt;br /&gt;
Acte premier&lt;br /&gt;
Scène I&lt;br /&gt;
(Sur la plate-forme arrière d&#039;un autobus S, un jour, vers midi.)&lt;br /&gt;
Le Receveur. -la monnaie, s&#039;iou plaît. (Des voyageurs lui passent la monnaie.)&lt;br /&gt;
Scène II&lt;br /&gt;
(L&#039;autobus s&#039;arrête.)&lt;br /&gt;
Le Receveur. - laissons descendre. Priorités ? Une priorité ! C&#039;est complet. Drelin, drelin, drelin.&lt;br /&gt;
Acte second&lt;br /&gt;
Scène I&lt;br /&gt;
(Même décor.)&lt;br /&gt;
Premier Voyageur (Jeune, long cou, une tresse autour du chapeau).&lt;br /&gt;
- On dirait, monsieur, que vous le faites exprès de me marcher sur les pieds chaque fois qu&#039;il passe des&lt;br /&gt;
gens. Second Voyageur (hausse les épaules)&lt;br /&gt;
Scène II&lt;br /&gt;
(Un troisième voyageur descend.)&lt;br /&gt;
Premier Voyageur (s&#039;adressant au public) : Chouette ! une place libre ! J&#039;y cours. (Il se précipite dessus et&lt;br /&gt;
l&#039;occupe.)&lt;br /&gt;
Acte troisième&lt;br /&gt;
Scène I&lt;br /&gt;
(La Cour de Rome.)&lt;br /&gt;
Un Jeune Élégant (au premier voyageur, maintenant piéton). -l&#039;échancrure de ton pardessus est trop&lt;br /&gt;
large. Tu devrais la fermer un peu en faisant remonter le bouton du haut.&lt;br /&gt;
Scène II&lt;br /&gt;
(À bord d&#039;un autobus S passant devant la cour de Rome.)&lt;br /&gt;
Quatrième Voyageur. -Tiens, le type qui se trouvait tout à l&#039;heure avec moi dans l&#039;autobus et qui&lt;br /&gt;
s&#039;engueulait avec un bonhomme. Curieuse rencontre. J&#039;en ferai une comédie en trois actes et en prose.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode des TF-idf permet donc bien de mettre en avant les différences qu&#039;il peut y avoir entre les textes.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Ici a été présentée la méthode des TF-idf car elle est puissante et que c&#039;est une technique fondamentale de la fouille de données, mais il existe de nombreuses autres méthodes qui peuvent permettent d&#039;arriver à des résultats différents selon les caractéristiques que l&#039;on souhaite mettre en avant. Il existe par exemple des variantes du TF-idf qui permettent de mieux gérer les cas où les textes du corpus ont des tailles extrêmement différentes les uns des autres ou encore les techniques de LDA qui permettent d&#039;extraire automatiquement les thématiques d&#039;un corpus afin de construire des regroupements par thème.&lt;br /&gt;
&lt;br /&gt;
Page réalisée par Rémi Bouvier, étudiant en L1 CMI-Info (2017-2018), dans le cadre du cours de VISI201.&lt;br /&gt;
&lt;br /&gt;
Tuteur : Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediafire.com/file/xafo0xzc49ba6va/Exercices_de_style.txt Textes du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/ni07ftjd3w0bn9c/Liste_mots_corpus.txt Liste des mots du corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/riboz97iahtehoe/Liste_mots-outils.txt Liste des mots-outils] inspirée de [https://www.ranks.nl/stopwords/french cette liste].&lt;br /&gt;
* [http://www.mediafire.com/file/gzd435ccm3m04wc/50_mots_premi%C3%A8re_approche.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus]&lt;br /&gt;
* [http://www.mediafire.com/file/8tb1n5gktqt3d8j/50_mots_premi%C3%A8re_approche_sans_mots_outils.txt Top 50 des mots pour la méthode du comptage du nombre d’apparition de chaque mot dans le corpus sans mots-outils]&lt;br /&gt;
* [http://www.mediafire.com/file/07argu9or5ruu6r/code_python.py Code python complet]&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Wikipedia :&lt;br /&gt;
&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es Exploration de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/Analyse_des_donn%C3%A9es Analyse de données]&lt;br /&gt;
*[https://fr.wikipedia.org/wiki/TF-IDF TF-IDF]&lt;br /&gt;
&lt;br /&gt;
Livre :&lt;br /&gt;
* &#039;&#039;&amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot;&#039;&#039; de Amini et Gaussier aux éditions Eyrolles.&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10269</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10269"/>
		<updated>2018-05-21T11:21:41Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : Ajout partie 4.2 et 4.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore data mining, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentation graphique qui permet de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage « Exercices de style » de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraire et mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de lignes ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de texte doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes s&#039;ils ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier). et écrira le texte modifié dans un nouveau fichier nommé « modif{:03}.txt&amp;quot;.format(i) ». Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau. En utilisant la commande len(stocke_mots_dossier(dossier)), on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrence de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé dans le corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une fonction qui prend en paramètre le corpus de textes et un entier n et qui renvoie la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette fonction nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour argument un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle renverra la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affichage_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (Term-Frequency) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (inverse document frequency) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en argument un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment (dans l&#039;exemple, le nombre total de documents est de 3) :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » à quant à lui le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonction qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Nous allons commencer par écrire une fonction qui permette de calculer l&#039;intégralité des TF de chaque mot texte par texte. Pour cela, nous aurons besoin des fonction stocke_mots_dossier(dossier) et calcul_TF(fichier,mot) vues précédemment. Cette fonction devra prendre en argument un dossier de fichiers textes (le corpus de textes) et renverra une matrice rectangulaire qui contient sur chaque ligne le TF de chaque mot du corpus pour un texte donné. Le matrice devra donc avoir 100 lignes et 3774 colonnes et sera donc de la forme suivante :&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774  \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première ligne représentant le 1er texte, la deuxième le 2ème, etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tf_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
&lt;br /&gt;
    #Création de la matrice rectangulaire&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
        &lt;br /&gt;
    #Remplissage de la matrice rectangulaire&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        fichier = liste_fichiers[i]&lt;br /&gt;
        for j in range (len(liste_mots)) :&lt;br /&gt;
            mot = liste_mots[j]&lt;br /&gt;
            TF = calcul_TF(fichier,mot)&lt;br /&gt;
            mat[i][j] = TF&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice totale étant plutôt grande, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 5 &amp;amp; 1 &amp;amp; 3 &amp;amp; 1 &amp;amp; 10 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 2 &amp;amp; 0 &amp;amp; 5 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 8 &amp;amp; 0 &amp;amp; 9 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de construire une fonction qui permette d&#039;avoir l&#039;idf de chaque mot dans le corpus. Nous utiliserons donc les fonctions stocke_mots_dossier(dossier) et calcul_idf(dossier,mot,nombre_docs). Cette fonction a pour paramètre un dossier de fichiers textes (le corpus de textes) et renvoie un tableau qui contient l&#039;idf de chaque mot apparaissant dans le corpus (le corpus contenant 3774 mots différents, la longueur de ce tableau est de 3774).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def idf_par_mot(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #3774&lt;br /&gt;
    T = [0]*len(liste_mots)&lt;br /&gt;
    for i in range (len(T)):&lt;br /&gt;
        mot = liste_mots[i]&lt;br /&gt;
        idf = calcul_idf(dossier,mot,nombre_docs=100)&lt;br /&gt;
        T[i] = idf&lt;br /&gt;
    return T&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un aperçu du résultat obtenu pour les premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;, &amp;quot;voyageur&amp;quot;, &amp;quot;attend&amp;quot;, &amp;quot;bus&amp;quot;). Les résultats sont arrondis au centième:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 0.22 &amp;amp; 4.61 &amp;amp; 0.13 &amp;amp; 4.61 &amp;amp; 0.12 &amp;amp; 2.04 &amp;amp; 4.61 &amp;amp; 3.00 &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons la matrice des TF et le tableau des idf de chaque mot, nous pouvons créer une fonction qui calculera le TF-idf de chaque mot. Celle-ci prendra en argument un dossier contenant des fichiers textes (le corpus de textes) et renverra une matrice qui contiendra le Tfidf de chaque mot pour chaque texte et qui sera de la même taille (100x3774) et de la même forme que celle des TF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def matrice_TFidf(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation de la matrice finale&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
&lt;br /&gt;
    #Remplissage de la matrice finale&lt;br /&gt;
    matrice_TF = tf_par_texte(dossier)&lt;br /&gt;
    tableau_idf = idf_par_mot(dossier)&lt;br /&gt;
    for i in range (len(matrice_TF)):&lt;br /&gt;
        for j in range (len(matrice_TF[i])):&lt;br /&gt;
             mat[i][j] = ((matrice_TF[i][j])*(tableau_idf[j]))&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice finale étant trop grande pour apparaître ici, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes. Les résultats sont arrondis au centième :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 1.12 &amp;amp; 4.61 &amp;amp; 0.38 &amp;amp; 4.61 &amp;amp; 1.17 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 0.26 &amp;amp; 0.00 &amp;amp; 0.58 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 1.02 &amp;amp; 0.00 &amp;amp; 0.105 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les résultats n&#039;étant pas facilement visibles sous forme de matrice, on peut maintenant créer une procédure qui permettra de mieux les visualiser. Cette procédure prend en argument le corpus de textes et renvoie les 10 TF-idf les plus élevés de chaque texte du corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def Top10_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier)&lt;br /&gt;
    matrice = matrice_TFidf(dossier)&lt;br /&gt;
    for i in range (len(matrice)):&lt;br /&gt;
        print(&amp;quot;Texte {:03}&amp;quot;.format(i+1))&lt;br /&gt;
        for j in range (10):&lt;br /&gt;
            liste_TFidf = matrice[i]&lt;br /&gt;
            TFidf_max = max(liste_TFidf)&lt;br /&gt;
            position = liste_TFidf.index(TFidf_max)&lt;br /&gt;
            mot = liste_mots[position]&lt;br /&gt;
            print(&amp;quot;{:02}. Mot : {:30} TFidf = {:10}&amp;quot;.format(j+1,mot,str(TFidf_max)))&lt;br /&gt;
            matrice[i][position] = 0&lt;br /&gt;
        print(&amp;quot;\n \n&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La liste étant relativement longue, elle sera disponible en annexe et les résultats de cette procédure pour quelques textes seront exploités dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certaines textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
La liste des 10 TF-idf les plus élevés de chaque texte du corpus permet de mettre en avant les spécificités des différents textes.&lt;br /&gt;
&lt;br /&gt;
En effet, pour le texte 098, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 098&lt;br /&gt;
01. Mot : heu                            TFidf = 13.815510557964275&lt;br /&gt;
02. Mot : oh                             TFidf = 13.815510557964275&lt;br /&gt;
03. Mot : eh                             TFidf = 10.519673691959945&lt;br /&gt;
04. Mot : peuh                           TFidf = 7.824046010856292&lt;br /&gt;
05. Mot : ah                             TFidf = 7.013115794639964&lt;br /&gt;
06. Mot : tiens                          TFidf = 5.318520073865556&lt;br /&gt;
07. Mot : interjections                  TFidf = 4.605170185988092&lt;br /&gt;
08. Mot : psst                           TFidf = 4.605170185988092&lt;br /&gt;
09. Mot : hum                            TFidf = 4.605170185988092&lt;br /&gt;
10. Mot : ouf                            TFidf = 4.605170185988092&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette liste, on peut supposer que ce texte est écrit uniquement à l&#039;aide d&#039;« interjections », mot qui apparaît d&#039;ailleurs à la 7ème place. Cela peut donc donner une idée de comment le texte est écrit sans même avoir à le lire. En effet, si on lit le texte 98, on peut vérifier que nos suppositions sont vraies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Interjections.&lt;br /&gt;
Psst ! heu ! ah ! oh ! hum ! ah ! ouf ! eh ! tiens ! oh ! peuh ! pouah ! ouïe ! ou ! aïe ! eh ! hein ! heu ! pfuitt !&lt;br /&gt;
Tiens ! eh ! peuh ! oh ! heu ! bon !&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple, si on choisit le texte 045, on obtient la liste suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Texte 045&lt;br /&gt;
01. Mot : scène                          TFidf = 23.472138032568875&lt;br /&gt;
02. Mot : premier                        TFidf = 14.026231589279927&lt;br /&gt;
03. Mot : acte                           TFidf = 13.815510557964275&lt;br /&gt;
04. Mot : drelin                         TFidf = 13.815510557964275&lt;br /&gt;
05. Mot : voyageur                       TFidf = 12.241324971159328&lt;br /&gt;
06. Mot : ii                             TFidf = 11.736069016284437&lt;br /&gt;
07. Mot : monnaie                        TFidf = 9.210340371976184&lt;br /&gt;
08. Mot : i                              TFidf = 8.987196820661973&lt;br /&gt;
09. Mot : second                         TFidf = 7.824046010856292&lt;br /&gt;
10. Mot : comédie                        TFidf = 7.824046010856292&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous remarquons plusieurs mots comment &amp;quot;scène&amp;quot;, &amp;quot;acte&amp;quot;, &amp;quot;ii&amp;quot;, &amp;quot;premier&amp;quot; qui se rapportent au vocabulaire utilisé dans les pièces de théâtre. Si on regarde le texte correspondant à cette liste, on peut voir que son titre est &amp;quot;comédie&amp;quot;, qui apparaît dans la liste à la 10ème position et qu&#039;il est effectivement écrit sous la forme d&#039;une pièce de théâtre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Comédie.&lt;br /&gt;
Acte premier&lt;br /&gt;
Scène I&lt;br /&gt;
(Sur la plate-forme arrière d&#039;un autobus S, un jour, vers midi.)&lt;br /&gt;
Le Receveur. -la monnaie, s&#039;iou plaît. (Des voyageurs lui passent la monnaie.)&lt;br /&gt;
Scène II&lt;br /&gt;
(L&#039;autobus s&#039;arrête.)&lt;br /&gt;
Le Receveur. - laissons descendre. Priorités ? Une priorité ! C&#039;est complet. Drelin, drelin, drelin.&lt;br /&gt;
Acte second&lt;br /&gt;
Scène I&lt;br /&gt;
(Même décor.)&lt;br /&gt;
Premier Voyageur (Jeune, long cou, une tresse autour du chapeau).&lt;br /&gt;
- On dirait, monsieur, que vous le faites exprès de me marcher sur les pieds chaque fois qu&#039;il passe des&lt;br /&gt;
gens. Second Voyageur (hausse les épaules)&lt;br /&gt;
Scène II&lt;br /&gt;
(Un troisième voyageur descend.)&lt;br /&gt;
Premier Voyageur (s&#039;adressant au public) : Chouette ! une place libre ! J&#039;y cours. (Il se précipite dessus et&lt;br /&gt;
l&#039;occupe.)&lt;br /&gt;
Acte troisième&lt;br /&gt;
Scène I&lt;br /&gt;
(La Cour de Rome.)&lt;br /&gt;
Un Jeune Élégant (au premier voyageur, maintenant piéton). -l&#039;échancrure de ton pardessus est trop&lt;br /&gt;
large. Tu devrais la fermer un peu en faisant remonter le bouton du haut.&lt;br /&gt;
Scène II&lt;br /&gt;
(À bord d&#039;un autobus S passant devant la cour de Rome.)&lt;br /&gt;
Quatrième Voyageur. -Tiens, le type qui se trouvait tout à l&#039;heure avec moi dans l&#039;autobus et qui&lt;br /&gt;
s&#039;engueulait avec un bonhomme. Curieuse rencontre. J&#039;en ferai une comédie en trois actes et en prose.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode des TF-idf permet donc bien de mettre en avant les différences qu&#039;il peut y avoir entre les textes.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Ici a été présentée la méthode des TF-idf car elle est puissante et que c&#039;est une technique fondamentale de la fouille de données, mais il existe de nombreuses autres méthodes qui peuvent permettent d&#039;arriver à des résultats différents selon les caractéristiques que l&#039;on souhaite mettre en avant. Il existe par exemple des variantes du TF-idf qui permettent de mieux gérer les cas où les textes du corpus ont des tailles extrêmement différentes les uns des autres ou encore les techniques de LDA qui permettent d&#039;extraire automatiquement les thématiques d&#039;un corpus afin de construire des regroupements par thème.&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10268</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10268"/>
		<updated>2018-05-18T21:45:40Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore data mining, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentation graphique qui permet de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage « Exercices de style » de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraire et mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de lignes ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de texte doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes s&#039;ils ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier). et écrira le texte modifié dans un nouveau fichier nommé « modif{:03}.txt&amp;quot;.format(i) ». Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau. En utilisant la commande len(stocke_mots_dossier(dossier)), on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
« Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrence de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé dans le corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une fonction qui prend en paramètre le corpus de textes et un entier n et qui renvoie la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette fonction nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour argument un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle renverra la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affichage_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (Term-Frequency) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (inverse document frequency) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en argument un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » à quant à lui le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonction qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Nous allons commencer par écrire une fonction qui permette de calculer l&#039;intégralité des TF de chaque mot texte par texte. Pour cela, nous aurons besoin des fonction stocke_mots_dossier(dossier) et calcul_TF(fichier,mot) vues précédemment. Cette fonction devra prendre en argument un dossier de fichiers textes (le corpus de textes) et renverra une matrice rectangulaire qui contient sur chaque ligne le TF de chaque mot du corpus pour un texte donné. Le matrice devra donc avoir 100 lignes et 3774 colonnes et sera donc de la forme suivante :&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774  \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ TF mot1 &amp;amp; TF mot2 &amp;amp; TF mot3 &amp;amp; ... &amp;amp; TF mot 3774 \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première ligne représentant le 1er texte, la deuxième le 2ème, etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tf_par_texte(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
&lt;br /&gt;
    #Création de la matrice rectangulaire&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
        &lt;br /&gt;
    #Remplissage de la matrice rectangulaire&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        fichier = liste_fichiers[i]&lt;br /&gt;
        for j in range (len(liste_mots)) :&lt;br /&gt;
            mot = liste_mots[j]&lt;br /&gt;
            TF = calcul_TF(fichier,mot)&lt;br /&gt;
            mat[i][j] = TF&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice totale étant plutôt grande, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 5 &amp;amp; 1 &amp;amp; 3 &amp;amp; 1 &amp;amp; 10 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 2 &amp;amp; 0 &amp;amp; 5 &amp;amp; ... \\ 4 &amp;amp; 0 &amp;amp; 8 &amp;amp; 0 &amp;amp; 9 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de construire une fonction qui permette d&#039;avoir l&#039;idf de chaque mot dans le corpus. Nous utiliserons donc les fonctions stocke_mots_dossier(dossier) et calcul_idf(dossier,mot,nombre_docs). Cette fonction a pour paramètre un dossier de fichiers textes (le corpus de textes) et renvoie un tableau qui contient l&#039;idf de chaque mot apparaissant dans le corpus (le corpus contenant 3774 mots différents, la longueur de ce tableau est de 3774).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def idf_par_mot(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #3774&lt;br /&gt;
    T = [0]*len(liste_mots)&lt;br /&gt;
    for i in range (len(T)):&lt;br /&gt;
        mot = liste_mots[i]&lt;br /&gt;
        idf = calcul_idf(dossier,mot,nombre_docs=100)&lt;br /&gt;
        T[i] = idf&lt;br /&gt;
    return T&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un aperçu du résultat obtenu pour les premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;, &amp;quot;voyageur&amp;quot;, &amp;quot;attend&amp;quot;, &amp;quot;bus&amp;quot;). Les résultats sont arrondis au centième:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 0.22 &amp;amp; 4.61 &amp;amp; 0.13 &amp;amp; 4.61 &amp;amp; 0.12 &amp;amp; 2.04 &amp;amp; 4.61 &amp;amp; 3.00 &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons la matrice des TF et le tableau des idf de chaque mot, nous pouvons créer une fonction qui calculera le TF-idf de chaque mot. Celle-ci prendra en argument un dossier contenant des fichiers textes (le corpus de textes) et renverra une matrice qui contiendra le Tfidf de chaque mot pour chaque texte et qui sera de la même taille (100x3774) et de la même forme que celle des TF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def matrice_TFidf(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier) #len = 100&lt;br /&gt;
    liste_mots = stocke_mots_dossier(dossier) #len = 3774&lt;br /&gt;
    &lt;br /&gt;
    #Initialisation de la matrice finale&lt;br /&gt;
    mat = []&lt;br /&gt;
    for i in range (len(liste_fichiers)) :&lt;br /&gt;
        mat.append([0]*len(liste_mots))&lt;br /&gt;
&lt;br /&gt;
    #Remplissage de la matrice finale&lt;br /&gt;
    matrice_TF = tf_par_texte(dossier)&lt;br /&gt;
    tableau_idf = idf_par_mot(dossier)&lt;br /&gt;
    for i in range (len(matrice_TF)):&lt;br /&gt;
        for j in range (len(matrice_TF[i])):&lt;br /&gt;
             mat[i][j] = ((matrice_TF[i][j])*(tableau_idf[j]))&lt;br /&gt;
    return mat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La matrice finale étant trop grande pour apparaître ici, voici un aperçu des résultats de la fonction pour les 5 premiers mots (&amp;quot;le&amp;quot;, &amp;quot;texte&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;base&amp;quot;, &amp;quot;un&amp;quot;) et les 3 premiers textes. Les résultats sont arrondis au centième :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{pmatrix} 1.12 &amp;amp; 4.61 &amp;amp; 0.38 &amp;amp; 4.61 &amp;amp; 1.17 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 0.26 &amp;amp; 0.00 &amp;amp; 0.58 &amp;amp; ... \\ 0.89 &amp;amp; 0.00 &amp;amp; 1.02 &amp;amp; 0.00 &amp;amp; 0.105 &amp;amp; ... \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \end{pmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certaines textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10267</id>
		<title>Fouille de données textuelles à partir des &quot;Exercices de style&quot; de R. Queneau</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fouille_de_donn%C3%A9es_textuelles_%C3%A0_partir_des_%22Exercices_de_style%22_de_R._Queneau&amp;diff=10267"/>
		<updated>2018-05-18T14:43:21Z</updated>

		<summary type="html">&lt;p&gt;Bouvier : Création du plan et de toutes les parties jusqu&amp;#039;à &amp;quot;4.1 Présentation de la méthode sur une quantité de données réduite&amp;quot; incluse&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La &#039;&#039;&#039;fouille de données&#039;&#039;&#039;, également appelée forage de données, analyse de données ou encore data mining, consiste en l&#039;extraction d&#039;information à partir d&#039;une quantité importante de données. Pour cela, on utilise un ensemble d&#039;algorithmes issus de différentes disciplines scientifiques comme les statistiques ou l&#039;informatique par exemple. Le but de ces algorithmes est de permettre, en fonction de différents critères, d&#039;extraire un maximum de connaissances d&#039;une grande quantité de données. L&#039;analyse de données est très utilisée dans le monde professionnel dans des domaines variés tels que la détection de fraudes, la gestion des relations avec les clients, l&#039;optimisation des sites web ou encore l&#039;analyse de la consommation. Elle a pour but de souligner les relations entre les données (points communs, différences...) afin d&#039;en tirer seulement les informations les plus intéressantes. Les résultats de l&#039;utilisation des algorithmes d&#039;analyse de données sont souvent sous forme de représentation graphique qui permet de mettre en évidence les informations.&lt;br /&gt;
&lt;br /&gt;
L&#039;analyse de données textuelles est une spécialisation de la fouille de données et repose sur les même principes, seulement elle utilise des algorithmes spécialisés ayant pour but d&#039;obtenir de l&#039;information à partir d&#039;un texte ou d&#039;un corpus de textes.&lt;br /&gt;
&lt;br /&gt;
A travers un corpus de textes, nous expliquerons notamment les techniques de TF/IDF permettant d&#039;extraire les mots significatifs du corpus. Toutes les fonctions et procédures dont nous aurons besoin ici seront écrites en Python.&lt;br /&gt;
&lt;br /&gt;
== Présentation du corpus de textes traité ==&lt;br /&gt;
&lt;br /&gt;
Ici, nous présenterons différentes techniques de fouille de données textuelles à partir de l&#039;ouvrage « Exercices de style » de Raymond Queneau. Ce livre, publié en 1947, raconte 99 fois la même histoire de manière différente à chaque fois. Cet ouvrage est un exemple d&#039;une contrainte littéraire utilisée en tant que moteur créatif et est un des premiers textes du mouvement Oulipo dont Raymond Queneau sera l&#039;un des membres les plus importants. Le mouvement Oulipo (Ouvroir de littérature potentielle) est un groupe de littéraire et mathématiciens qui se définissent comme des « rats qui construisent eux-mêmes le labyrinthe dont ils se proposent de sortir. » Les membres de l&#039;Oulipo réfléchissait autour de la notion de « contrainte » afin d&#039;écrire de nouveaux ouvrages ayant pour but d&#039;encourager la création.&lt;br /&gt;
&lt;br /&gt;
L&#039;histoire de base du texte de Raymond Queneau se résume en quelques lignes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Traitement préliminaire du corpus de textes ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la ponctuation, des majuscules et des sauts de lignes ===&lt;br /&gt;
&lt;br /&gt;
Pour être exploité, le corpus de texte doit d&#039;abord être traité au préalable, afin de permettre une utilisation simplifiée des algorithmes d&#039;analyse de données. En effet, des éléments comme la ponctuation, les sauts de ligne ou encore les majuscules/minuscules peuvent compliquer l&#039;utilisation des algorithmes s&#039;ils ne sont pas traités en amont. Il est donc nécessaire de créer une procédure permettant de gérer ces éléments. Celle-ci devra gérer les aspects suivants : le remplacement de toutes les majuscules du texte par des minuscules, ainsi que le remplacement de la ponctuation et des sauts de ligne par le caractère « » (un espace). Elle prendra en argument un fichier texte que l&#039;on souhaite modifier, ainsi qu&#039;un numéro de fichier (afin de faciliter la gestion lorsque l&#039;on possède un grand nombre de fichier). et écrira le texte modifié dans un nouveau fichier nommé « modif{:03}.txt&amp;quot;.format(i) ». Vous pouvez trouver ci-dessous le code en Python d&#039;une telle procédure :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte(fichier_in,i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier_in : nom du fichier à modifier&lt;br /&gt;
    i : numéro du fichier&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ponctuation = [&amp;quot;,&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;:&amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;«&amp;quot;,&amp;quot;»&amp;quot;,&amp;quot;(&amp;quot;,&amp;quot;)&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;…&amp;quot;,&amp;quot;&#039;&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;’&amp;quot;]&lt;br /&gt;
    f_in = open(fichier_in, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    f_out = open((&amp;quot;modif{:03}.txt&amp;quot;.format(i)), mode = &amp;quot;w&amp;quot;)&lt;br /&gt;
    ligne = &amp;quot;initialisation&amp;quot;&lt;br /&gt;
    while (ligne != &amp;quot;&amp;quot;) : #Tant que la fin du fichier n&#039;est pas atteinte.&lt;br /&gt;
        ligne = f_in.readline()&lt;br /&gt;
        ligne = ligne.lower()&lt;br /&gt;
        for c in ligne :&lt;br /&gt;
            if (c in ponctuation) or (c == &amp;quot;\n&amp;quot;) :&lt;br /&gt;
                f_out.write(&amp;quot; &amp;quot;)&lt;br /&gt;
            else :&lt;br /&gt;
                f_out.write(c)&lt;br /&gt;
    f_in.close()&lt;br /&gt;
    f_out.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également créer une procédure qui prend en argument un dossier de fichiers à modifier et qui exécute la procédure présentée ci-dessus sur tous les fichiers de ce dossier (cela permet de gérer   l&#039;intégralité du corpus de textes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def modification_texte_dossier(dossier_in):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier_in : dossier de fichiers à modifier.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import os&lt;br /&gt;
    os.chdir(dossier_in)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier_in)&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        modification_texte(liste_fichiers[i],i+1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les toutes les fonctions décrites ci-dessous, on utilisera les textes modifiés (sans ponctuation, sans majuscules et sans sauts de ligne).&lt;br /&gt;
&lt;br /&gt;
=== Création de fonctions utiles pour la fouille de données textuelles ===&lt;br /&gt;
&lt;br /&gt;
Nous allons avoir besoin de créer quelques fonctions de base, très utiles pour l&#039;utilisation des algorithmes d&#039;analyse de données textuelles.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction qui permet de compter le nombre de mots total du corpus de texte, afin de savoir quelle quantité de données il faudra gérer. La fonction suivante permet de compter le nombre de mots d&#039;un fichier. Elle prend en paramètre un fichier texte et renvoie le nombre de mots contenus dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte sur lequel on doit compter le nombre de mots qu&#039;il contient&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    mots = []&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    mots = mots + ligne2&lt;br /&gt;
    f.close()&lt;br /&gt;
    return len(mots)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant créer une fonction qui parcourt l&#039;intégralité du corpus afin de connaître le nombre de mots total que contient celui-ci. Cette fonction prend en paramètre un dossier de fichiers textes (le corpus) et renvoie le nombre total de mots contenus dans les fichiers textes de ce dossier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compte_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichier texte (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    total = 0&lt;br /&gt;
    for i in range (len(liste_fichiers)):&lt;br /&gt;
        total = total + compte_mots(liste_fichiers[i])&lt;br /&gt;
    return total&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant cette fonction, on peut savoir que le corpus traité contient 14755 mots.&lt;br /&gt;
&lt;br /&gt;
Il est également nécessaire de créer une fonction qui stocke tous les mots du corpus dans un tableau (chaque mot n&#039;apparaît qu&#039;une seule fois dans le tableau).  On crée donc d&#039;abord une fonction qui stocke tous les mots d&#039;un fichier. Celle-ci prendra en argument un fichier texte et renverra un tableau contenant chaque mot du fichier texte (pas de doublons dans le tableau).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_fichier(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier texte duquel on souhaite tirer une liste de mots&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    ligne2 = ligne.split()&lt;br /&gt;
    for c in ligne2 :&lt;br /&gt;
        if not (c in tab) :&lt;br /&gt;
            tab.append(c)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme précédemment, on a donc maintenant besoin d&#039;une fonction qui puisse parcourir l&#039;intégralité du corpus de texte. Celle-ci prend en paramètre un dossier de fichiers (le corpus de textes) et renvoie un tableau contenant tous les mots du corpus, chaque mot n’apparaissant qu&#039;une seule fois.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def stocke_mots_dossier(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes complet)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tab = []&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    for f in liste_fichiers:&lt;br /&gt;
        tab_fichier = stocke_mots_fichier(f)&lt;br /&gt;
        for c in tab_fichier :&lt;br /&gt;
            if not (c in tab):&lt;br /&gt;
                tab.append(c)&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc maintenant l&#039;intégralité des mots du corpus stockés dans un tableau. En utilisant la commande len(stocke_mots_dossier(dossier)), on obtient que le corpus contient 3774 mots différents les uns des autres.&lt;br /&gt;
&lt;br /&gt;
== Première approche : comptage du nombre d&#039;apparition de chaque mot dans le corpus ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur 1 texte ===&lt;br /&gt;
&lt;br /&gt;
La première méthode à laquelle on pense pour tirer de l&#039;information d&#039;un grand nombre de données textuelles est de regarder le nombre de fois que chaque mot apparaît dans le corpus. Prenons un exemple sur le texte suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
« Le texte de base.&lt;br /&gt;
&lt;br /&gt;
Un voyageur attend le bus, il remarque un jeune homme au long cou qui porte un chapeau bizarre, entouré d&#039;un galon tressé. Le jeune homme se dispute avec un passager qui lui reproche de lui marcher sur les pieds chaque fois que quelqu&#039;un monte ou descend. Puis il va s&#039;asseoir sur un siège inoccupé. Un quart d&#039;heure plus tard le voyageur revoit le jeune homme devant la gare Saint-Lazare. Il discute avec un ami à propos d&#039;un bouton de pardessus. »&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce texte, les termes qui apparaissent le plus souvent sont :&lt;br /&gt;
* « un » apparaît 10 fois.&lt;br /&gt;
* « le » apparaît 5 fois.&lt;br /&gt;
* « de » apparaît 3 fois.&lt;br /&gt;
* « il» apparaît 3 fois.&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
&lt;br /&gt;
Les informations obtenues ne sont donc pas très intéressantes car elle ne permettent pas de dégager les mots spécifiques à ce texte. En effet, avec cette méthode, on obtiendra principalement les mots outils de la langue française, qui n&#039;ont pas spécialement grand intérêt du fait qu&#039;ils sont présents dans la quasi-totalité des textes et que nous cherchons à définir les mots spécifiques à un texte. Ce que nous pouvons faire pour palier à ce problème est de définir manuellement une liste de mots-outils qui ne seront pas pris en compte dans le comptage des mots. Le problème de cette liste est qu&#039;elle doit être définie à la main par l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
Si l&#039;on néglige la présence de ces mots-outils dans le texte, voici la liste des termes qui apparaissent le plus souvent :&lt;br /&gt;
* « jeune » apparaît 3 fois.&lt;br /&gt;
* « homme » apparaît 3 fois.&lt;br /&gt;
* « voyageur » apparaît 2 fois.&lt;br /&gt;
&lt;br /&gt;
Les autres mots du texte sont des mots-outils où n&#039;apparaissent qu&#039;une seule fois : il n&#039;est donc pas intéressant de les retenir. Nous obtenons donc une liste de mots spécifiques à ce texte qui permet de dégager quelques informations à propos de ce dernier : on sait qu&#039;il parle d&#039;un « homme » et d&#039;un « voyageur » et on peut supposer qu&#039;au moins l&#039;un des deux est qualifié de « jeune ». &lt;br /&gt;
&lt;br /&gt;
Nous avons donc pu tirer une information plus concise du texte à partir de l&#039;intégralité des mots qui le compose.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant créer des fonctions qui permettent d&#039;appliquer la méthode vue précédemment sur l&#039;intégralité du corpus de textes. Il est donc nécessaire d&#039;avoir une fonction qui calcule le nombre d’occurrence de chaque mot dans le corpus. Cette fonction prendra en paramètre un dossier de fichiers textes (le corpus de textes complet) et renverra un dictionnaire avec comme clés les mots contenus dans les fichiers et comme valeurs le nombre de fois où apparaît le mot associé dans le corpus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def occurrence_mots(dossier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de textes)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    occurrences = {}&lt;br /&gt;
    for t in liste_fichiers :&lt;br /&gt;
        f = open(t, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        ligne = f.readline()&lt;br /&gt;
        ligne2 = ligne.split()&lt;br /&gt;
        for c in ligne2 :&lt;br /&gt;
            occurrences[c] = occurrences.get(c,0)+1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return occurrences&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est maintenant nécessaire d&#039;afficher les mots dont l&#039;occurrence est la plus élevée. Pour cela nous aurons besoin d&#039;une fonction qui prend en paramètre le corpus de textes et un entier n et qui renvoie la liste des n mots apparaissant le plus dans le corpus (donc affichés selon l&#039;ordre décroissant des occurrences).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affiche_occurence_décroissant(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    for i in range (0,min(n,len(tab))):&lt;br /&gt;
        print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(i+1,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grâce à cette fonction nous obtenons que les mots qui apparaissent le plus souvent dans le corpus sont :&lt;br /&gt;
* « un » apparaît 575 fois.&lt;br /&gt;
* « de » apparaît 457 fois.&lt;br /&gt;
* « la » apparaît 294 fois.&lt;br /&gt;
* « et » apparaît 275 fois.&lt;br /&gt;
* « il » apparaît 274 fois.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Comme sur l&#039;exemple avec un seul texte, ce sont les mots-outils de la langue française qui apparaissent le plus dans ce corpus (ils sont même davantage mis en avant car le corpus de texte étant plus long, les mots-outils sont encore plus utilisés), ce qui ne nous apporte pas grand chose comme information sur les spécificités du corpus.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire de créer une fonction similaire à la précédente, qui permette de gérer les mots-outils. Celle-ci doit avoir pour argument un dossier contenant les textes du corpus ainsi qu&#039;un entier n, comme la précédente. Elle renverra la liste des n mots qui apparaissent le plus dans le corpus, sans les mots-outils (la liste de ceux-ci était entrée manuellement) et sans les mots de taille égale à 1 caractère que l&#039;on considère comme non pertinents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def affichage_occurrence_décroissant2(dossier,n):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus complet)&lt;br /&gt;
    n : entier représentant le nombre de mots que l&#039;on souhaite afficher&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dico = occurrence_mots(dossier)&lt;br /&gt;
    tab  = (sorted(dico.items(), key=lambda t: t[1], reverse=True))&lt;br /&gt;
    i = 0&lt;br /&gt;
    numero_mot = 1&lt;br /&gt;
    while (numero_mot &amp;lt;= n) and (i &amp;lt; len(tab)) :&lt;br /&gt;
        if (((tab[i][0]) not in mots_outils) and (len(tab[i][0]) &amp;gt; 1)) :&lt;br /&gt;
            print(&amp;quot;Mot {:03} : &#039;{:30}  fréquence : {:03}&amp;quot;.format(numero_mot,tab[i][0] + &amp;quot;\&#039;&amp;quot;,tab[i][1]))&lt;br /&gt;
            numero_mot = numero_mot + 1&lt;br /&gt;
        i = i+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on exécute cette fonction, voici la liste des termes qui apparaissent le plus souvent dans le corpus :&lt;br /&gt;
* « autobus » apparaît 93 fois.&lt;br /&gt;
* « chapeau » apparaît 69 fois.&lt;br /&gt;
* « long » apparaît 66 fois.&lt;br /&gt;
* « cou » apparaît 66 fois.&lt;br /&gt;
* « devant » apparaît 64 fois.&lt;br /&gt;
* « bouton » apparaît 58 fois.&lt;br /&gt;
* « jeune » apparaît 52 fois.&lt;br /&gt;
* « tard » apparaît 51 fois.&lt;br /&gt;
* « place » apparaît 51 fois.&lt;br /&gt;
* « homme » apparaît 48 fois.&lt;br /&gt;
Les données obtenues sont donc plus pertinentes et nous donnent plus d&#039;information sur l&#039;histoire racontée dans le corpus. En effet, on peut  par exemple déduire que l&#039;« autobus » le « chapeau » ou encore le « bouton » sont des éléments centraux de l&#039;histoire car ils apparaissent de nombreuses fois dans le corpus.&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet donc d&#039;avoir une vue d&#039;ensemble sur ce dont parlent les textes, mais le principal inconvénient est qu&#039;il faille rentrer une liste de mots-outils de la langue française, sachant que celle-ci n&#039;est pas fixée et peu plus ou moins varier selon les textes analysés.&lt;br /&gt;
&lt;br /&gt;
== Méthode des TF-IDF ==&lt;br /&gt;
Cette méthode permet justement de gérer automatiquement les mots-outils d&#039;un corpus, sans que l&#039;utilisateur ait besoin de rentrer une liste au préalable.&lt;br /&gt;
&lt;br /&gt;
=== Présentation de la méthode sur une quantité de données réduite ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous utiliserons les textes suivants, l&#039;exemple portera sur le texte 3.&lt;br /&gt;
&lt;br /&gt;
*Texte 1 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rétrograde.&lt;br /&gt;
&lt;br /&gt;
Tu devrais ajouter un bouton à ton pardessus, lui dit son ami. Je le rencontrai au milieu de la cour de Rome, après l&#039;avoir quitté se précipitant avec avidité vers une place assise. Il venait de protester contre la poussée d&#039;un autre voyageur, qui, disait-il, le bousculait chaque fois qu&#039;il descendait quelqu&#039;un. Ce jeune homme décharné était porteur d&#039;un chapeau ridicule. Cela se passa sur la plate-forme d&#039;un S complet ce midi-là.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 2 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Distinguo.&lt;br /&gt;
&lt;br /&gt;
Dans un autobus (qu&#039;il ne faut pas prendre pour un autre obus), je vis (et pas avec mon vit) un personnage (qui ne perd son âge) coiffé d&#039;un feutre mou bleu (et non de foutre blême), feutre cerné d&#039;un fil tressé (et non de tril fessé). Il disposait (et non dix posait) d&#039;un long cou (et pas d&#039;un loup con). Comme la foule se bousculait (non que la boule se fousculât), un nouveau voyageur (non veau nouillageur) déplaça le susdit (et non suça ledit plat). Cestuy râla (et non cette huître hala), mais voyant une place libre (et non ployant une vache ivre) s&#039;y précipita (et non si près s&#039;y piqua).&lt;br /&gt;
Plus tard je l&#039;aperçus (non pas gel à peine su) devant la gare Saint-Lazare (et non là ou l&#039;hagard ceint le hasard) qui parlait avec un copain (il n&#039;écopait pas d&#039;un pralin) au sujet d&#039;un bouton de son manteau (qu&#039;il ne faut pas confondre avec le bout haut de son menton).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Texte 3 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Passé indéfini.&lt;br /&gt;
&lt;br /&gt;
Je suis monté dans l&#039;autobus de la porte Champerret. Il y avait beaucoup de monde, des jeunes, des vieux, des femmes, des militaires. J&#039;ai payé ma place et puis j&#039;ai regardé autour de moi. Ce n&#039;était pas très intéressant. J&#039;ai quand même fini par remarquer un jeune homme dont j&#039;ai trouvé le cou trop long. J&#039;ai examiné son chapeau et je me suis aperçu qu&#039;au lieu d&#039;un ruban il y avait un galon tressé. Chaque fois qu&#039;un nouveau voyageur montait, ça faisait de la bousculade. Je n&#039;ai rien dit, mais le jeune homme au long cou a tout de même interpellé son voisin. Je n&#039;ai pas entendu ce qu&#039;il lui a dit, mais ils se sont regardés d&#039;un sale oeil. Alors, le jeune homme au long cou est allé s&#039;asseoir précipitamment. En revenant de la porte Champerret, je suis passé devant la gare Saint-Lazare. &lt;br /&gt;
J&#039;ai vu mon type qui discutait avec un copain. Celui-ci a désigné du doigt un bouton juste au-dessus de l&#039;échancrure du pardessus. Puis l&#039;autobus m&#039;a emmené et je ne les ai plus vus. J&#039;étais assis et je n&#039;ai pensé à rien.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF ====&lt;br /&gt;
&lt;br /&gt;
Le TF (Term-Frequency) d&#039;un terme, autrement appelé la fréquence « brute » est précisément le nombre d’occurrences de ce terme dans un texte. Par abus de langage, on parle de « fréquence ». Comme cette méthode a déjà été vue précédemment, nous nous contenterons ici de calculer le TF pour des mots qui nous serviront d&#039;exemple pour la suite et d&#039;introduire une fonction qui permettra de calculer le TF d&#039;un mot dans un texte.&lt;br /&gt;
Pour le texte 3, on a donc :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TF = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TF = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TF = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TF = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Nous retrouvons donc le même problème que précédemment où les mots-outils sont mis en avant.&lt;br /&gt;
&lt;br /&gt;
Le code de la fonction qui permet de calculer le TF d&#039;un mot dans un texte est disponible ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_TF(fichier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    fichier : fichier texte que l&#039;on va parcourir&lt;br /&gt;
    mot : chaîne de caractères dont on souhaite compter le nombre d&#039;apparitions&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    f = open(fichier, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
    ligne = f.readline()&lt;br /&gt;
    Freq = ligne.count(mot)&lt;br /&gt;
    f.close()&lt;br /&gt;
    return Freq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== L&#039;IDF ====&lt;br /&gt;
&lt;br /&gt;
Pour palier au problème que pose le TF, nous introduisons l&#039;IDF. En effet, avec la méthode des TF tous les termes qui apparaissent dans un document avec la même fréquence auront la même importance. Or, les termes qui se trouvent dans peu de documents permettent de mieux différencier ces derniers des textes dans lesquels ils se trouvent en nombre élevé. Ces termes ont donc un pouvoir de discrimination plus grand que celui des termes apparaissant dans beaucoup de documents. L&#039;IDF (inverse document frequency) est une mesure de l&#039;importance du terme dans l&#039;ensemble du corpus. La formule de l&#039;idf est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;idf_{t}=\ln{\frac{N}{df_{t}}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* où &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; est le nombre total de documents dans le corpus&lt;br /&gt;
* et &amp;lt;math&amp;gt;df_{t}&amp;lt;/math&amp;gt; le nombre de documents où le terme &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; apparaît (on doit avoir &amp;lt;math&amp;gt;df_{t} \ne 0 &amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
On cherchera donc d&#039;abord à créer une fonction qui permette de calculer le df d&#039;un mot dans un corpus de textes. Cette fonction prend en argument un dossier de fichiers textes (le corpus de documents) et un mot pour lequel on souhaite calculer le df. Elle renvoie le df de ce mot, c&#039;est-à-dire le nombre de fichiers où ce mot apparaît.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_df(dossier,mot):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre le df&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    mot = mot.lower()&lt;br /&gt;
    mot = mot.strip()&lt;br /&gt;
    mot = &amp;quot; &amp;quot; + mot + &amp;quot; &amp;quot;&lt;br /&gt;
    os.chdir(dossier)&lt;br /&gt;
    liste_fichiers = os.listdir(dossier)&lt;br /&gt;
    nombre_doc = 0&lt;br /&gt;
    for c in liste_fichiers :&lt;br /&gt;
        f = open(c, mode = &amp;quot;r&amp;quot;)&lt;br /&gt;
        texte = f.readline()&lt;br /&gt;
        if mot in texte :&lt;br /&gt;
            nombre_doc = nombre_doc + 1&lt;br /&gt;
        f.close()&lt;br /&gt;
    return nombre_doc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction qui permet de calculer l&#039;idf d&#039;un terme est donc définie simplement de la manière suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def calcul_idf(dossier,mot,nombre_docs):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dossier : dossier de fichiers textes (corpus de documents)&lt;br /&gt;
    mot : mot dont on souhaite connaitre l&#039;idf&lt;br /&gt;
    nombre_docs : entier représentant le nombre de documents du corpus&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return log(nombre_docs / (calcul_df(dossier,mot)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En utilisant ces fonctions, on peut donc avoir l&#039;idf des mots du texte 3 pour lesquels nous avons calculé le tf précédemment :&lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{3}}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{2}} \approx 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;idf=\ln{\frac{3}{1}} \approx 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Le TF-IDF ====&lt;br /&gt;
&lt;br /&gt;
Le TF-idf s&#039;obtient en multipliant les deux valeurs obtenues :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;TFidf_{t} = TF_{t} \times idf_{t} &amp;lt;/math&amp;gt;&lt;br /&gt;
où &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; est le terme pour lequel on calcule le TF-idf.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;exemple précédent (texte 3), on a donc : &lt;br /&gt;
* Pour le mot « un », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « de », &amp;lt;math&amp;gt;TFidf = 7 \times 0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « homme », &amp;lt;math&amp;gt;TFidf = 3 \times 0,405 = 1,215&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « autobus », &amp;lt;math&amp;gt;TFidf = 2 \times 0,405 = 0,81&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « pardessus », &amp;lt;math&amp;gt;TFidf = 1 \times 0,405 = 0,405&amp;lt;/math&amp;gt;&lt;br /&gt;
* Pour le mot « ruban », &amp;lt;math&amp;gt;TFidf = 1 \times 1,099 = 1,099&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient donc les mots par ordre de pertinence : homme, autobus, pardessus, un, de. Cela a permis de supprimer les mots-outils qui se trouvaient dans les 3 documents et de faire ressortir d&#039;autres mots importants. &lt;br /&gt;
&lt;br /&gt;
Le mot « homme » à quant à lui le TF-idf le plus élevé, car il apparaît 3 fois dans le texte 3 et apparaît uniquement dans 2 textes sur 3 du corpus. &lt;br /&gt;
&lt;br /&gt;
Le mot « ruban » a un TF-idf plus élevé que les mots « autobus » et « pardessus » alors qu&#039;il n’apparaît qu&#039;une seule fois dans le texte 3, mais c&#039;est parce qu&#039;il n’apparaît que dans le texte 3, ce qui montre bien que le TF-idf permet de mettre en avant les spécificités de chaque texte.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la méthode sur le corpus de textes ===&lt;br /&gt;
&lt;br /&gt;
=== Exemples qui permettent de souligner les spécificités de certaines textes du corpus ===&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
== Annexes ==&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;/div&gt;</summary>
		<author><name>Bouvier</name></author>
	</entry>
</feed>