sKnowBoard / fonctions.py
Ludo7127's picture
reorganising the files
e1c7a43
from openai import OpenAI
import os
from dotenv import load_dotenv
from youtube_transcript_api import YouTubeTranscriptApi
import random
from classes import LeitnerSystem
# Load environment variables from .env file
load_dotenv()
OpenAI.api_key = os.getenv('OPENAI_API_KEY')
client = OpenAI()
# Extraction et pré-traitement de l'information
def extraire_qr_de_chatgpt(reponse_chat_gpt):
"""
Extrait les paires de questions et réponses du texte de réponse ChatGPT.
:param reponse_chat_gpt: Le texte de réponse de ChatGPT contenant des Q/R.
:return: Liste de tuples contenant les paires (question, réponse).
"""
# Séparer le texte en lignes
lignes = reponse_chat_gpt.split('\n\n') # Deux sauts de ligne séparent chaque Q/R
paires_qr = []
for ligne in lignes:
if ligne.startswith("Q:") and "\nR:" in ligne:
question, reponse = ligne.split("\nR:")
paires_qr.append((question[3:], reponse)) # Supprime 'Q: ' de la question
return paires_qr
def obtenir_transcription(id_youtube):
"""
Obtient la transcription d'une vidéo YouTube à partir de son ID.
"""
try:
result = YouTubeTranscriptApi.get_transcript(id_youtube, languages=["fr"])
texte_continu = ' '.join([segment['text'] for segment in result])
# qr = extraire_qr_de_chatgpt(texte_continu)
return texte_continu
except Exception as e:
return str(e)
def decouper_texte_en_segments(texte, longueur_max=2000):
"""
Découpe un texte en segments de taille spécifiée sans couper les mots en deux.
:param texte: Le texte à découper.
:param longueur_max: La longueur maximale de chaque segment.
:return: Une liste de segments de texte.
"""
# Vérifie si le texte est plus court que la longueur maximale
if len(texte) <= longueur_max:
return [texte]
segments = []
mots = texte.split()
segment_actuel = []
for mot in mots:
# Vérifie si l'ajout du mot courant dépasse la longueur maximale
if len(' '.join(segment_actuel + [mot])) > longueur_max:
# Si oui, ajoute le segment actuel à la liste des segments et commence un nouveau segment
segments.append(' '.join(segment_actuel))
segment_actuel = [mot]
else:
# Si non, ajoute le mot au segment actuel
segment_actuel.append(mot)
# Ajoute le dernier segment s'il y a des mots restants
if segment_actuel:
segments.append(' '.join(segment_actuel))
return segments
# Création de question/réponse
def generer_questions_reponses(texte):
"""
Génère des questions et réponses à partir d'un texte donné en utilisant l'API d'OpenAI.
:param texte: Le texte à partir duquel générer les Q/R.
:return: Texte contenant les questions et réponses.
"""
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "system",
"content":
"""
Vous êtes un assistant perspicace capable de générer du contenu éducatif sous forme de question/réponse adapté
à un système de cartes de Leitner. Pour un text donné, tu es capable de générer des questions et des réponses.
Tu es attentif au nombre de question demandée par l'utilisateur
Utilisez un style formel en évitant les textes inutiles.
Les questions commencent par Q: et les réponses sur la ligne suivante par R:
Veuillez garder les réponses sous 10 mots maximum.
"""
},
{
"role": "user",
"content": f"""Pour un texte donné ci-après, extrait une information éducative pertinente et
résume là sous forme d'une question et d'une réponse très courte pour alimenter
une boîte de Leitner; La réponse ne doit pas dépasser 10 mots; Format de la réponse
: Première ligne Q: ... et deuxième ligne R: ...; Texte à traiter : '{texte}';"""
}
],
temperature=0.5 # Ajustez ce paramètre selon vos besoins
)
# print(response.choices[0].message.content)
# paires_qr = extraire_qr_de_chatgpt(response.choices[0].message.content)
# print(paires_qr)
return response.choices[0].message.content
def processus_complet(id_youtube):
"""
Combine l'obtention de la transcription YouTube et la génération de Q/R dans un seul processus.
"""
transcription = obtenir_transcription(id_youtube)
segments = decouper_texte_en_segments(transcription, longueur_max=1000)
qr = generer_questions_reponses(segments[8])
print(segments[8])
# paires_qr = extraire_qr_de_chatgpt(qr)
# leitner_system_test = LeitnerSystem()
# result = YouTubeTranscriptApi.get_transcript('d2lJUOv0hLA&t=65s', languages = ["fr"])
# texte_continu = ' '.join([segment['text'] for segment in result]) # Concaténation de tous les segments de texte en une seule chaîne
# segments = decouper_texte_en_segments(texte_continu, longueur_max=1000)
# paires_qr = extraire_qr_de_chatgpt(generer_questions_reponses(segments[8]))
# for question, reponse in paires_qr:
# leitner_system_test.add_card(question, reponse)
return qr
# Creation/edition/Configuration de la boite de Leitner
def creer_boite_leitner():
global leitner_system
leitner_system = LeitnerSystem()
return "Boîte de Leitner créée avec succès!"
def ajouter_cartes_leitner(texte_qr):
"""
Extrait les paires de questions-réponses du texte et les ajoute à la boîte de Leitner.
:param texte_qr: Le texte contenant les questions et réponses générées.
:return: Un message confirmant l'ajout des cartes.
"""
if leitner_system is None:
return "Veuillez d'abord créer une boîte de Leitner."
paires_qr = extraire_qr_de_chatgpt(texte_qr)
if not paires_qr:
return "Aucune paire Q/R n'a été trouvée dans le texte."
for question, reponse in paires_qr:
leitner_system.add_card(question, reponse)
return f"{len(paires_qr)} cartes ajoutées à la boîte de Leitner."
# Utilisation et mise à jour de la boite de Leitner
def poser_question():
global leitner_system
if leitner_system is None or not leitner_system.compartments[0]:
return "Aucune carte disponible pour le quiz.", ""
carte = random.choice(leitner_system.compartments[0])
leitner_system.derniere_question = carte
return carte['question'], ""
def valider_reponse(user_answer):
global leitner_system
if leitner_system.derniere_question is None:
return "Veuillez d'abord poser une question.", ""
correct_answer = leitner_system.derniere_question['answer']
# Utilise l'API d'OpenAI pour évaluer la similarité sémantique des réponses
score = leitner_system.compare_semantic_similarity(correct_answer, user_answer)
explanation = leitner_system.compare_semantic_similarity_explanation(correct_answer, user_answer)
# Logique pour déplacer la carte en fonction de la réponse
if float(score) > 5.0:
result = f"Correct! Votre score de similarité : {score}\n{explanation}"
# Déplacer la carte au prochain compartiment ou marquer comme maîtrisée
# Cette partie dépend de la manière dont vous souhaitez gérer la progression dans les compartiments
else:
result = f"Incorrect. Votre score de similarité : {score}\n{explanation}"
# Optionnellement, remettre la carte dans le premier compartiment ou gérer la répétition
return result, ""