Polydesk-logotype
Polydesk.ai — Header

Bigram (Bigramme)

Un bigram est une séquence de deux éléments consécutifs (mots, caractères ou syllabes) extraits d’un texte. C’est un n-gram avec n=2. En NLP, les bigrams de mots comme « intelligence artificielle », « machine learning » ou « New York » capturent les co-occurrences locales que les mots isolés (unigrams) ne peuvent pas représenter.

Pour la phrase « Le traitement du langage naturel », les bigrams sont : « Le traitement », « traitement du », « du langage », « langage naturel ». Certains de ces bigrams sont des collocations significatives (« langage naturel »), d’autres sont de simples adjacences sans signification propre (« Le traitement »). Identifier les bigrams pertinents est l’un des enjeux clés du preprocessing en NLP.

Bigram en bref
Catégorie
N-gram avec n=2
Synonyme
Bigramme, 2-gram, paire de mots
Usage principal
Collocations, features TF-IDF, modèles de langage, prédiction de texte
Librairies
NLTK (BigramCollocationFinder), scikit-learn (ngram_range), spaCy, Gensim
Métriques
PMI, Log-Likelihood Ratio, Chi-carré, t-test

Pourquoi les bigrams sont importants

Le problème fondamental du bag-of-words à base d’unigrams est la perte totale de contexte. Les mots « intelligence » et « artificielle » sont deux features indépendantes, alors qu’ensemble ils forment un concept unique. Le bigram « intelligence artificielle » capture cette co-occurrence et la transforme en un feature atomique avec son propre poids TF-IDF.

Les bigrams permettent aussi de distinguer des sens différents. « New York » est un lieu, pas deux mots séparés. « machine learning » est un domaine, pas une machine qui apprend. « ice cream » n’est ni de la glace ni de la crème. Sans bigrams, ces concepts composés sont fragmentés et perdent leur sens.

En modélisation du langage, le modèle bigramme est le premier niveau qui introduit du contexte : il prédit le mot suivant en se basant sur le mot précédent. P(artificielle | intelligence) est beaucoup plus élevée que P(artificielle) seul. Les phrases générées par un modèle bigramme montrent déjà une cohérence locale mot-à-mot, même si les dépendances à plus longue distance restent invisibles.

Bigrams et collocations

Tous les bigrams ne se valent pas. « Le chat » est un bigram fréquent mais peu informatif : « Le » précède presque n’importe quel nom. « Intelligence artificielle » est un bigram moins fréquent mais beaucoup plus significatif : ces deux mots ont une forte tendance à apparaître ensemble, bien au-delà de ce que le hasard prédirait.

Les collocations sont des expressions multi-mots qui co-occurrent significativement plus souvent que prévu par le hasard. Identifier les collocations parmi tous les bigrams possibles est un problème classique en linguistique computationnelle. Plusieurs métriques statistiques permettent de les détecter.

Pointwise Mutual Information (PMI)

Le PMI mesure à quel point deux mots co-occurrent plus (ou moins) que ce que le hasard prédirait :

PMI(w1, w2) = log2( P(w1, w2) / (P(w1) × P(w2)) )

Un PMI élevé signifie que w1 et w2 apparaissent ensemble bien plus souvent qu’attendu. Le problème du PMI est sa sensibilité aux bigrams rares : si « xyz abc » n’apparaît qu’une fois et que « xyz » et « abc » n’apparaissent jamais séparément, le PMI sera maximal, alors que ce bigram est probablement du bruit. C’est pourquoi le PMI est toujours combiné avec un filtre de fréquence minimale.

Log-Likelihood Ratio

Le test de rapport de vraisemblance (likelihood ratio) est souvent préféré au PMI en pratique. Il est moins sensible aux événements rares et fonctionne mieux sur les petits corpus. Il teste l’hypothèse nulle que les deux mots sont indépendants contre l’hypothèse alternative qu’ils sont associés. Un score élevé indique une forte association.

Student’s t-test et Chi-carré

Le t-test compare la fréquence observée du bigram avec la fréquence attendue sous l’hypothèse d’indépendance. Le test du chi-carré fait de même avec une approche basée sur les tables de contingence. Ces tests sont classiques en statistique et sont disponibles dans NLTK via BigramAssocMeasures.

Implémentation en Python

Extraction de bigrams avec NLTK

import nltk
from nltk import bigrams
from nltk.tokenize import word_tokenize

phrase = "Le machine learning transforme l'intelligence artificielle"
tokens = word_tokenize(phrase, language='french')

# Générer les bigrams
bi = list(bigrams(tokens))
print(bi)
# [('Le', 'machine'), ('machine', 'learning'), ('learning', 'transforme'),
#  ('transforme', "l'intelligence"), ("l'intelligence", 'artificielle')]

Détection de collocations avec BigramCollocationFinder

NLTK fournit BigramCollocationFinder, un outil puissant pour identifier les bigrams statistiquement significatifs dans un corpus :

import nltk
from nltk.collocations import BigramCollocationFinder, BigramAssocMeasures
from nltk.corpus import stopwords

# Charger un corpus (ici les mots de brown corpus)
words = [w.lower() for w in nltk.corpus.brown.words()]

# Créer le finder de collocations
bigram_measures = BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(words)

# Filtrer les stopwords et mots courts
stop_words = set(stopwords.words('english'))
finder.apply_word_filter(lambda w: len(w) < 3 or w in stop_words)

# Filtrer les bigrams rares (fréquence minimum 10)
finder.apply_freq_filter(10)

# Top 10 collocations par likelihood ratio
top_collocations = finder.nbest(bigram_measures.likelihood_ratio, 10)
print(top_collocations)
# [('hong', 'kong'), ('new', 'york'), ('united', 'states'), ...]

# Top 10 par PMI
top_pmi = finder.nbest(bigram_measures.pmi, 10)
print(top_pmi)

L’ordre des filtres est important. Appliquez d’abord le filtre de mots (stopwords, mots courts), puis le filtre de fréquence. L’inverse donnerait des résultats différents car le filtre de fréquence se base sur les comptages avant ou après le filtrage des mots.

PMI vs Likelihood Ratio : lequel choisir ? Le PMI favorise les bigrams rares composés de mots rares (score très élevé mais peu de preuves statistiques). Le likelihood ratio est plus robuste et préfère les bigrams pour lesquels il existe davantage de preuves statistiques. En pratique, utilisez le likelihood ratio pour la découverte de collocations générales, et le PMI (avec un filtre de fréquence strict) pour identifier les expressions techniques ou spécialisées.

Bigrams comme features avec scikit-learn

Pour la classification de texte, les bigrams sont intégrés comme features via le paramètre ngram_range de TfidfVectorizer ou CountVectorizer :

from sklearn.feature_extraction.text import TfidfVectorizer

corpus = [
    "Le deep learning révolutionne la vision par ordinateur",
    "Le machine learning classique reste performant",
    "La vision par ordinateur utilise des réseaux de neurones"
]

# Unigrams + bigrams
vectorizer = TfidfVectorizer(ngram_range=(1, 2))
X = vectorizer.fit_transform(corpus)

# Voir les features bigrams
features = vectorizer.get_feature_names_out()
bigram_features = [f for f in features if ' ' in f]
print("Bigrams détectés :", bigram_features)
# ['deep learning', 'de neurones', 'la vision', 'le deep', 'le machine',
#  'learning classique', 'learning révolutionne', 'machine learning',
#  'par ordinateur', 'réseaux de', 'reste performant', 'vision par', ...]

Les bigrams « deep learning », « machine learning », « par ordinateur » et « réseaux de » sont automatiquement extraits et reçoivent chacun leur propre score TF-IDF. Un classifieur peut alors exploiter ces features composés pour une classification plus fine que les unigrams seuls.

Détection automatique de bigrams avec Gensim

Gensim propose le module Phrases qui détecte automatiquement les bigrams significatifs dans un corpus et les concatène en un seul token (par exemple « machine_learning »). C’est particulièrement utile comme étape de prétraitement avant Word2Vec ou le topic modeling :

from gensim.models import Phrases
from gensim.models.phrases import Phraser

# Corpus tokenisé (liste de listes de mots)
corpus = [
    ["le", "machine", "learning", "est", "puissant"],
    ["le", "deep", "learning", "utilise", "des", "réseaux"],
    ["le", "machine", "learning", "classique", "reste", "utile"]
]

# Détecter les bigrams
bigram_model = Phrases(corpus, min_count=2, threshold=1)
phraser = Phraser(bigram_model)

# Appliquer la transformation
result = phraser[["le", "machine", "learning", "est", "puissant"]]
print(result)
# ['le', 'machine_learning', 'est', 'puissant']

Le paramètre threshold contrôle la sensibilité de la détection : une valeur basse détecte plus de bigrams (au risque de faux positifs), une valeur haute est plus conservatrice. Le min_count fixe la fréquence minimale pour qu’un bigram soit considéré.

Cas d’usage concrets

Extraction de mots-clés

Les bigrams à haut score PMI ou TF-IDF sont souvent les mots-clés les plus pertinents d’un document. Un article sur l’IA aura des bigrams distinctifs comme « réseau neuronal », « apprentissage profond », « modèle génératif » qui identifient immédiatement le sujet.

Classification de texte améliorée

L’ajout de bigrams à un modèle TF-IDF améliore la précision de classification dans la plupart des cas. Les bigrams permettent de distinguer des catégories que les unigrams confondent. Par exemple, « marché financier » et « marché alimentaire » contiennent le même unigram « marché » mais des bigrams différents qui les séparent clairement.

Topic modeling

En concaténant les bigrams significatifs en un seul token avant d’appliquer LDA (Latent Dirichlet Allocation) ou NMF, les topics deviennent plus interprétables. Un topic contenant « machine_learning, deep_learning, réseau_neuronal » est immédiatement compréhensible, contrairement à un topic avec les mots séparés « machine, learning, deep, réseau, neuronal » mélangés à d’autres termes.

Prédiction de texte

Les modèles bigrammes sont la base de l’autocomplétion. Si l’utilisateur tape « machine », le modèle calcule P(mot | machine) pour tous les mots du vocabulaire et propose les plus probables : « learning », « virtuelle », « à ». Les claviers de smartphones utilisent ce principe, enrichi de modèles plus sophistiqués.

SEO et analyse de contenu

L’analyse des bigrams les plus fréquents dans un corpus de pages web concurrentes révèle les expressions clés du domaine. C’est une technique courante en SEO assisté par l’IA pour identifier les thèmes couverts par la concurrence et les lacunes à exploiter.

Bigrams de caractères

Les bigrams ne se limitent pas aux mots. Les bigrams de caractères découpent le texte en paires de caractères consécutifs. Pour le mot « chat », les bigrams de caractères sont : « ch », « ha », « at ». Cette approche est utilisée pour la détection de langue (chaque langue a une distribution de bigrams de caractères unique), la correction orthographique et le matching approximatif. En français, les bigrams de caractères les plus fréquents incluent « de », « le », « en », « es », « re ».

scikit-learn supporte les bigrams de caractères via TfidfVectorizer(analyzer='char', ngram_range=(2,2)) ou analyzer='char_wb' (qui respecte les frontières de mots).

Bigrams dans les modèles de langage

Un modèle de langage bigramme estime la probabilité d’une phrase en la décomposant en probabilités conditionnelles de chaque bigram. Pour la phrase « Le chat dort », le modèle calcule :

P("Le chat dort") ≈ P(Le|<s>) × P(chat|Le) × P(dort|chat) × P(</s>|dort)

Les probabilités sont estimées par comptage sur le corpus d’entraînement : P(chat|Le) = count("Le chat") / count("Le"). Ce calcul par maximum de vraisemblance (MLE) est simple mais pose un problème critique : tout bigram absent du corpus reçoit une probabilité de zéro, ce qui annule la probabilité de toute phrase le contenant.

Les techniques de lissage résolvent partiellement ce problème. Le lissage de Laplace (add-one) ajoute 1 au comptage de chaque bigram. L’interpolation linéaire combine les probabilités unigrammes et bigrammes avec des poids appris. Le backoff recule vers l’unigramme quand le bigram n’est pas observé. Ces approches sont fondamentales en théorie des modèles de langage, même si les transformers modernes les ont rendues obsolètes pour la génération de texte.

La perplexité est la métrique standard pour évaluer un modèle de langage bigramme. Elle mesure à quel point le modèle est « surpris » par un texte de test. Un modèle bigramme bien entraîné sur un corpus de grande taille atteint typiquement une perplexité de 100 à 300 sur un texte anglais général, contre 50 à 150 pour un trigram et moins de 30 pour les LLM modernes.

Bonnes pratiques

Appliquez toujours un filtre de fréquence avant d’utiliser les métriques d’association. Un bigram qui n’apparaît qu’une ou deux fois dans le corpus n’offre pas assez de preuves statistiques pour être considéré comme une collocation fiable, quelle que soit son score PMI ou likelihood ratio. Un seuil de min_count=5 ou min_count=10 est un bon point de départ.

Filtrez les stopwords avant la détection de collocations. Sans ce filtrage, les bigrams les plus fréquents seront des paires comme « de la », « le plus », « dans le » qui n’apportent aucune information. Le filtre NLTK apply_word_filter(lambda w: len(w) < 3 or w in stop_words) élimine les mots courts et les stopwords en une seule passe.

Pour la classification de texte, testez toujours les bigrams en complément des unigrams (ngram_range=(1,2)) plutôt que seuls (ngram_range=(2,2)). Les unigrams restent la base du vocabulaire, les bigrams ajoutent les expressions composées. Les trigrams (ngram_range=(1,3)) apportent rarement un gain significatif par rapport aux bigrams et multiplient la taille du vocabulaire.

Pour la concaténation de bigrams (Gensim Phrases), appliquez deux passes successives si vous voulez aussi capturer des trigrams : la première passe détecte les bigrams (« machine_learning »), la seconde détecte les bigrams de bigrams (« deep_machine_learning » à partir de « deep » + « machine_learning »). C’est l’approche standard avant le topic modeling avec LDA.

Limites des bigrams

Le contexte reste limité à deux mots. Des expressions comme « réseau de neurones » nécessitent un trigram pour être capturées correctement. L’ajout de bigrams explose le vocabulaire : un corpus de 10 000 unigrams peut générer 100 000+ bigrams, dont la plupart sont du bruit. Les filtres de fréquence et les métriques d’association sont indispensables pour sélectionner les bigrams significatifs. Enfin, les bigrams ne capturent que les adjacences : « intelligence … artificielle » avec un mot intercalé (« intelligence véritablement artificielle ») échappe à la détection standard. Le skip-gram de Word2Vec résout partiellement ce problème en autorisant des fenêtres de contexte plus larges.


Questions fréquentes sur les bigrams

Qu’est-ce qu’un bigram en NLP ?

Un bigram est une séquence de deux mots (ou caractères) consécutifs extraits d’un texte. C’est un n-gram avec n=2. Exemples : « intelligence artificielle », « machine learning », « New York ». Les bigrams capturent les co-occurrences locales que les mots isolés ne représentent pas, ce qui améliore la classification de texte, l’extraction de mots-clés et les modèles de langage.

Quelle est la différence entre bigram et collocation ?

Un bigram est toute paire de mots consécutifs dans un texte (y compris « le chat », « de la »). Une collocation est un bigram statistiquement significatif, c’est-à-dire une paire de mots qui co-occurrent bien plus souvent que le hasard ne le prédirait (comme « intelligence artificielle » ou « New York »). Les collocations sont identifiées par des métriques comme le PMI, le likelihood ratio ou le chi-carré.

Comment détecter les bigrams significatifs en Python ?

Trois approches principales. Avec NLTK : utilisez BigramCollocationFinder.from_words() combiné avec BigramAssocMeasures().likelihood_ratio ou .pmi pour scorer les bigrams. Avec scikit-learn : utilisez TfidfVectorizer(ngram_range=(1,2)) pour intégrer les bigrams comme features. Avec Gensim : utilisez Phrases(corpus) pour détecter automatiquement les bigrams significatifs et les concaténer en tokens uniques (« machine_learning »).

Faut-il utiliser le PMI ou le likelihood ratio pour les collocations ?

Le likelihood ratio est plus robuste pour un usage général : il est moins sensible aux bigrams rares et fonctionne bien sur les petits corpus. Le PMI est meilleur pour identifier les expressions techniques ou de niche, mais nécessite un filtre de fréquence strict (apply_freq_filter(10) minimum) pour éviter les faux positifs. En pratique, comparez les deux sur votre corpus et choisissez celui qui produit les résultats les plus pertinents pour votre tâche.

Les bigrams améliorent-ils vraiment la classification de texte ?

Dans la plupart des cas, oui. L’ajout de bigrams (ngram_range=(1,2)) à un modèle TF-IDF capture des expressions composées discriminantes que les unigrams seuls manquent. Le gain est particulièrement net quand votre corpus contient beaucoup de termes composés (domaines techniques, scientifiques, juridiques). Cependant, les bigrams augmentent aussi la dimensionnalité : utilisez max_features et min_df pour contrôler la taille du vocabulaire et éviter l’overfitting.

Polydesk.ai — Footer