Mary12's picture
Update app.py
cda0496
import gradio as gr
import re
from pypdf import PdfReader
from transformers import AutoTokenizer, AutoModelForQuestionAnswering, pipeline
import docx
import concurrent.futures
def remove_references(text):
text = re.sub(r'\[\d+\]', '', text) ##[ref]
text = re.sub(r'\[https?://[^\[\]]+\s[^\[\]]+\]', '', text) ##hyperlink with text
text = re.sub(r'\[https?://[^\[\]]+\]', '', text) ##just the hyperlink
# text = html.unescape(text)
text = re.sub(r'\s+', ' ', text).strip() ##clear out the white spaces
return text
# def extract_text_from_pdf(file_path):
# text = ""
# pdf_reader = PdfReader(file_path)
# for page in pdf_reader.pages:
# text += page.extract_text() + "\n"
# return text
import fitz # PyMuPDF
def extract_text_from_pdf(file_path):
text = ""
pdf_document = fitz.open(file_path)
for page_num in range(pdf_document.page_count):
page = pdf_document[page_num]
text += page.get_text("text") + "\n"
pdf_document.close()
return text
def extract_text_from_txt(file_path):
text = ""
with open(file_path, "r", encoding='utf-8') as txt_file:
# text = txt_file.read()
return txt_file.read()
# return text
# def extract_text_from_doc(file_path):
# doc = docx.Document(file_path)
# fullText = []
# for para in doc.paragraphs:
# fullText.append(para.text)
# return '\n'.join(fullText)
def extract_text_from_paragraph(para):
return para.text
def extract_text_from_doc(file_path):
doc = docx.Document(file_path)
with concurrent.futures.ThreadPoolExecutor() as executor:
results = list(executor.map(extract_text_from_paragraph, doc.paragraphs))
return '\n'.join(results)
def model(model_name):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForQuestionAnswering.from_pretrained(model_name,return_dict = False)
model_pipeline = pipeline("question-answering",model = model,tokenizer = tokenizer)
return model_pipeline
model_name = "timpal0l/mdeberta-v3-base-squad2"
pipe = model(model_name)
def qa_result(context, question, file, pipe=pipe):
if file is not None:
allowed_types = [".pdf", ".txt", ".docx"]
extension = "." + file.name.split(".")[-1].lower()
if not extension in allowed_types:
text = "Խնդրում եմ ներբեռնել .pdf, .txt, կամ .docx ֆայլեր"
else:
if len(question) == 0:
text = "Ես չեմ կարողանալ քեզ օգնել եթե ինձ չտաս հարցը"
else:
if extension == allowed_types[0]:
context = extract_text_from_pdf(file.name)
elif extension == allowed_types[1]:
context = extract_text_from_txt(file.name)
else:
context = extract_text_from_doc(file.name)
result = pipe(question=question, context=context)
answered = result['answer']
text = remove_references(answered)
else:
# if file is None and len(context) == 0 and len(question) == 0:
# text = "Որպեսզի ես կարողանամ քեզ օգնել, դու պետք է տրամադրես տեքստ կամ ֆայլը, և հարցեր"
# elif len(context) == 0:
# text = "Ես չեմ կարողանամ քեզ օգնել եթե դու չտրամադրես տեքստը"
# elif len(question) == 0:
# text = "Ես չեմ կարողանամ քեզ օգնել եթե դու չտաս հարցը"
if len(context) == 0:
if len(question) == 0:
text = "Որպեսզի ես կարողանամ քեզ օգնել, դու պետք է տրամադրես տեքստ կամ ֆայլը, և հարցեր"
else:
text = "Ես չեմ կարողանամ քեզ օգնել եթե դու չտրամադրես տեքստը"
elif len(question) == 0:
text = "Ես չեմ կարողանամ քեզ օգնել եթե դու չտաս հարցը"
else:
result = pipe(question=question, context=context)
answered = result['answer']
text = remove_references(answered)
text = text.replace('(', '', 1)
text = text.rstrip(',')
return text.capitalize()
theme = gr.themes.Soft().set(
body_background_fill='*background_fill_secondary',
body_text_color_subdued='*body_text_color',
body_text_color_subdued_dark='*chatbot_code_background_color'
)
app = gr.Interface(
fn=qa_result,
btn=gr.UploadButton("📁"),
inputs=['textbox', 'text', gr.inputs.File()],
outputs='textbox',
title='Ողջու՛յն։ Ես քո արհեստական բանականությամբ օգնականն եմ',
theme=theme,
description='Տու՛ր ինձ տեքստ, ու տեքստին վերաբերող հարցեր, ու ես կօգնեմ քեզ պատասխանել հարցերին'
)
app.launch(inline=False)