Mélangez la récupération hybride avec des données structurées à l'aide des bases de connaissances MindsDB

DEV - 30/12
Écrit par Andriy Burkov, Ph.D. & Auteur, MindsDB Advisor Ce tutoriel fait suite à celui-ci...

Écrit par Andriy Burkov, Ph.D. & Auteur, conseiller MindsDB

Ce didacticiel fait suite à ce didacticiel, dans lequel nous avons fait les premières étapes de la création et de l'utilisation d'une fonctionnalité de la base de connaissances MindsDB. Dans ce projet de suivi, nous passerons en revue la création d'une base de connaissances de recherche sémantique à l'aide du célèbre ensemble de données Enron Emails. Alors que dans le didacticiel précédent, nous avons simplement utilisé un ensemble de données existant, dans celui-ci, nous prétraiterons l'ensemble de données d'origine en en extrayant des attributs structurés (également appelés métadonnées) à l'aide de la reconnaissance d'entités nommées (NER). Nous créerons ensuite une base de connaissances et effectuerons des recherches sémantiques et filtrées par métadonnées.

Avant de mettre la main à la pâte, rafraîchissons quelques bases. Téléchargez le code et le matériel du webinaire ici pour suivre le didacticiel.

1. Introduction aux bases de connaissances dans MindsDB

Les bases de connaissances (KB) de MindsDB offrent des capacités de recherche sémantique avancées, vous permettant de trouver des informations basées sur la signification plutôt que sur de simples mots-clés. Ils utilisent des modèles d'intégration pour convertir du texte en représentations vectorielles et les stocker dans des bases de données vectorielles pour des recherches de similarité efficaces.

En plus de rechercher des pépites de connaissances à l'aide de la similarité sémantique (critères de recherche souples), les bases de connaissances MindsDB permettent à l'utilisateur de combiner les deux critères de recherche souples avec des critères concrets appelés « métadonnées », qui peuvent être considérés comme des colonnes de table de base de données relationnelles classiques.

Dans ce didacticiel, nous supposons que l'utilisateur dispose d'une instance MindsDB open source gratuite exécutée dans son environnement local. Veuillez suivre ces étapes pour le configurer.

Pour démontrer les recherches logicielles et matérielles dans une base de connaissances MindsDB, nous utiliserons le Enron Corpus - l'une des plus grandes collections publiques d'e-mails d'entreprise, contenant plus de 500 000 e-mails de dirigeants d'Enron au cours des années qui ont précédé l'effondrement de l'entreprise en 2001. Cet ensemble de données est particulièrement intéressant car il contient de véritables communications commerciales, y compris du contenu lié aux scandales, ce qui le rend parfait pour démontrer les capacités de recherche dans la base de connaissances.

La reconnaissance d'entités nommées est la technique que nous utiliserons pour extraire automatiquement ces attributs structurés, tels que les personnes, les organisations, les dates et les lieux, du texte brut de l'e-mail. Ces entités extraites deviendront les colonnes de métadonnées de notre base de connaissances, nous permettant non seulement d'effectuer une recherche sémantique par sens, mais également de filtrer les résultats à l'aide de critères précis et structurés comme l'expéditeur, l'entreprise ou la période de temps.

2. Paramètres les choses

2.1 Installation des dépendances

Tout d’abord, installons les dépendances et configurons le NER. Nous utiliserons SpaCy pour cela, car ses modèles pré-entraînés peuvent extraire automatiquement des entités telles que des personnes, des organisations, des dates et des lieux à partir du texte brut de l'e-mail. Ces entités extraites seront ensuite transformées en colonnes de métadonnées structurées, que nous stockerons avec le contenu de l'e-mail et que nous utiliserons plus tard pour alimenter des requêtes riches et prenant en compte les métadonnées dans notre base de connaissances MindsDB.

!pip install mindsdb mindsdb_sdk pandas request sets de données yaspin spacy # Télécharger le modèle anglais spaCy pour la reconnaissance d'entités nommées !python -m spacy download en_core_web_sm print("✅ Dépendances installées avec succès !")
Entrer en mode plein écran Quitter le mode plein écran

2.2 Sélection et téléchargement de l'ensemble de données

Nous allons télécharger l'ensemble de données de l'e-mail d'Enron à partir de Hugging Face, qui est une vaste collection de messages d'entreprise du monde réel provenant du corpus Enron, associés à leurs lignes d'objet d'origine et à leur corps de texte nettoyé. Chaque entrée comprend les métadonnées de l'e-mail (telles que l'expéditeur, les destinataires et l'horodatage) ainsi que le contenu complet du message, organisés en répartitions standard train/validation/test afin que l'ensemble de données soit utilisé pour des tâches telles que la synthèse, la classification ou les expériences PNL en aval.

Pour les besoins de notre didacticiel, nous n'utiliserons que la fraction d'entraînement de l'ensemble de données.

# Télécharger l'ensemble de données des e-mails Enron depuis Hugging Face à partir des ensembles de données import load_dataset import pandas as pd import re from datetime import datetime import json # Charger l'ensemble de données Enron (536 000 e-mails) print("Téléchargement de l'ensemble de données des e-mails Enron...") dataset = load_dataset("snoop2head/enron_aeslc_emails", split="train") df = pd.DataFrame(dataset) print(f"Forme de l'ensemble de données : {df.shape}") print("Colonnes de l'ensemble de données :", df.columns.tolist()) def parse_email_text(email_text): """Analyser le texte brut de l'e-mail pour extraire le sujet, le corps et les métadonnées""" if pd.isna(email_text) ou email_text == '' : return {'subject': '', 'body': '', 'from': '', 'to': '', 'date': ''} email_text = str(email_text) # Initialiser le dictionnaire de résultats analysé = {'subject': '', 'body': '', 'from': '', 'to': '', 'date': ''} # Extraire le sujet subject_match = re.search(r'Subject:\s*(.*?)(?:\n|$)', email_text, re.IGNORECASE) if subject_match: parsed['subject'] = subject_match.group(1).strip() # Extraire de from_match = re.search(r'From:\s*(.*?)(?:\n|$)', email_text, re.IGNORECASE) if from_match: parsed['from'] = from_match.group(1).strip() # Extraire vers to_match = re.search(r'To:\s*(.*?)(?:\n|$)', email_text, re.IGNORECASE) if to_match: parsed['to'] = to_match.group(1).strip() # Extraire la date date_match = re.search(r'Date:\s*(.*?)(?:\n|$)', email_text, re.IGNORECASE) if date_match: parsed['date'] = date_match.group(1) = re.search(r'(?:Subject:.*?\n.*?\n|X-.*?\n)', email_text, re.DOTALL) if body_start: parsed['body'] = email_text[body_start.end():].strip() else: parsed['body'] = email_text # Nettoyer le corps du texte analysé['body'] = re.sub(r'\n+', ' ', parsed['body']) parsed['body'] = re.sub(r'\s+', ' ', parsed['body']) return parsed # Analyser les premiers e-mails pour comprendre la structure print("Analyse de la structure des e-mails...") sample_emails = df.head(10) parsed_samples = [] pour idx, ligne dans sample_emails.iterrows(): # L'ensemble de données peut avoir une colonne différente noms, vérifions email_content = None pour col dans df.columns : if row[col] et len(str(row[col])) > 100 : # Rechercher la colonne avec le contenu de l'e-mail email_content = row[col] break if email_content: parsed = parse_email_text(email_content) parsed['email_id'] = f"email_{idx:06d}" parsed_samples.append (analysé)
Entrer en mode plein écran Quitter le mode plein écran
Téléchargement de l'ensemble de données des e-mails d'Enron... Forme de l'ensemble de données : (535703, 1) Colonnes de l'ensemble de données : ['text'] Analyse de la structure des e-mails...
Entrer en mode plein écran Quitter le mode plein écran

Imprimons maintenant quelques enregistrements pour voir ce qu'il y a à l'intérieur :

df_parsed_sample = pd.DataFrame(parsed_samples) print("\nExemple d'e-mails analysés :") print("="*100) pour idx, ligne dans df_parsed_sample.head(5).iterrows(): print(f"\nEmail #{idx+1}") print(f"ID: {row['email_id']}") print(f"From: {row['from'][:80]}{'...' if len(row['from']) > 80 else ''}") print(f"À : {row['to'][:80]}{'...' if len(row['to']) > 80 else ''}") print(f"Date : {row['date']}") print(f"Sujet : {row['subject']}") print(f"Aperçu du corps : {row['body'][:200]}{'...' if len(row['body']) > 200 else ''}") print("-" * 80) print(f"\nStructure de courrier électronique analysée avec succès !") print(f"Colonnes extraites : {df_parsed_sample.columns.tolist()}")
Entrer en mode plein écran Quitter le mode plein écran
Échantillon d'e-mails analysés : =================================================================================================== ID d'e-mail : email_000000 De : [email protected] À : [email protected] Date : Lundi 14 mai 2001 16:39:00 -0700 (PDT) Objet : Corps : Aperçu du corps : Voici nos prévisions -------------------------------------------------------------------------------- Email n°2 ID : email_000001 De : [email protected] À : [email protected] Date : Vendredi 4 mai 2001 13:51:00 -0700 (PDT) Objet : Re : Aperçu du corps : Voyager pour avoir une réunion d'affaires enlève le plaisir du voyage. Surtout si vous devez préparer une présentation. Je suggérerais de tenir les réunions de plan d'affaires ici, puis de faire un voyage sans... -------------------------------------------------------------------------------- Email n°3 ID : email_000002 De : [email protected] À : [email protected] Date : mercredi 18 octobre 2000 03:00:00 -0700 (PDT) Objet : Re : test Body Preview : test réussi. chemin à parcourir !!! -------------------------------------------------------------------------------- Email #4 ID : email_000003 De : [email protected] À : [email protected] Date : lundi 23 octobre 2000 06:13:00 -0700 (PDT) Objet : Corps : Aperçu du corps : Randy, pouvez-vous m'envoyer un barème du salaire et du niveau de tous les membres du groupe ...
[Courte citation de 8% de l'article original]
Loading...