CoolFace
Apppublic

Raghav001/Experiment

sourceHugging Faceapache-2.0updated 3y agoView on Hugging Face
1likes
app.py247 linesDownload Raw Back to root
1import requests2import json3import gradio as gr4# from concurrent.futures import ThreadPoolExecutor5import pdfplumber6import pandas as pd7import langchain8import time9from cnocr import CnOcr10 11# from langchain.document_loaders import PyPDFLoader12from langchain.document_loaders import UnstructuredWordDocumentLoader13from langchain.document_loaders import UnstructuredPowerPointLoader14# from langchain.document_loaders.image import UnstructuredImageLoader15 16 17 18 19from sentence_transformers import SentenceTransformer, models, util20word_embedding_model = models.Transformer('sentence-transformers/all-MiniLM-L6-v2', do_lower_case=True)21pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension(), pooling_mode='cls')22embedder = SentenceTransformer(modules=[word_embedding_model, pooling_model])23ocr = CnOcr()24# chat_url = 'https://Raghav001-API.hf.space/sale'25chat_url = 'https://Raghav001-API.hf.space/chatpdf'26headers = {27    'Content-Type': 'application/json',28}29# thread_pool_executor = ThreadPoolExecutor(max_workers=4)30history_max_len = 50031all_max_len = 300032 33 34def get_emb(text):35    emb_url = 'https://Raghav001-API.hf.space/embeddings'36    data = {"content": text}37    try:38        result = requests.post(url=emb_url,39                               data=json.dumps(data),40                               headers=headers41                               )42        return result.json()['data'][0]['embedding']43    except Exception as e:44        print('data', data, 'result json', result.json())45 46 47def doc_emb(doc: str):48    texts = doc.split('\n')49    # futures = []50    emb_list = embedder.encode(texts)51    # for text in texts:52    #     futures.append(thread_pool_executor.submit(get_emb, text))53    # for f in futures:54    #     emb_list.append(f.result())55    print('\n'.join(texts))56    gr.Textbox.update(value="")57    return texts, emb_list, gr.Textbox.update(visible=True), gr.Button.update(visible=True), gr.Markdown.update(58        value="""success ! Let's talk"""), gr.Chatbot.update(visible=True)59 60 61def get_response(msg, bot, doc_text_list, doc_embeddings):62    # future = thread_pool_executor.submit(get_emb, msg)63    gr.Textbox.update(value="")64    now_len = len(msg)65    req_json = {'question': msg}66    his_bg = -167    for i in range(len(bot) - 1, -1, -1):68        if now_len + len(bot[i][0]) + len(bot[i][1]) > history_max_len:69            break70        now_len += len(bot[i][0]) + len(bot[i][1])71        his_bg = i72    req_json['history'] = [] if his_bg == -1 else bot[his_bg:]73    # query_embedding = future.result()74    query_embedding = embedder.encode([msg])75    cos_scores = util.cos_sim(query_embedding, doc_embeddings)[0]76    score_index = [[score, index] for score, index in zip(cos_scores, [i for i in range(len(cos_scores))])]77    score_index.sort(key=lambda x: x[0], reverse=True)78    print('score_index:\n', score_index)79    index_set, sub_doc_list = set(), []80    for s_i in score_index:81        doc = doc_text_list[s_i[1]]82        if now_len + len(doc) > all_max_len:83            break84        index_set.add(s_i[1])85        now_len += len(doc)86       # Maybe the paragraph is truncated wrong, so add the upper and lower paragraphs87        if s_i[1] > 0 and s_i[1] -1 not in index_set:88            doc = doc_text_list[s_i[1]-1]89            if now_len + len(doc) > all_max_len:90                break91            index_set.add(s_i[1]-1)92            now_len += len(doc)93        if s_i[1] + 1 < len(doc_text_list) and s_i[1] + 1 not in index_set:94            doc = doc_text_list[s_i[1]+1]95            if now_len + len(doc) > all_max_len:96                break97            index_set.add(s_i[1]+1)98            now_len += len(doc)99 100    index_list = list(index_set)101    index_list.sort()102    for i in index_list:103        sub_doc_list.append(doc_text_list[i])104    req_json['doc'] = '' if len(sub_doc_list) == 0 else '\n'.join(sub_doc_list)105    data = {"content": json.dumps(req_json)}106    print('data:\n', req_json)107    result = requests.post(url=chat_url,108                           data=json.dumps(data),109                           headers=headers110                           )111    res = result.json()['content']112    bot.append([msg, res])113    return bot[max(0, len(bot) - 3):]114 115 116def up_file(fls):117    doc_text_list = []118 119    120    names = []121    print(names)122    for i in fls:123        names.append(str(i.name))124 125    126    pdf = []127    docs = []128    pptx = []129 130    for i in names:131        132        if i[-3:] == "pdf":133            pdf.append(i)134        elif i[-4:] == "docx":135            docs.append(i)136        else:137            pptx.append(i)138 139 140    #Pdf Extracting141    for idx, file in enumerate(pdf):142        print("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")143        #print(file.name)144        with pdfplumber.open(file) as pdf:145            for i in range(len(pdf.pages)):146                # Read page i+1 of a PDF document147                page = pdf.pages[i]148                res_list = page.extract_text().split('\n')[:-1]149 150                for j in range(len(page.images)):151                   # Get the binary stream of the image152                    img = page.images[j]153                    file_name = '{}-{}-{}.png'.format(str(time.time()), str(i), str(j))154                    with open(file_name, mode='wb') as f:155                        f.write(img['stream'].get_data())156                    try:157                        res = ocr.ocr(file_name)158                        # res = PyPDFLoader(file_name)159                    except Exception as e:160                        res = []161                    if len(res) > 0:162                        res_list.append(' '.join([re['text'] for re in res]))163 164                tables = page.extract_tables()165                for table in tables:166                    # The first column is used as the header167                    df = pd.DataFrame(table[1:], columns=table[0])168                    try:169                        records = json.loads(df.to_json(orient="records", force_ascii=False))170                        for rec in records:171                            res_list.append(json.dumps(rec, ensure_ascii=False))172                    except Exception as e:173                        res_list.append(str(df))174 175                doc_text_list += res_list176 177        #pptx Extracting178    for i in pptx:179        loader = UnstructuredPowerPointLoader(i)180        data = loader.load()181        # content = str(data).split("'")182        # cnt = content[1]183        # # c = cnt.split('\\n\\n')184        # # final = "".join(c)185        # c = cnt.replace('\\n\\n',"").replace("<PAGE BREAK>","").replace("\t","")186        doc_text_list.append(data)187 188    189 190    #Doc Extracting191    for i in docs:192        loader = UnstructuredWordDocumentLoader(i)193        data = loader.load()194        # content = str(data).split("'")195        # cnt = content[1]196        # # c = cnt.split('\\n\\n')197        # # final = "".join(c)198        # c = cnt.replace('\\n\\n',"").replace("<PAGE BREAK>","").replace("\t","")199        doc_text_list.append(data)200 201    # #Image Extraction202    # for i in jpg:203    #     loader = UnstructuredImageLoader(i)204    #     data = loader.load()205    #     # content = str(data).split("'")206    #     # cnt = content[1]207    #     # # c = cnt.split('\\n\\n')208    #     # # final = "".join(c)209    #     # c = cnt.replace('\\n\\n',"").replace("<PAGE BREAK>","").replace("\t","")210    #     doc_text_list.append(data)211                212    doc_text_list = [str(text).strip() for text in doc_text_list if len(str(text).strip()) > 0]213    # print(doc_text_list)214    return gr.Textbox.update(value='\n'.join(doc_text_list), visible=True), gr.Button.update(215        visible=True), gr.Markdown.update(216        value="Processing")217 218 219 220 221 222with gr.Blocks(css=".gradio-container {background: url('file= https://th.bing.com/th/id/OIP.VixxfZq3hIYiX_DGd3knTwHaEK?pid=ImgDet&rs=1')}") as demo:223    with gr.Row():224        with gr.Column():225            file = gr.File(file_types=['.pptx','.docx','.pdf'], label='Click to upload Document', file_count='multiple')226            doc_bu = gr.Button(value='Submit', visible=False)227 228            229            txt = gr.Textbox(label='result', visible=False)230            231            232            doc_text_state = gr.State([])233            doc_emb_state = gr.State([])234        with gr.Column():235            md = gr.Markdown("Please Upload the PDF")236            chat_bot = gr.Chatbot(visible=False)237            msg_txt = gr.Textbox(visible = False)238            chat_bu = gr.Button(value='Clear', visible=False)239 240    file.change(up_file, [file], [txt, doc_bu, md]) #hiding the text241    doc_bu.click(doc_emb, [txt], [doc_text_state, doc_emb_state, msg_txt, chat_bu, md, chat_bot])242    msg_txt.submit(get_response, [msg_txt, chat_bot,doc_text_state, doc_emb_state], [chat_bot],queue=False)243    chat_bu.click(lambda: None, None, chat_bot, queue=False)244 245if __name__ == "__main__":246    demo.queue().launch(show_api=False)247    # demo.queue().launch(share=False, server_name='172.22.2.54', server_port=9191)