File size: 7,899 Bytes
e1c7a43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192

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, ""