File size: 2,632 Bytes
317cf00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import fitz  # PyMuPDF for PDF processing
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import streamlit as st
from groq import Groq
from tempfile import NamedTemporaryFile

# Set up the Groq client with your API key
client = Groq(api_key="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")

# Step 1: Function to extract text from PDF
def extract_text_from_pdf(pdf_path):
    doc = fitz.open(pdf_path)
    text = ""
    for page in doc:
        text += page.get_text()
    doc.close()
    return text

# Step 2: Function to split extracted text into chunks for retrieval
def chunk_text(text, chunk_size=1000):
    words = text.split()
    chunks = []
    for i in range(0, len(words), chunk_size):
        chunk = " ".join(words[i:i+chunk_size])
        chunks.append(chunk)
    return chunks

# Step 3: Retrieve the most relevant chunk using TF-IDF and cosine similarity
def retrieve_chunk(question, chunks):
    vectorizer = TfidfVectorizer().fit_transform([question] + chunks)
    question_vector = vectorizer[0]
    chunk_vectors = vectorizer[1:]
    similarities = cosine_similarity(question_vector, chunk_vectors).flatten()
    best_chunk_index = np.argmax(similarities)
    return chunks[best_chunk_index]

# Step 4: Generate an answer using the Groq API's language model
def generate_answer(retrieved_text, question):
    prompt = f"Based on the following text, answer the question:\n\nText: {retrieved_text}\n\nQuestion: {question}"
    chat_completion = client.chat.completions.create(
        messages=[{"role": "user", "content": prompt}],
        model="llama3-8b-8192"
    )
    return chat_completion.choices[0].message.content

# Step 5: Streamlit UI for PDF upload and Q&A
def main():
    st.title("PDF Question-Answer Chatbot")

    uploaded_file = st.file_uploader("Upload a PDF", type="pdf")

    if uploaded_file:
        with NamedTemporaryFile(delete=False) as tmp_file:
            tmp_file.write(uploaded_file.getvalue())
            pdf_path = tmp_file.name

        # Extract text from the uploaded PDF and chunk it
        text = extract_text_from_pdf(pdf_path)
        chunks = chunk_text(text)

        question = st.text_input("Ask a question:")
        if st.button("Get Answer"):
            if question:
                retrieved_text = retrieve_chunk(question, chunks)
                answer = generate_answer(retrieved_text, question)
                st.write("Answer:", answer)
            else:
                st.write("Please enter a question.")

if __name__ == "__main__":
    main()