One Hot Encoding et Bag of Words : Comprendre les différences.


Dans cet article, nous analysons deux méthodes populaires de représentation numérique du texte en NLP.

Vous découvrirez comment le one hot encoding et le bag of words permettent de transformer des données textuelles pour les rendre exploitables par des machines. Nous aborderons leurs spécificités, avantages et limites, en illustrant le tout avec des exemples concrets d’implémentation en Python pour optimiser vos projets en traitement du langage naturel.

En traitement du langage naturel ( NLP ), nous cherchons à donner aux machines la capacité de comprendre le langage humain. C’est intéressant non ! Mais un grand problème se pose : les hommes communiquent avec des phrases, des mots… alors que les machines ne comprennent que des nombres. Il devient alors important de pouvoir faire la traduction d’un texte écrit dans un langage humain vers un langage machine.

Lors de l’épisode précédent , nous avons abordé l’étape de prétraitement qui est plus que nécessaire pour pouvoir attaquer la traduction et ensuite passer au traitement du langage naturel NLP.

Dans cet épisode, nous nous fixons comme objectif de transformer les mots contenus dans un texte en nombres pour qu’ils puissent être interprétés  par l’ordinateur.

Pour réussir cette tâche, il existe plusieurs approches, nous nous focaliserons sur celles les plus simples à réaliser telles que le one hot encoding et le bag of words. Dans les prochains épisodes, nous toucherons aux techniques les plus récentes et plus efficaces.

I.One Hot Encoding : Comprendre les différences

Le One Hot Encoding fait référence au  processus par lequel les variables catégorielles sont converties sous forme de vecteurs binaires (0,1) dans lesquelles chaque vecteur contient un seul 1 .

En matière de traitement de langage naturel NLP, pourquoi aurait-on besoin du one hot encoding ?

En effet, nous avons précédemment soulevé le sujet de la traduction d’un texte écrit en langue humaine vers le langage machine. La machine ne connaissant que le binaire (0 et 1) il serait alors judicieux d’utiliser le one hot encoding pour représenter nos mots.

Comment cela marche exactement ? Définissons d’abord de manière claire et concise quelques termes qui nous seront utiles par la suite.

Disons que nous avons un livre écrit en Français. 

Vocabulaire: Nous définissons comme vocabulaire V, le nombre de mots distincts contenus dans le livre. 

Corpus: On appelle corpus, le texte contenu dans le livre. Un corpus est donc un ensemble de mots. 

Vecteur: Un vecteur (one hot encoding) dans notre contexte est un ensemble de 0 et 1 qui permet de représenter un mot de notre corpus. Pour chaque mot wi de notre vocabulaire, on peut le représenter avec un vecteur de taille N,N étant le nombre de mots contenus dans notre vocabulaire V, [0,0,0,..,1,…,0,0] tel que le i ème élément prend 1 et les autres 0. Chaque phrase de notre corpus sera alors représentée par l’ensemble des vecteurs  one hot encoding de chacun de ses mots.

Pour expliquer de manière simple le one hot encoding, prenons un exemple trivial :

Le NLP est une branche de l’intelligence artificielle.

Nous disposons d’une phrase composée de 8 mots distincts, notre vocabulaire V comprend donc 8 mots : { « Le », « NLP », « est », « une », « branche », « de » , »intelligence », »artificielle »} ( On considère ici que « l’ » a été changé en « le » )

Pour donc représenter chaque mot de notre vocabulaire, on aura un vecteur composé de 0 sauf pour le i ème élément qui sera 1.

Donc Le aura comme vecteur one hot encoding : [ 1 0 0 0 0 0 0 0 ]. NLP aura comme vecteur [ 0 1 0 0 0 0 0 0 ]. Et ainsi de suite. Notre phrase pourra alors être représenter par la matrice contenue dans le tableau ci dessous :

Le

1

0

0

0

0

0

0

0

NLP

0

1

0

0

0

0

0

0

est

0

0

1

0

0

0

0

0

une

0

0

0

1

0

0

0

0

branche

0

0

0

0

1

0

0

0

de

0

0

0

0

0

1

0

0

le

1

0

0

0

0

0

0

0

intelligence

0

0

0

0

0

0

1

0

artificielle

0

0

0

0

0

0

0

1

Comme vous le voyez, c’est assez trivial.
Ainsi nous pouvons représenter la phrase comme une matrice de 9*8 où chaque ligne est un vecteur one hot encoding d’un mot. La taille d’un vecteur pour un mot donné dépend donc de la taille de notre vocabulaire. Ceci constitue le principal inconvénient de cette technique, en effet plus le corpus devient grand, plus la taille du vocabulaire est susceptible d’augmenter. Et une langue dispose en général de plusieurs milliers de mots distincts. On peut alors vite se retrouver avec des matrices ayant des tailles énormes.

L’autre désavantage du one hot encoding est qu’il ne permet pas vraiment d’avoir des informations sur la sémantique ou même le contexte d’un mot, son seul but étant de transformer une valeur catégorique en valeur numérique. Il existe alors d’autres techniques beaucoup plus à jour et plus adaptée au domaine du traitement de langage naturel ( NLP ).

II. Bag Of Words : Comprendre les différences

Le modèle du sac de mots Bag Of Words est une représentation simplifiée utilisée dans le traitement du langage naturel et la recherche d’information (IR). Dans ce modèle, un texte (comme une phrase ou un document) est représenté comme le sac (multiset) de ses mots, sans tenir compte de la grammaire et même de l’ordre des mots mais seulement en conservant la multiplicité. (Wikipedia).

Comme pour le One Hot Encoding, le Bag of words permet donc de faire la représentation numérique d’un texte de façon à ce qu’il soit compréhensible par la machine.

Ici la représentation vectorielle du texte  décrit l’occurrence des mots présents dans une entrée (un document, une phrase).
L’idée derrière cette approche est très simple, vous allez voir.

Avec les termes définis dans la partie précédente, supposons que nous disposons d’un corpus composé de N mots distincts. La taille de notre vocabulaire V est donc N.

Pour faire la représentation d’une phrase, nous définissons un vecteur de longueur fixe N, chaque élément i du vecteur représente un mot de notre vocabulaire.

Comment faire pour connaître les valeurs d’un vecteur représentant une phrase ? Chaque élément i a pour valeur le nombre d’occurrences du mot dans la phrase.

Prenons un exemple simple pour comprendre le concept. Nous disposons du corpus suivant :

La vie est courte mais la vie peut paraître longue. 

La nuit est proche .

Notre vocabulaire V est donc composé des mots suivants : { « la », »vie », »est », « courte », « mais », « peut », « paraître », « longue », « nuit », « proche » }. Pour représenter une phrase, nous aurons donc besoin d’un vecteur de taille 10 ( le nombre de mots de notre vocabulaire).

La première phrase sera représenté comme suit : [ 2 2 1 1 1 1 1 1 0 0 ]

On voit d’après cette représentation que la et vie sont présentes deux fois dans la phrase , les autres mots est, courte, mais, peut, paraître et longue ne sont présentes qu’une seule fois tandis que les mots comme nuit et proche n’apparaissent pas dans la phrase.

Le même procédé est appliqué au niveau de la deuxième phrase obtenir son vecteur Bag of words

La deuxième phrase quant à elle : [ 1 0 1 0 0 0 0 0 1 1 ]

Le problème avec cette méthode est qu’elle ne permet pas de déterminer la signification du texte ou d’extraire le contexte dans lequel les mots apparaissent. Elle ne nous donne comme information que l’occurrence des mots dans une phrase.
Malgré tout, le Bag of words reste un moyen d’extraire des entités du texte pour les utiliser comme entrée dans des algorithmes de Machine Learning  dans le cas de la classification des documents.

Pour obtenir une meilleure représentation des deux techniques présentées dans cette épisode, il ne faut pas oublier qu’il est nécessaire de faire au préalable le prétraitement des données évoqués dans l’épisode précédent.

  • Réaliser l’implémentation de One Hot Encoding et Bag Of Words en NLP.

Dans cette partie nous allons faire une petite implémentation en Python des deux techniques présentées ci-dessus. Comme toujours si vous n’aimez pas les codes, vous pouvez sauter à la conclusion :).

Commençons par le One Hot Encoding. Nous utiliserons les mêmes techniques que dans l’épisode précédent. Prenons un livre, choisissons-en une partie et faisons l’OHE de ses phrases.

Dans cette implémentation, nous utiliserons le livre Homer, téléchargé du Projet Guntenberg :

 

homer_response = requests.get(« https://web.archive.org/web/20211128034110/https://www.gutenberg.org/files/52927/52927-0.txt »)

 

homer_data = homer_response.text

 

homer_data = homer_data.split(« *** »)[2]

view raw

get_book.py hosted with by GitHub

Le livre est trop long, alors nous allons juste prendre 3 phrases et ce sera notre corpus. Ensuite, nous effectuons le prétraitement des données et créons notre vocabulaire.

 

text_stems_sid,text_lems_sid = process_data( » « .join(homer_data.split(« . »)[10:13]))

 

vocab = list(set(text_stems_sid))

 

print( » « .join(homer_data.split(« . »)[10:13]))

view raw

create_vocab.py hosted with by GitHub

Faisons maintenant le one hot encoding de la dernière phrase de ce texte en utilisant notre vocabulaire :

 

stems,lems = process_data(homer_data.split(« . »)[12])

 

print(homer_data.split(« . »)[12])

 

onehot_encoded = list()

 

for word in stems:

 

  letter = [0 for _ in range(len(set(text_stems_sid)))]

 

  print(word,vocab.index(word))

 

  letter[vocab.index(word)] = 1

 

  onehot_encoded.append(letter)

view raw

onehot.py hosted with by GitHub

One Hot Encoding

Comme on peut le deviner, le OHE du premier mot de cette phrase ( minerv ) sera composé de 0 sauf pour la 29e valeur qui sera 1 :

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Attaquons nous maintenant au Bag Of Words. Pour l’implémentation du bag of words, nous créons d’abord une fonction qui renvoie un vocabulaire en prenant en entrée un corpus. Ensuite, nous créons une autre fonction qui prend en entrée une phrase et un corpus et retourne le bag of words de la phrase.

 

import numpy as np

 

from nltk import word_tokenize

  
 

corpus = [« La vie est courte mais la vie peut paraître longue »,« La nuit est proche »]

  
 

#definir deux phrases du corpus

 

phrase_1 = « La vie est courte mais la vie peut paraître longue »

 

phrase_2 = « La nuit est proche »

  
 

# fonction retournant un vocabulaire

 

def vocabulary(corpus):

 

  voc = []

 

  for sentence in corpus:

 

      words = word_tokenize(sentence.lower())

 

      voc.extend(words)

 

      

 

  voc_clean= []

 

  for w in voc:

 

      if w not in voc_clean:

 

          voc_clean.append(w)

 

  return voc_clean

  
  
 

# fonction retournant un sac de mots

 

def bagofwords(sentence,corpus):

 

  vocab = vocabulary(corpus)

 

  sentence_words  = words = word_tokenize(sentence.lower())

 

  bag_of_words = np.zeros(len(vocab))

 

  for w_in_sentence in sentence_words :

 

      for i,w in enumerate(vocab) :

 

          if w == w_in_sentence :

 

              bag_of_words[i] += 1

 

  return bag_of_words

bag_of_words_fr.py hosted with by GitHub

Après avoir testé la fonction bagofwords avec les deux phrases, nous avons obtenu les résultats suivants :

 

print(bagofwords(phrase_1,corpus))

phrase1.py hosted with by GitHub

 

print(bagofwords(phrase_2,corpus))

view raw

phrase_2.py hosted with by GitHub

Dans cet épisode, nous avons présenté deux approches pour traduire les données textuelles sous une forme compréhensible pour l’ordinateur. One Hot Encoding et Bag Of Words sont deux techniques triviales, mais elles peuvent être utiles dans le Royaume du traitement du langage naturel NLP.

L’analyse de One Hot Encoding et Bag of Words : Comprendre les différences permet de choisir la technique la mieux adaptée à vos besoins en NLP. 

N’hésitez pas à lire notre article portant sur :Les techniques de prétraitement en traitement du langage naturel.

Pour ne pas ratez nos prochaines publications sur le sujet, cliquez ici !

 

fr_FRFrench
Retour en haut