Intelligence artificielle

John Samuel
CPE Lyon

Year: 2023-2024
Email: john(dot)samuel(at)cpe(dot)fr

Creative Commons License

4.1. Traitement automatique des langues naturelles (NLP)

Intelligence artificielle

Intelligence artificielle

4.1. Traitement automatique des langues naturelles

Le traitement automatique des langues (TAL) est un domaine interdisciplinaire de la linguistique informatique qui se concentre sur l'analyse et la compréhension du langage naturel (celui utilisé par les humains). Cette section aborde plusieurs aspects clés du TAL, notamment :

4.1. Traitement automatique des langues naturelles

Analyse de systèmes TAL

4.1.1. Racinisation

Racinisation [Frakes 2003]

4.1.1. Racinisation

Racinisation

Quelques exemples d'issues potentiellement non valides :

4.1.1. Racinisation

Racinisation

4.1.1. Racinisation

Racinisation: mesures d'évaluation [Frakes 2003]

4.1.1. Racinisation

Racinisation: distance de Hamming [Frakes 2003]

  1. La distance de Hamming entre deux chaînes de longueur égale est définie comme le nombre de caractères des deux chaînes qui sont différents à la même position.
  2. Pour les chaînes de longueur inégale, ajouter la différence de longueur à la distance de Hamming pour obtenir une fonction de distance de Hamming modifiée \(d\)
  3. Exemples
    • tri: try, tried, trying
    • \(d\)(tri, try)= 1
    • \(d\)(tri, tried)= 2
    • \(d\)(tri, trying)= 4

4.1.1. Racinisation

Racinisation: force [Frakes 2003]

  1. Le nombre moyen de mots par classe
  2. Facteur de compression de l'indice. Soit n est le nombre de mots dans le corpus et s est le nombre de racines. \[\frac{n - s}{n}\]
  3. Le nombre de mots et de racines qui diffèrent
  4. Le nombre moyen de caractères supprimés lors de la formation des racines
  5. La médiane et la moyenne de la distance de Hamming modifiée entre les mots et leur racine

4.1.1. Racinisation

Racinisation: similarité [Frakes 2003]

  1. Soit \(A1\) et \(A2\) sont deux algorithmes
  2. Soit \(W\) une liste de mots et \(n\) le nombre de mots dans \(W\) \[ M(A1,A2,W) = \frac{n}{\Sigma d(x_i, y_i)}\]
  3. pour tous les mots \(w_i\) en W, \(x_i\) est le résultat de l'application de \(A1\) à \(w_i\) et \(y_i\) est le résultat de l'application de \(A2\) à \(w_i\)
  4. des algorithmes plus similaires auront des valeurs plus élevées de M

4.1.1. Racinisation

Racinisation: nltk

L'objectif est de réduire les mots à leur forme de base ou racine, en éliminant les suffixes, ce qui permet de regrouper différentes formes d'un mot sous une forme commune.

4.1.1. Racinisation

Porter

L'algorithme de Porter, également connu sous le nom de stemmer de Porter, est un algorithme de racination (stemming) développé par Martin Porter en 1980. Son objectif est de réduire les mots à leur forme racine ou base en éliminant les suffixes couramment utilisés en anglais.

4.1.1. Racinisation

Porter

L'algorithme de Porter utilise une série de règles de racination pour réduire les mots à leur forme racine. Quelques-unes des règles de l'algorithme de Porter :

  1. Règles de suppression de suffixes :
    • "s" : Supprimer le suffixe "s" à la fin des mots.
    • "sses" : Remplacer par "ss" si la séquence se termine par "sses".
  2. Règles de traitement de suffixes spécifiques :
    • "eed" ou "eedly" : Remplacer par "ee" si la séquence se termine par "eed" ou "eedly".
    • "ed" : Supprimer "ed" à la fin du mot s'il y a une voyelle précédente.
    • "ing" : Supprimer "ing" à la fin du mot s'il y a une voyelle précédente.

4.1.1. Racinisation

Porter

  1. Règles de transformation de suffixes en d'autres suffixes :
    • "at" : Remplacer par "ate" si la séquence se termine par "at".
    • "bl" : Ajouter "e" à la fin si la séquence se termine par "bl".
  2. Règles de manipulation de la longueur des mots :
    • Si la séquence se termine par une consonne suivie de "y", remplacer par "i" à la fin.
    • Si la séquence se termine par deux consonnes, supprimer la dernière consonne si la précédente est une voyelle.
  3. Règles de manipulation des doubles consonnes :
    • Supprimer une lettre double à la fin du mot.

4.1.1. Racinisation

Racinisation: Porter

from nltk.stem.porter import PorterStemmer

words = ["words", "eating", "went", "engineer", "tried"]
porter = PorterStemmer()
for word in words:
    print(porter.stem(word), end=" ")

Affichage

word eat went engin tri

4.1.1. Racinisation

Snowball

L'algorithme de Snowball, également connu sous le nom de Snowball stemmer, est un algorithme de racination (stemming) développé par Martin Porter comme une extension de son algorithme de Porter. Snowball a été conçu pour être plus modulaire et extensible, permettant aux utilisateurs de créer des stemmers pour différentes langues en utilisant un ensemble commun de conventions.

Les caractéristiques principales de l'algorithme de Snowball :

4.1.1. Racinisation

Snowball

4.1.1. Racinisation

Racinisation: Snowball

from nltk.stem.snowball import SnowballStemmer

words = ["words", "eating", "went", "engineer", "tried"]
snowball = SnowballStemmer("english")
for word in words:
    print(snowball.stem(word))

Affichage

word eat went engin tri

4.1.2. Étiquetage morpho-syntaxique

Étiquetage morpho-syntaxique [Màrquez 2000]

4.1.2. Étiquetage morpho-syntaxique

Étiquetage morpho-syntaxique [Màrquez 2000]

Construction de modèles linguistiques

  1. Approche manuelle :
    • Construction de règles linguistiques manuelles pour analyser la structure linguistique
    • Exemple : Définir des règles pour identifier les parties du discours en fonction de la syntaxe.
  2. Approche statistique :
    • Utilisation de statistiques et de probabilités pour modéliser les relations linguistiques.
    • Collection de n-grammes (bi-grammes, tri-grammes, ...)
    • Ensemble de fréquences de cooccurrence
    • L'estimation de la probabilité d'une séquence de longueur n est calculée en tenant compte de son occurrence dans le corpus d'entraînement
  3. Apprentissage machine :
    • Utilisation de techniques d'apprentissage machine pour apprendre automatiquement des modèles linguistiques à partir de données d'entraînement.
    • Les algorithmes peuvent être entraînés à reconnaître des motifs et des structures linguistiques complexes

4.1.2. Étiquetage morpho-syntaxique

nltk: ngrams

from nltk import ngrams

sentence = "He went to school yesterday and attended the classes"
for n in range(1, 5):
    print("\n{}-grams".format(n))
    n_grams = ngrams(sentence.split(), n)
    for ngram in n_grams:
        print(ngram, end=" ")

4.1.2. Étiquetage morpho-syntaxique

nltk: ngrams (affichage)

1-grams
('He',) ('went',) ('to',) ('school',) ('yesterday',) ('and',) ('attended',) ('the',) ('classes',)
2-grams
('He', 'went') ('went', 'to') ('to', 'school') ('school', 'yesterday') ('yesterday', 'and') ('and', 'attended') ('attended', 'the') ('the', 'classes')
3-grams
('He', 'went', 'to') ('went', 'to', 'school') ('to', 'school', 'yesterday') ('school', 'yesterday', 'and') ('yesterday', 'and', 'attended') ('and', 'attended', 'the') ('attended', 'the', 'classes')
4-grams
('He', 'went', 'to', 'school') ('went', 'to', 'school', 'yesterday') ('to', 'school', 'yesterday', 'and') ('school', 'yesterday', 'and', 'attended') ('yesterday', 'and', 'attended', 'the') ('and', 'attended', 'the', 'classes')

4.1.2. Étiquetage morpho-syntaxique

nltk: pos_tag

from nltk import pos_tag, word_tokenize

sentence = "He goes to school daily"

tokens = word_tokenize(sentence)
print(pos_tag(tokens))

Affichage

[('He', 'PRP'), ('goes', 'VBZ'), ('to', 'TO'), ('school', 'NN'), ('daily', 'RB')]

4.1.2. Étiquetage morpho-syntaxique

nltk: pos_tag

[('He', 'PRP'), ('goes', 'VBZ'), ('to', 'TO'), ('school', 'NN'), ('daily', 'RB')]

Balise Signification
PRP pronoun, personal
VBZ verb, present tense, 3rd person singular
TO "to" as preposition
NN "noun, common, singular or mass
RB adverb

4.1.2. Étiquetage morpho-syntaxique

spaCy

Installation

$ pip3 install spacy
$ python3 -m spacy download en_core_web_sm

Usage

import spacy
nlp = spacy.load("en_core_web_sm")

4.1.2. Étiquetage morpho-syntaxique

spaCy

import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("He goes to school daily")
for token in doc:
    print(token.text, token.pos_, token.dep_)

He PRON nsubj
goes VERB ROOT
to ADP prep
school NOUN pobj
daily ADV advmod

4.1.2. Étiquetage morpho-syntaxique

spaCy: mots vides, forme, PoS, lemme

import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("He goes to school daily")
for token in doc:
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
            token.shape_, token.is_alpha, token.is_stop)

He -PRON- PRON PRP nsubj Xx True True
goes go VERB VBZ ROOT xxxx True False
to to ADP IN prep xx True True
school school NOUN NN pobj xxxx True False
daily daily ADV RB advmod xxxx True False

4.1.3. Lemmatisation

Lemmatisation [Gesmundo 2012]

4.1.3. Lemmatisation

Lemmatisation [Chrupała 2006, Gesmundo 2012]

4.1.3. Lemmatisation

nltk: WordNetLemmatizer

import nltk
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('averaged_perceptron_tagger')

4.1.3. Lemmatisation

nltk: WordNetLemmatizer (sans les balises PoS)

from nltk.stem import WordNetLemmatizer

sentence = "He went to school yesterday and attended the classes"
lemmatizer = WordNetLemmatizer()

for word in sentence.split():
    print(lemmatizer.lemmatize(word), end=' ')

Affichage

He went to school yesterday and attended the class

4.1.3. Lemmatisation

nltk: WordNetLemmatizer (avec les balises PoS)

from nltk.stem import WordNetLemmatizer
from nltk import word_tokenize, pos_tag
from nltk.corpus import wordnet as wn

# Check the complete list of tags http://www.nltk.org/book/ch05.html
def wntag(tag):
    if tag.startswith("J"):
        return wn.ADJ
    elif tag.startswith("R"):
        return wn.ADV
    elif tag.startswith("N"):
        return wn.NOUN
    elif tag.startswith("V"):
        return wn.VERB
    return None

4.1.3. Lemmatisation

nltk: WordNetLemmatizer (avec les balises PoS)

lemmatizer = WordNetLemmatizer()
sentence = "I went to school today and he goes daily"

tokens = word_tokenize(sentence)
for token, tag in pos_tag(tokens):
    if wntag(tag):
        print(lemmatizer.lemmatize(token, wntag(tag)), end=' ')
    else:
        print(lemmatizer.lemmatize(token), end=' ')

Affichage

I go to school today and he go daily

4.1.3. Lemmatisation

spaCy: mots vides, forme, PoS, lemme

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("I went to school today and he goes daily")

for token in doc:
    print(token.lemma_, end=' ')

-PRON- go to school today and -PRON- go daily

4.1.4. Morphologie

Morphologie

4.1.4. Morphologie

spaCy: mots vides, forme, PoS, lemme

import spacy
from spacy import displacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("He goes to school daily")

displacy.render(doc, style="dep", jupyter=True)

4.2. Word Embeddings

Word Embeddings (Incorporation de mots)

Les embeddings de mots sont une technique d'apprentissage de caractéristiques où des mots ou des phrases du vocabulaire sont associés à des vecteurs de nombres réels.

4.2. Word Embeddings

Word Embeddings (Incorporation de mots)

Avantages de Word Embeddings

4.2. Word Embeddings

Word Embeddings (Incorporation de mots)

Applications de Word Embeddings

4.2. Word Embeddings

spaCy

spaCy est une bibliothèque open-source pour le traitement du langage naturel (NLP) en Python. Elle offre des outils performants et efficaces pour effectuer diverses tâches de traitement du langage naturel, de l'analyse syntaxique à la reconnaissance d'entités nommées. spaCy est conçu pour être rapide, précis et facile à utiliser.

4.2. Word Embeddings

spaCy

4.2. Word Embeddings

spaCy

spaCy propose différents modèles linguistiques pré-entraînés pour différentes langues et tâches. Le modèle en_core_web_lg est un modèle vectoriel large d'anglais.

Installation du Modèle spaCy (en_core_web_lg) :

$ python3 -m spacy download en_core_web_lg

Chargement du Modèle spaCy :

import spacy

# Charger le modèle spaCy
nlp = spacy.load("en_core_web_lg")

4.2. Word Embeddings

spaCy

Avantages de spaCy :

4.2. Word Embeddings

spaCy

Limites de spaCy :

4.2. Word Embeddings

spaCy: similarity

import spacy

# Charger le modèle spaCy
nlp = spacy.load("en_core_web_lg")

# Définir les mots à comparer
words_to_compare = ["dog", "cat", "apple"]

# Calculer la similarité entre les paires de mots
for i in range(len(words_to_compare)):
    for j in range(i + 1, len(words_to_compare)):
        word1, word2 = words_to_compare[i], words_to_compare[j]
        doc1, doc2 = nlp(word1), nlp(word2)
        similarity_score = doc1.similarity(doc2)
        print("Similarité ({} / {}): {:.4f}".format(word1, word2, similarity_score))

4.2. Word Embeddings

spaCy: similarity

Affichage

Similarité (dog / cat): ...
Similarité (dog / apple): ...
Similarité (cat / apple): ...
                

4.2. Word Embeddings

spaCy: vector

import spacy

# Charger le modèle spaCy
nlp = spacy.load("en_core_web_sm")

# Texte à analyser
text_to_analyze = "cat"
doc = nlp(text_to_analyze)

# Imprimer les vecteurs de chaque jeton sur une seule ligne
vector_list = [token.vector for token in doc]
print("Vecteurs de '{}' : {}".format(text_to_analyze, vector_list))

4.3. Word2Vec

Word2Vec [Mikolov 2013]

Word2Vec a marqué un tournant significatif dans la représentation des mots dans le domaine de l'apprentissage automatique.

4.3. Word2Vec

Word2Vec [Mikolov 2013]

L'implémentation de Word2Vec se déroule en plusieurs étapes :

  1. Prétraitement des données : Le texte est nettoyé et prétraité pour éliminer les éléments indésirables tels que la ponctuation et les stopwords.
  2. Création d'un vocabulaire : Les mots uniques du corpus sont utilisés pour construire un vocabulaire. Chaque mot est ensuite associé à un index.
  3. Génération de paires mot-contexte : Pour chaque mot du corpus, des paires mot-contexte sont créées en utilisant une fenêtre contextuelle glissante. Ces paires servent d'exemples d'entraînement.
  4. Construction du modèle Word2Vec : Un modèle de réseau neuronal est créé, avec une couche d'entrée représentant les mots, une couche cachée (skip-gram ou CBOW), et une couche de sortie pour prédire le mot suivant dans le contexte.
  5. Entraînement du modèle : Le modèle est entraîné sur les paires mot-contexte générées, ajustant les poids du réseau pour minimiser la différence entre les prédictions et les vrais mots du contexte.
  6. Obtention des embeddings : Les vecteurs de mots appris pendant l'entraînement, appelés embeddings, sont extraits. Chaque mot du vocabulaire est maintenant représenté par un vecteur dense dans l'espace continu.

4.3. Word2Vec

Word2Vec

4.3.1. Context Bag of Words (CBOW)

Context Bag of Words (CBOW)

CBOW est un modèle spécifique de Word2Vec. Dans ce modèle, la prédiction du mot courant se fait en utilisant une fenêtre de mots contextuels voisins. L'ordre des mots de contexte n'influence pas la prédiction, ce qui en fait une approche robuste.

4.3.1. Context Bag of Words (CBOW)

Context Bag of Words (CBOW)

4.3.1. Context Bag of Words (CBOW)

gensim: cbow

import gensim
from nltk.tokenize import sent_tokenize, word_tokenize

# Données d'exemple
data = "This is a class. This is a table"

# Prétraitement des données en utilisant nltk pour obtenir des phrases et des mots
sentences = [word_tokenize(sentence.lower()) for sentence in sent_tokenize(data)]

# Construction du modèle CBOW avec Gensim
# min_count: Ignorer tous les mots dont la fréquence totale est inférieure à cette valeur.
# vector_size: Dimension des embeddings de mots
# window: Distance maximale entre le mot courant et le mot prédit dans une phrase
cbow_model = gensim.models.Word2Vec(sentences, min_count=1, vector_size=100, window=3, sg=0)
	

4.3.1. Context Bag of Words (CBOW)

gensim: cbow


# Affichage du vecteur du mot "this"
print("Vecteur du mot 'this':", cbow_model.wv["this"])

# Similarité entre les mots "this" et "class"
print("Similarité entre 'this' et 'class':", cbow_model.wv.similarity("this", "class"))

# Prédiction des deux mots les plus probables suivant le mot "is"
predicted_words = cbow_model.wv.most_similar(positive=["is"], topn=2)
print("Prédiction des mots suivant 'is':", predicted_words)
	

4.3.2. Skip-grams

Skip grams

Le modèle Skip-gram est une autre variante de Word2Vec qui se concentre sur la prédiction de la fenêtre voisine des mots de contexte à partir du mot courant.

4.3.2. Skip-grams

Skip grams

4.3.2. Skip-grams

gensim: skip-gram

import gensim
from nltk.tokenize import sent_tokenize, word_tokenize

# Données d'exemple
data = "This is a class. This is a table"

# Prétraitement des données en utilisant nltk pour obtenir des phrases et des mots
sentences = [word_tokenize(sentence.lower()) for sentence in sent_tokenize(data)]

# Construction du modèle Skip-gram avec Gensim
# min_count: Ignorer tous les mots dont la fréquence totale est inférieure à cette valeur.
# vector_size: Dimension des embeddings de mots
# window: Distance maximale entre le mot courant et le mot prédit dans une phrase
# sg: 1 pour skip-gram ; sinon CBOW.
skipgram_model = gensim.models.Word2Vec(sentences, min_count=1, vector_size=100, window=5, sg=1)

4.3.2. Skip-grams

gensim: skip-gram

# Affichage du vecteur du mot "this"
print("Vecteur du mot 'this':", skipgram_model.wv["this"])

# Similarité entre les mots "this" et "class"
print("Similarité entre 'this' et 'class':", skipgram_model.wv.similarity("this", "class"))

# Prédiction des mots les plus probables dans le contexte entourant le mot "is"
predicted_words = skipgram_model.wv.most_similar(positive=["is"], topn=2)
print("Prédiction des mots dans le contexte de 'is':", predicted_words)

4.4. Reconnaissance d'entités nommées (NER)

Reconnaissance d'entités nommées

La Reconnaissance d'Entités Nommées (NER) consiste à identifier et classer des entités spécifiques dans un texte. Ces entités peuvent inclure des personnes, des lieux, des organisations, des dates, des montants monétaires, etc. Le but est d'extraire des informations structurées à partir de données textuelles non structurées.

4.4. Reconnaissance d'entités nommées (NER)

Reconnaissance d'entités nommées

4.4. Reconnaissance d'entités nommées (NER)

Reconnaissance d'entités nommées : Algorithmes

La Reconnaissance d'Entités Nommées (NER) est souvent réalisée à l'aide de modèles d'apprentissage automatique, et plusieurs algorithmes peuvent être utilisés dans ce contexte. Quelques-uns des algorithmes couramment employés :

4.4. Reconnaissance d'entités nommées (NER)

Reconnaissance d'entités nommées : Algorithmes

4.4. Reconnaissance d'entités nommées (NER)

spaCy: Reconnaissance d'entités nommées

import spacy

# Charger le modèle spaCy
nlp = spacy.load("en_core_web_sm")

# Texte à analyser
text_to_analyze = "Paris is the capital of France. In 2015, its population was recorded as 2,206,488"

# Analyser le texte
doc = nlp(text_to_analyze)

4.4. Reconnaissance d'entités nommées (NER)

spaCy: Reconnaissance d'entités nommées

# Afficher les informations sur les entités
for entity in doc.ents:
    entity_text = entity.text
    start_char = entity.start_char
    end_char = entity.end_char
    label = entity.label_

    print("Entité: {}, Début: {}, Fin: {}, Catégorie: {}".format(entity_text,
                  start_char, end_char, label))

4.4. Reconnaissance d'entités nommées (NER)

spaCy: Reconnaissance d'entités nommées

Entité: Paris, Début: 0, Fin: 5, Catégorie: GPE
Entité: France, Début: 24, Fin: 30, Catégorie: GPE
Entité: 2015, Début: 35, Fin: 39, Catégorie: DATE
Entité: 2,206,488, Début: 72, Fin: 81, Catégorie: CARDINAL
                         

4.4. Reconnaissance d'entités nommées (NER)

spaCy: Reconnaissance d'entités nommées

import spacy
from spacy import displacy

def visualize_entities(text):
    # Charger le modèle spaCy
    nlp = spacy.load("en_core_web_sm")
    # Analyser le texte
    doc = nlp(text)
    # Visualiser les entités nommées avec displaCy
    displacy.serve(doc, style="ent")

# Texte à analyser et visualiser
text_to_analyze = "Paris is the capital of France. In 2015, its population was recorded as 2,206,488"

# Appeler la fonction pour analyser et visualiser les entités
visualize_entities(text_to_analyze)

4.4. Reconnaissance d'entités nommées (NER)

spaCy: Reconnaissance d'entités nommées

import spacy
from spacy import displacy

def visualize_entities(text):
    # Charger le modèle spaCy
    nlp = spacy.load("en_core_web_sm")
    # Analyser le texte
    doc = nlp(text)
    # Visualiser les entités nommées avec displaCy
    displacy.render(doc, style="ent", jupyter=True)

# Texte à analyser et visualiser
text_to_analyze = "Paris is the capital of France. In 2015, its population was recorded as 2,206,488"

# Appeler la fonction pour analyser et visualiser les entités
visualize_entities(text_to_analyze)

4.4. Reconnaissance d'entités nommées (NER)

spaCy: Reconnaissance d'entités nommées

Paris GPE is the capital of France GPE . In 2015 DATE , its population was recorded as 2,206,488 CARDINAL
Balise Signification
GPE Pays, villes, états.
DATE Dates ou périodes absolues ou relatives
CARDINAL Les chiffres qui ne correspondent à aucun autre type.

4.5. Analyse des sentiments (Sentiment Analysis)

Le lexique VADER (Valence Aware Dictionary and sEntiment Reasoner) est spécifiquement conçu pour analyser les sentiments dans du texte en attribuant des scores de positivité, négativité et neutralité aux mots ainsi qu'aux expressions.

Installation

import nltk
nltk.download('vader_lexicon')

4.5. Analyse des sentiments (Sentiment Analysis)

VADER

VADER est une bibliothèque d'analyse de sentiment conçue pour évaluer le sentiment d'un morceau de texte, généralement une phrase ou un paragraphe.

4.5. Analyse des sentiments (Sentiment Analysis)

VADER

VADER est souvent utilisé pour l'analyse de sentiment rapide et basée sur des règles. Bien qu'il soit efficace dans de nombreux cas, il peut ne pas être aussi précis que des méthodes plus complexes basées sur l'apprentissage automatique, notamment dans des contextes où l'analyse nécessite une compréhension plus profonde du langage et de la syntaxe.

4.5. Analyse des sentiments (Sentiment Analysis)

VADER: Usage

from nltk.sentiment.vader import SentimentIntensityAnalyzer
sia = SentimentIntensityAnalyzer()

sentiment = sia.polarity_scores("this movie is good")
print(sentiment)

sentiment = sia.polarity_scores("this movie is not very good")
print(sentiment)

sentiment = sia.polarity_scores("this movie is bad")
print(sentiment)

4.5. Analyse des sentiments (Sentiment Analysis)

Les scores renvoyés par VADER représentent différentes mesures du sentiment dans un texte. Une explication de chaque score :

Les scores sont normalisés dans une échelle de -1 à 1, où -1 représente un sentiment extrêmement négatif, 1 représente un sentiment extrêmement positif, et 0 représente la neutralité. Les scores peuvent être interprétés individuellement ou conjointement pour obtenir une compréhension complète du sentiment dans le texte analysé.

4.5. Analyse des sentiments (Sentiment Analysis)

Affichage

{'neg': 0.0, 'neu': 0.508, 'pos': 0.492, 'compound': 0.4404}
{'neg': 0.344, 'neu': 0.656, 'pos': 0.0, 'compound': -0.3865}
{'neg': 0.538, 'neu': 0.462, 'pos': 0.0, 'compound': -0.5423}

4.6. Traduction automatique (Machine Translation)

Traduction automatique

La traduction automatique est le processus d'utilisation de logiciels pour traduire un texte ou un discours d'une langue à une autre. Il existe plusieurs approches pour aborder ce problème complexe :

4.6. Traduction automatique (Machine Translation)

Traduction automatique

4.6. Traduction automatique (Machine Translation)

Traduction automatique : Approche manuelle (règles)

L'approche manuelle dans la traduction automatique repose sur l'utilisation de règles linguistiques préalablement définies par des linguistes ou des experts en langues. Ces règles spécifient comment traduire des éléments spécifiques d'une langue source vers une langue cible.

Exemple : Traduction de phrases simples (anglais vers français)

Supposons que nous avons une règle manuelle qui dit que le mot "hello" en anglais doit être traduit par "bonjour" en français. De plus, nous avons une règle indiquant que la phrase "I love" doit être traduite par "j'aime". Ces règles sont simples et sont utilisées mot à mot.

Dans des situations réelles, les règles peuvent devenir extrêmement complexes, impliquant des contextes grammaticaux, des variations lexicales, des idiomes, etc.

4.6. Traduction automatique (Machine Translation)

Traduction automatique : Approche statistique

L'approche statistique de la traduction automatique repose sur l'utilisation de modèles statistiques pour apprendre les relations entre les phrases dans différentes langues à partir de grands ensembles de données parallèles. Contrairement à l'approche manuelle basée sur des règles linguistiques définies par des experts, l'approche statistique utilise des statistiques et des probabilités pour estimer la probabilité d'une traduction donnée.

Les étapes clés de l'approche statistique de la traduction automatique :

4.6. Traduction automatique (Machine Translation)

Traduction automatique : Approche statistique

Les étapes clés de l'approche statistique de la traduction automatique :

4.6. Traduction automatique (Machine Translation)

Traduction automatique : Approche statistique

Les étapes clés de l'approche statistique de la traduction automatique :

Un exemple concret de cette approche pourrait être l'utilisation de modèles de langues conditionnels (par exemple, les modèles de Markov conditionnels) pour estimer la probabilité d'une traduction donnée une phrase source.

4.6. Traduction automatique (Machine Translation)

Traduction automatique : Approche Hybride (Règles et Statistique)

L'approche hybride dans la traduction automatique combine des éléments des approches manuelles (basées sur des règles) et des approches statistiques. L'idée est d'utiliser des règles linguistiques pour certaines parties de la traduction tout en tirant parti de modèles statistiques pour d'autres parties du processus. Cette combinaison vise à exploiter les avantages des deux approches pour obtenir des traductions de meilleure qualité.

Les étapes clés :

  • Règles linguistiques : Des règles linguistiques sont définies manuellement pour certaines constructions grammaticales, expressions idiomatiques, ou autres aspects linguistiques spécifiques. Ces règles peuvent être élaborées par des experts linguistes.
  • Ensembles de données parallèles : Comme dans l'approche statistique, des ensembles de données parallèles contenant des phrases dans la langue source et leurs traductions dans la langue cible sont nécessaires.
  • 4.6. Traduction automatique (Machine Translation)

    Traduction automatique : Approche Hybride (Règles et Statistique)

    Les étapes clés :

  • Apprentissage statistique : Un modèle statistique est entraîné sur ces ensembles de données parallèles, en utilisant des méthodes statistiques pour apprendre les relations entre les phrases dans les deux langues.
  • Application des règles : Lors du processus de traduction, les règles linguistiques sont appliquées en priorité. Si une partie du texte correspond à une règle prédéfinie, la traduction basée sur la règle est utilisée.
  • Utilisation du modèle statistique : Pour les parties du texte qui ne correspondent pas à des règles prédéfinies, le modèle statistique est utilisé pour générer la traduction en se basant sur les relations apprises à partir des ensembles de données parallèles.
  • Intégration des traductions partielles : Les traductions générées par les règles et celles générées par le modèle statistique sont intégrées pour former la traduction finale du texte.
  • 4.6. Traduction automatique (Machine Translation)

    Traduction automatique : Apprentissage machine

    L'approche machine dans la traduction automatique fait référence à l'utilisation de techniques d'apprentissage machine, en particulier d'algorithmes d'apprentissage automatique, pour automatiser le processus de traduction entre langues. Cette approche a considérablement évolué avec le développement de modèles plus avancés basés sur l'apprentissage profond, notamment les modèles de séquence à séquence.

    Les étapes clés de l'approche machine dans la traduction automatique :

    4.6. Traduction automatique (Machine Translation)

    Traduction automatique : Apprentissage machine

    Les étapes clés de l'approche machine dans la traduction automatique :

    4.6. Traduction automatique (Machine Translation)

    Traduction automatique : Apprentissage machine

    Les étapes clés de l'approche machine dans la traduction automatique :

    4.7. Modèles de langage Transformer

    Transformer

    Le Transformer est une architecture de réseau de neurones qui a révolutionné le domaine du traitement du langage naturel depuis son introduction par Vaswani et al. en 2017. Deux des modèles les plus célèbres basés sur l'architecture Transformer sont :

    4.7. Modèles de langage Transformer

    BERT (Bidirectional Encoder Representations from Transformers) :

    BERT, développé par Google, est un modèle pré-entraîné qui a été formé sur de vastes corpus de texte. Ce qui distingue BERT, c'est son approche bidirectionnelle pour la représentation des mots. Contrairement à des modèles précédents qui utilisaient une compréhension unidirectionnelle du contexte, BERT prend en compte le contexte à la fois avant et après un mot dans une phrase, améliorant ainsi la compréhension du sens.

    4.7. Modèles de langage Transformer

    BERT : composants

    Un modèle BERT (Bidirectional Encoder Representations from Transformers) est composé de plusieurs éléments clés, reflétant l'architecture Transformer. Les composants principaux d'un modèle BERT :

    4.7. Modèles de langage Transformer

    BERT : composants

    4.7. Modèles de langage Transformer

    BERT : fonctionnement

    4.7. Modèles de langage Transformer

    BERT : fonctionnement

    4.7. Modèles de langage Transformer

    GPT (Generative Pre-trained Transformer)

    GPT, développé par OpenAI, est un modèle basé sur l'architecture Transformer, mais avec une approche de génération de texte. GPT utilise un modèle de langage pré-entraîné qui a appris à prédire le mot suivant dans une séquence de mots. Il est capable de générer du texte cohérent et contextuellement approprié.

    4.7. Modèles de langage Transformer

    GPT (Generative Pre-trained Transformer) : composants

    Le modèle GPT (Generative Pre-trained Transformer) est composé de plusieurs éléments clés qui suivent l'architecture Transformer. Les composants principaux de GPT :

    4.7. Modèles de langage Transformer

    GPT (Generative Pre-trained Transformer) : composants

    4.7. Modèles de langage Transformer

    GPT (Generative Pre-trained Transformer) : fonctionnement

    4.7. Modèles de langage Transformer

    GPT (Generative Pre-trained Transformer) : fonctionnement

    4.7. Modèles de langage Transformer

    BERT vs. GPT

    Caractéristique BERT GPT
    Objectif du Pré-entraînement Prédiction bidirectionnelle des mots (MLM) et prédiction de relation entre deux phrases (NSP) Génération de texte autoregressive
    Architecture Encodeur bidirectionnel Encodeur-décodeur avec orientation autoregressive
    Utilisation en Fine-Tuning Classification de texte, extraction d'entités nommées, etc. Génération de texte, complétion automatique, etc.

    4.7. Modèles de langage Transformer

    BERT vs. GPT

    Caractéristique BERT GPT
    Approche du Contexte Bidirectionnelle, prend en compte le contexte avant et après chaque mot Autoregressive, génère du texte séquentiellement en utilisant le contexte précédent
    Applications Pratiques Classification, extraction d'entités, détection de paraphrases Génération de texte, complétion automatique, conversation naturelle
    Taille des Modèles Généralement plus petits Souvent plus grands, surtout les versions plus récentes comme GPT-3

    4.8. Systèmes de recommandation (Recommender Systems)

    Système de recommandation

    Le système de recommandation est un domaine essentiel de l'informatique qui vise à réduire la surcharge d'informations en fournissant des suggestions filtrées et pertinentes aux utilisateurs.

    Réduction de la surcharge d'informations : Les systèmes de recommandation visent à aider les utilisateurs à naviguer à travers une grande quantité d'informations en fournissant des recommandations ciblées et adaptées à leurs préférences.

    Fonctionnement

    4.8. Systèmes de recommandation (Recommender Systems)

    Système de recommandation

    Types de Recommandations

    Algorithmes couramment utilisés

    4.8. Systèmes de recommandation (Recommender Systems)

    Système de recommandation

    Applications

    4.8. Systèmes de recommandation (Recommender Systems)

    Réalisation [Pazzani 2007, Ricci 2011]

    Hypothèse

    Les individus suivent souvent les recommandations des autres utilisateurs. Cela suppose que les préférences et les actions des utilisateurs peuvent être des indicateurs fiables pour recommander des articles ou des objets similaires à d'autres utilisateurs.

    Sources des données :

    4.8. Systèmes de recommandation (Recommender Systems)

    Réalisation [Pazzani 2007, Ricci 2011]

    Collecte des Préférences des Utilisateurs :

    4.8. Systèmes de recommandation (Recommender Systems)

    Réalisation

    Méthodes de Collecte des Données :

    4.8. Systèmes de recommandation (Recommender Systems)

    Fonctions [Ricci 2011]

    4.8. Systèmes de recommandation (Recommender Systems)

    Objectifs [Herlocker 2000, Ricci 2011]

    4.8. Systèmes de recommandation (Recommender Systems)

    Objectifs [Herlocker 2000, Ricci 2011]

    Contexte et Variations de Recommandations

    4.8. Systèmes de recommandation (Recommender Systems)

    Objectifs [Herlocker 2000, Ricci 2011]

    Navigation et consultation

    4.8. Systèmes de recommandation (Recommender Systems)

    Objectifs [Herlocker 2000, Ricci 2011]

    Interaction Sociale

    4.8. Systèmes de recommandation (Recommender Systems)

    Approches [Pazzani 2007, Ricci 2011]

    4.8. Systèmes de recommandation (Recommender Systems)

    Approches [Pazzani 2007, Ricci 2011]

    4.8. Systèmes de recommandation (Recommender Systems)

    Filtrage collaboratif

    Le filtrage collaboratif basé sur les transactions implique l'analyse des transactions entre utilisateurs et articles pour générer des recommandations.

    4.8. Systèmes de recommandation (Recommender Systems)

    Filtrage collaboratif

    Avantages

    Limitations

    4.8. Systèmes de recommandation (Recommender Systems)

    Filtrage basé sur le contenu [Pazzani 2007]

    Le filtrage collaboratif basé sur le contenu repose sur la description des objets et le profil des intérêts de l'utilisateur.

    4.8. Systèmes de recommandation (Recommender Systems)

    Filtrage basé sur le contenu [Pazzani 2007]

    Algorithmes

    4.8. Systèmes de recommandation (Recommender Systems)

    Filtrage basé sur le contenu [Pazzani 2007]

    Avantages

    4.8. Systèmes de recommandation (Recommender Systems)

    Filtrage basé sur le contenu [Pazzani 2007]

    Limitations

    4.8. Systèmes de recommandation (Recommender Systems)

    Systèmes hybrides [Gomez-Uribe 2016]

    4.8. Systèmes de recommandation (Recommender Systems)

    Systèmes hybrides

    Avantages

    4.8. Systèmes de recommandation (Recommender Systems)

    Mesures de performance [Ziegler 2005, Ricci 2011]

    4.8. Systèmes de recommandation (Recommender Systems)

    Domaines à haut risque [Herlocker 2000]

    Les recommandations à haut risque se réfèrent à des domaines où les conséquences d'une recommandation incorrecte ou inappropriée peuvent être significatives.

    Exemple

    Assurance : Les recommandations dans le domaine de l'assurance peuvent avoir des implications financières importantes. Par exemple, une recommandation inappropriée en matière d'assurance pourrait entraîner des conséquences financières négatives pour l'utilisateur.

    Intégration des Capacités d'Explication

    Les systèmes de recommandation à haut risque devraient intégrer des capacités d'explication, permettant de fournir des justifications claires pour chaque recommandation.

    4.8. Systèmes de recommandation (Recommender Systems)

    Domaines à haut risque [Herlocker 2000]

    Avantages des explications

  • Justification : Les explications fournissent une justification transparente du raisonnement derrière chaque recommandation.
  • Participation des utilisateurs : Les explications encouragent la participation des utilisateurs en les aidant à comprendre pourquoi une recommandation particulière a été faite.
  • Éducation : Les explications contribuent à l'éducation des utilisateurs en les informant sur les critères pris en compte par le système pour générer des recommandations.
  • Acceptation : Les explications améliorent l'acceptation des recommandations en fournissant une visibilité sur le processus de prise de décision du système.
  • 4.9. Représentation des connaissances et raisonnement

    Représentation des connaissances et raisonnement (KRR)

    La Représentation des connaissances et raisonnement (KRR) constituent un domaine clé de l'intelligence artificielle. La KRR est largement utilisée dans des domaines tels que la planification, la représentation du langage naturel, la gestion des connaissances, les systèmes experts, etc.

    Représentation des Connaissances

    La représentation des connaissances implique la création d'une représentation lisible par machine de la connaissance d'un monde ou d'un domaine particulier. Cela vise à permettre aux systèmes informatiques de comprendre, interpréter et raisonner sur l'information.

    Exemples

    4.9. Représentation des connaissances et raisonnement

    Représentation des connaissances et raisonnement (KRR)

    Raisonnement

    Le raisonnement consiste à déduire de nouvelles informations à partir des connaissances existantes. C'est le processus par lequel les systèmes tirent des conclusions logiques.

    Compromis entre expressivité et praticité

    4.10. Web sémantique (Semantic Web)

    Web sémantique

    Semantic Web Stack (https://commons.wikimedia.org/wiki/File:Semantic_web_stack.svg)

    4.10. Web sémantique (Semantic Web)

    Web sémantique

    Le Semantic Web Stack, également connu sous le nom de pile sémantique, représente une série de technologies et de standards interconnectés qui ont été développés pour réaliser la vision du World Wide Web sémantique. Cette vision, initiée par Tim Berners-Lee, vise à rendre le contenu du web plus compréhensible par les machines en ajoutant une sémantique aux données, permettant ainsi une meilleure interopérabilité et une utilisation plus avancée des informations sur le web.

    Les principales couches de la pile sémantique (du bas vers le haut) :

    4.10. Web sémantique (Semantic Web)

    Web sémantique

    4.10. Web sémantique (Semantic Web)

    Web sémantique

    En utilisant cette pile sémantique, le World Wide Web sémantique vise à créer une infrastructure où les machines peuvent comprendre, interpréter et exploiter le contenu du web de manière plus avancée, ouvrant ainsi la porte à de nombreuses applications intelligentes et à une meilleure interconnexion des données.

    4.10. Web sémantique (Semantic Web)

    Web sémantique

    4.11. Moteur de règles (Rule Engines)

    Moteur de règles

    Un moteur de règles, également connu sous le nom de moteur d'inférence, est un composant logiciel qui traite et applique un ensemble de règles et de contraintes définies.

    4.11. Moteur de règles (Rule Engines)

    Moteur de règles

    Les moteurs de règles sont largement utilisés dans divers domaines, tels que la gestion des workflows, la logique métier, les systèmes d'alerte, et d'autres applications où des règles spécifiques doivent être appliquées pour maintenir la cohérence et automatiser les processus. Ils offrent une approche déclarative pour spécifier la logique métier sans nécessiter une programmation explicite.

    4.11. Moteur de règles (Rule Engines)

    Moteur de règles : Applications

    4.11. Moteur de règles (Rule Engines)

    Moteur de règles : Applications

    4.11. Moteur de règles (Rule Engines)

    Moteur de règles : Langages

    4.11. Moteur de règles (Rule Engines)

    Moteur de règles : Logiciels

    4.12. Programmation logique et IA

    Programmation logique

    La programmation logique, en particulier la logique propositionnelle et la logique du premier ordre (FOL), joue un rôle fondamental dans le domaine de l'intelligence artificielle.

    4.12. Programmation logique et IA

    Prolog

    Prolog (Programming in Logic) est un langage de programmation déclaratif, basé sur la logique du premier ordre.

    4.12. Programmation logique et IA

    Prolog: types de données

    En Prolog, les types de données fondamentaux incluent les atomes, les nombres, les variables et les termes composés.

    Atome :

    Un atome est une chaîne de caractères qui représente un nom. Il commence généralement par une lettre minuscule et peut contenir des lettres, des chiffres et des caractères de soulignement. Les atomes sont utilisés pour représenter des constantes et des noms dans Prolog.

    animal(chien).
    couleur(rouge).
    

    4.12. Programmation logique et IA

    Prolog: types de données

    Nombres :

    Prolog prend en charge les entiers et les nombres à virgule flottante comme types de données numériques.

    age(personne1, 23).
    prix(livre1, 19.99).
    

    4.12. Programmation logique et IA

    Prolog: types de données

    Variables :

    Les variables sont des symboles qui représentent des valeurs inconnues. Elles commencent généralement par une lettre majuscule ou un soulignement.

    personne(X).
    

    4.12. Programmation logique et IA

    Prolog: types de données

    Terme Composé :

    Les termes composés sont des structures de données complexes créées à partir de foncteurs (noms de termes) et d'arguments. Ils sont utilisés pour représenter des entités composées.

    point(3, 7).
    livre(titre('Introduction à Prolog'), auteur('John Doe')).
    

    Les termes composés peuvent également être utilisés pour représenter des listes, des arbres et d'autres structures de données complexes.

    4.12. Programmation logique et IA

    Prolog: règles

    En Prolog, les règles sont des clauses qui définissent des relations entre différents termes. La structure générale d'une règle est la suivante :

    Tête : - Corps.

    4.12. Programmation logique et IA

    Prolog: faits

    En Prolog, une clause avec un corps vide est en effet appelée un fait.

    personne(bob).
    personne(alice).
    

    Les faits sont des affirmations qui sont considérées comme vraies dans le monde que vous décrivez. Ces faits peuvent ensuite être utilisés dans des requêtes ou d'autres règles pour déduire des informations supplémentaires.

    4.12. Programmation logique et IA

    Prolog: Installation

    GNU Prolog, également connu sous le nom de gprolog, est un compilateur Prolog basé sur le standard ISO Prolog. Il est conçu pour être utilisé sur différentes plates-formes, y compris Linux, Windows et d'autres systèmes d'exploitation.

    L'installation de gprolog sur une machine Ubuntu

    $ sudo apt install gprolog

    4.12. Programmation logique et IA

    Prolog: GNU Prolog

    $ prolog
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 5 2017, 10:30:08 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2016 Daniel Diaz
    | ?- [user].
    compiling user for byte code...
    personne(tom).
    personne(alice).

    user compiled, 2 lines read - 241 bytes written, 12239 ms
    (4 ms) yes
    | ?-

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    ?- personne(X).

    X = tom ?

    yes
    | ?- cat(bob).

    no

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    | ?- [user].
    compiling user for byte code...
    personne(tom).
    personne(alice).
    personnes(L) :- findall(X, personne(X), L).

    user compiled, 3 lines read - 490 bytes written, 10638 ms

    yes
    | ?- personnes(L).

    L = [tom,alice]

    yes

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    | ?- [user].
    compiling user for byte code...
    friend(bob, alice).
    friend(alice, kevin).
    friend(bob, thomas).
    friend(bob, peter).
    user compiled, 4 lines read - 486 bytes written, 77256 ms
    (10 ms) yes
    | ?- friend(bob, X).

    X = alice ? a
    X = thomas
    X = peter
    (1 ms) yes

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    			
    $ cat friend.pl
    
    friend(bob, alice).
    friend(alice, kevin).
    friend(bob, thomas).
    friend(bob, peter).
    human(X):-friend(X,_).
    human(Y):-friend(_,Y).
    

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    			
    $ prolog --consult-file friend.pl
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 23 2020, 20:14:50 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2020 Daniel Diaz
    compiling /home/user/friend.pl for byte code...
    /home/user/friend.pl compiled, 4 lines read - 515 bytes written, 22 ms
    | ?- friend(bob,alice).
    
    true ?
    
    yes
                            
    			

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    			
    $ prolog --consult-file friend.pl
    | ?- human(X).
    X = bob ? a
    X = alice
    X = bob
    X = bob
    X = alice
    X = kevin
    X = thomas
    X = peter
    
    yes
    | ?-
                            
    			

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    			
    $ cat ancetre.pl
    
    /* Faits : Déclaration des relations parents */
    parent(kevin, jane).
    parent(kevin, jim).
    parent(jane, ann).
    parent(jane, bob).
    parent(jim, pat).
    
    /* Règle : X est l'ancêtre de Y si X est le parent de Y ou si X est l'ancêtre d'un parent de Y. */
    ancetre(X, Y) :- parent(X, Y).
    ancetre(X, Y) :- parent(X, Z), ancetre(Z, Y).
    

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    			
    $ prolog --consult-file friend.pl
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 23 2020, 20:14:50 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2020 Daniel Diaz
    /home/user/ancetre.pl compiled, 11 lines read - 1119 bytes written, 14 ms
    | ?- ancetre(kevin,X).
    X = jane ? a
    X = jim
    X = ann
    X = bob
    X = pat
    
    no
    | ?-
                            
    			

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    /* Faits : Déclaration des élèves et de leurs notes */
    note(kevin, math, 85).
    note(kevin, anglais, 90).
    note(jane, math, 92).
    note(jane, anglais, 88).
    note(bob, math, 78).
    note(bob, anglais, 85).
    
    /* Règle : Calcul de la moyenne des notes d'un élève */
    moyenne(Eleve, Moyenne) :-
        findall(Note, note(Eleve, _, Note), Notes),
        length(Notes, N),
        somme_liste(Notes, Sum),
        Moyenne is Sum / N.
    

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    
    /* Prédicat auxiliaire : Calcul de la somme d'une liste */
    somme_liste([], 0).
    somme_liste([X|Xs], Sum) :-
        somme_liste(Xs, Reste),
        Sum is X + Reste.
    
    /* Prédicat auxiliaire : Calcul de la somme d'une liste */
    somme_liste([], 0).
    somme_liste([X|Xs], Sum) :-
        somme_liste(Xs, Reste),
        Sum is X + Reste.
    

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    
    /* Règle : Affichage des élèves avec leur moyenne */
    afficher_moyennes :-
        setof(Eleve, Matiere^Note^(note(Eleve, Matiere, Note)), Eleves),
        member(Eleve, Eleves),
        moyenne(Eleve, Moyenne),
        format('Élève: ~w, Moyenne: ~2f~n', [Eleve, Moyenne]),
        fail.
    afficher_moyennes.
    

    4.12. Programmation logique et IA

    Prolog: GNU Prolog: interrogation

    			
    $ prolog --consult-file notes.pl
    GNU Prolog 1.4.5 (64 bits)
    Compiled Feb 23 2020, 20:14:50 with gcc
    By Daniel Diaz
    Copyright (C) 1999-2020 Daniel Diaz
    /home/user/notes.pl compiled, 30 lines read - 3086 bytes written, 3 ms 
    | ?- afficher_moyennes.
    Élève: bob, Moyenne: 81.50
    Élève: jane, Moyenne: 90.00
    Élève: kevin, Moyenne: 87.50
    
    (1 ms) no
    | ?-
                            
    			

    Références

    Articles de recherche

    Références

    Articles de recherche

    Références

    Articles de recherche

    Références

    Web

    Références:

    Couleurs

    Images