Spaces:
Build error
Build error
| import streamlit as st | |
| from sympy import sympify, Eq, solve | |
| import pytesseract | |
| from PIL import Image | |
| import easyocr | |
| import numpy as np | |
| from transformers import pipeline | |
| # Initialize OCR reader and NLP models | |
| easyocr_reader = easyocr.Reader(['en']) | |
| fill_blanks_model = pipeline("fill-mask", model="bert-base-uncased") | |
| qa_model = pipeline("question-answering") | |
| # Streamlit app title | |
| st.title("Quiz and Numerical Problem Solver") | |
| st.markdown("**Input a question or problem as text or upload an image, and get solutions!**") | |
| # Sidebar options | |
| option = st.sidebar.selectbox("Select Input Type:", ("Text Input", "Image Upload")) | |
| if option == "Text Input": | |
| # Text input | |
| user_input = st.text_area("Enter your question or problem:") | |
| if st.button("Solve"): | |
| if user_input.strip(): | |
| try: | |
| st.subheader("Solution:") | |
| # Handle blanks (fill-in-the-blank questions) | |
| if "___" in user_input or "[MASK]" in user_input: | |
| st.write("Detected fill-in-the-blank question:") | |
| results = fill_blanks_model(user_input) | |
| for result in results: | |
| st.write(f"{result['sequence']} (Confidence: {result['score']:.2f})") | |
| # Handle MCQs | |
| elif "?" in user_input and any(option in user_input.lower() for option in ["a.", "b.", "c.", "d."]): | |
| st.write("Detected multiple-choice question:") | |
| question, *options = user_input.split("\n") | |
| options = [opt.strip() for opt in options if opt.strip()] | |
| answer = qa_model(question=question, context=" ".join(options)) | |
| st.write(f"Answer: {answer['answer']} (Confidence: {answer['score']:.2f})") | |
| # Handle mathematical expressions | |
| else: | |
| try: | |
| expr = sympify(user_input) # Parse the input into a symbolic expression | |
| if isinstance(expr, Eq): # If it's an equation, solve it | |
| solution = solve(expr) | |
| st.write("Solutions:", solution) | |
| else: # Otherwise, solve the expression | |
| solution = solve(expr) | |
| st.write("Solution:", solution) | |
| except Exception as e: | |
| st.error(f"Error processing input: {str(e)}") | |
| except Exception as e: | |
| st.error("Error processing input. Please ensure it's a valid mathematical, quiz, or problem question.") | |
| else: | |
| st.error("Please input a valid text to solve.") | |
| elif option == "Image Upload": | |
| # Image upload | |
| uploaded_image = st.file_uploader("Upload an image containing the problem:", type=["png", "jpg", "jpeg"]) | |
| if uploaded_image: | |
| image = Image.open(uploaded_image) | |
| st.image(image, caption="Uploaded Image", use_column_width=True) | |
| if st.button("Extract & Solve"): | |
| # Extract text using OCR | |
| with st.spinner("Extracting text from image..."): | |
| try: | |
| extracted_text = easyocr_reader.readtext(np.array(image), detail=0) | |
| st.subheader("Extracted Text:") | |
| full_text = "\n".join(extracted_text) | |
| st.text(full_text) | |
| # Attempt to process the extracted text | |
| st.subheader("Solution:") | |
| # Handle blanks, MCQs, or math dynamically | |
| if "___" in full_text or "[MASK]" in full_text: | |
| st.write("Detected fill-in-the-blank question:") | |
| results = fill_blanks_model(full_text) | |
| for result in results: | |
| st.write(f"{result['sequence']} (Confidence: {result['score']:.2f})") | |
| elif "?" in full_text and any(option in full_text.lower() for option in ["a.", "b.", "c.", "d."]): | |
| st.write("Detected multiple-choice question:") | |
| question, *options = full_text.split("\n") | |
| options = [opt.strip() for opt in options if opt.strip()] | |
| answer = qa_model(question=question, context=" ".join(options)) | |
| st.write(f"Answer: {answer['answer']} (Confidence: {answer['score']:.2f})") | |
| else: | |
| try: | |
| expr = sympify(full_text) # Parse the extracted text | |
| if isinstance(expr, Eq): # If it's an equation, solve it | |
| solution = solve(expr) | |
| st.write("Solutions:", solution) | |
| else: # Otherwise, solve the expression | |
| solution = solve(expr) | |
| st.write("Solution:", solution) | |
| except Exception as e: | |
| st.error(f"Error processing extracted text: {str(e)}") | |
| except Exception as e: | |
| st.error("Error solving the problem from the extracted text. Ensure the image contains a valid problem.") | |
| # Additional Notes | |
| st.markdown("---") | |
| st.markdown( | |
| "This app uses OCR for text extraction, symbolic computation for solving problems, and NLP for fill-in-the-blank and MCQ questions." | |
| ) | |