Extraction de relations
L'extraction de relations est une tâche importante du traitement du langage naturel (NLP), qui vise à identifier les relations sémantiques entre entités à partir de texte non structuré. En termes simples, il s'agit de déterminer quelle « relation » existe entre « qui » et « à qui » dans une phrase.
Éléments clés de l'extraction de relations
- Reconnaissance d'entités: Tout d'abord, il est nécessaire d'identifier les entités nommées dans le texte
- Classification de relations: Ensuite, déterminer quel type de relation existe entre ces entités
- Représentation des relations: Enfin, représenter ces relations sous une forme structurée
Scénarios d'application
- Construction de graphes de connaissances
- Systèmes intelligents de questions-réponses
- Récupération d'informations
- Analyse d'événements
- Fouille de la littérature biomédicale
Principales méthodes d'extraction de relations
1. Méthodes à base de règles
Exemple
# Exemple : correspondance de règles simple
import re
text = "Jack Ma founded Alibaba"
pattern = r"(.+?) founded (.+?)"
match = re.search(pattern, text)
if match:
print(f"Founder: {match.group(1)}, Company: {match.group(2)}")
import re
text = "Jack Ma founded Alibaba"
pattern = r"(.+?) founded (.+?)"
match = re.search(pattern, text)
if match:
print(f"Founder: {match.group(1)}, Company: {match.group(2)}")
Avantages et inconvénients
- Avantages : implémentation simple, haute précision
- Inconvénients : couverture limitée, difficulté à gérer des structures de phrases complexes
2. Méthodes d'apprentissage supervisé
Utiliser des données étiquetées pour l'entraînement du modèle ; les algorithmes courants incluent :
- Machine à vecteurs de support (SVM)
- Champ aléatoire conditionnel (CRF)
- Modèles d'apprentissage profond
Exemple
# Exemple : extraction de relations avec spaCy
import spacy
nlp = spacy.load("en_core_web_sm")
text = "Apple a été fondée par Steve Jobs en 1976."
doc = nlp(text)
for ent in doc.ents:
print(ent.text, ent.label_)
import spacy
nlp = spacy.load("en_core_web_sm")
text = "Apple a été fondée par Steve Jobs en 1976."
doc = nlp(text)
for ent in doc.ents:
print(ent.text, ent.label_)
3. Méthodes semi-supervisées / de supervision distante
- Utiliser une petite quantité de données étiquetées et une grande quantité de données non étiquetées
- Supervision distante : utiliser des bases de connaissances pour générer automatiquement des données d'entraînement
4. Méthodes basées sur des modèles de langue pré-entraînés
- BERT
- GPT
- RoBERTa
Exemple
# Exemple : Utilisation de HuggingFace Transformers
from transformers import pipeline
classifier = pipeline("text-classification", model="bert-base-uncased")
result = classifier("Jack Ma est le fondateur d'Alibaba")
print(result)
from transformers import pipeline
classifier = pipeline("text-classification", model="bert-base-uncased")
result = classifier("Jack Ma est le fondateur d'Alibaba")
print(result)
Technologies clés de l'extraction de relations
Reconnaissance d'entités
- Reconnaissance d'entités nommées (NER)
- Liaison d'entités
Classification de relations
- Relation binaire
- Relation n-aire
- Hiérarchie des relations
Métriques d'évaluation
| Métrique | Description |
|---|---|
| Precision | La proportion de relations correctement prédites parmi toutes les relations prédites |
| Rappel | La proportion de relations correctement prédites parmi toutes les relations vraies |
| Score F1 | La moyenne harmonique de la précision et du rappel |
Défis de l'extraction de relations
- Diversité linguistique: La même relation peut être exprimée de plusieurs manières
- Ambiguïté des entités: La même entité peut avoir différentes significations selon le contexte
- Dépendance à longue distance: Les entités liées peuvent être éloignées
- Rareté des données: Les données étiquetées pour certains types de relations sont rares
- Adaptation de domaine: La capacité de généralisation du modèle sur différents domaines
Cas pratique : Construction d'un système simple d'extraction de relations
Étape 1 : Préparation des données
Exemple
# Exemple de jeu de données
data = [
{"text": "Bill Gates est le fondateur de Microsoft", "relations": [{"head": "Bill Gates", "tail": "Microsoft", "type": "Fondateur"}]},
{"text": "Beijing est la capitale de la Chine", "relations": [{"head": "Beijing", "tail": "Chine", "type": "Capitale"}]}
]
data = [
{"text": "Bill Gates est le fondateur de Microsoft", "relations": [{"head": "Bill Gates", "tail": "Microsoft", "type": "Fondateur"}]},
{"text": "Beijing est la capitale de la Chine", "relations": [{"head": "Beijing", "tail": "Chine", "type": "Capitale"}]}
]
Étape 2 : Ingénierie des fonctionnalités
Exemple
from sklearn.feature_extraction.text import TfidfVectorizer
texts = [d["text"] for d in data]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
texts = [d["text"] for d in data]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
Étape 3 : Entraînement du modèle
Exemple
from sklearn.svm import SVC
# Exemple simplifié ; en pratique, un traitement plus complexe des étiquettes est nécessaire
y = [d["relations"][0]["type"] for d in data]
model = SVC()
model.fit(X, y)
# Exemple simplifié ; en pratique, un traitement plus complexe des étiquettes est nécessaire
y = [d["relations"][0]["type"] for d in data]
model = SVC()
model.fit(X, y)
Étape 4 : Application de la prédiction
Exemple
test_text = "Steve Jobs a fondé Apple"
test_vec = vectorizer.transform([test_text])
prediction = model.predict(test_vec)
print(f"Relation prédite : {prediction)
test_vec = vectorizer.transform([test_text])
prediction = model.predict(test_vec)
print(f"Relation prédite : {prediction)