DataScienceGuild/WikipediaAIDataScience
2
1import spacy2import wikipediaapi3import wikipedia4from wikipedia.exceptions import DisambiguationError5from transformers import TFAutoModel, AutoTokenizer6import numpy as np7import pandas as pd8import faiss9import gradio as gr10 11try:12 nlp = spacy.load("en_core_web_sm")13except:14 spacy.cli.download("en_core_web_sm")15 nlp = spacy.load("en_core_web_sm")16 17wh_words = ['what', 'who', 'how', 'when', 'which']18def get_concepts(text):19 text = text.lower()20 doc = nlp(text)21 concepts = []22 for chunk in doc.noun_chunks:23 if chunk.text not in wh_words:24 concepts.append(chunk.text)25 return concepts26 27def get_passages(text, k=100):28 doc = nlp(text)29 passages = []30 passage_len = 031 passage = ""32 sents = list(doc.sents)33 for i in range(len(sents)):34 sen = sents[i]35 passage_len+=len(sen)36 if passage_len >= k:37 passages.append(passage)38 passage = sen.text39 passage_len = len(sen)40 continue41 42 elif i==(len(sents)-1):43 passage+=" "+sen.text44 passages.append(passage)45 passage = ""46 passage_len = 047 continue48 49 passage+=" "+sen.text50 return passages51 52def get_dicts_for_dpr(concepts, n_results=20, k=100):53 dicts = []54 for concept in concepts:55 wikis = wikipedia.search(concept, results=n_results)56 print(concept, "No of Wikis: ",len(wikis))57 for wiki in wikis:58 try:59 html_page = wikipedia.page(title = wiki, auto_suggest = False)60 except DisambiguationError:61 continue62 63 htmlResults=html_page.content64 65 passages = get_passages(htmlResults, k=k)66 for passage in passages:67 i_dicts = {}68 i_dicts['text'] = passage69 i_dicts['title'] = wiki70 dicts.append(i_dicts)71 return dicts72 73passage_encoder = TFAutoModel.from_pretrained("nlpconnect/dpr-ctx_encoder_bert_uncased_L-2_H-128_A-2")74query_encoder = TFAutoModel.from_pretrained("nlpconnect/dpr-question_encoder_bert_uncased_L-2_H-128_A-2")75p_tokenizer = AutoTokenizer.from_pretrained("nlpconnect/dpr-ctx_encoder_bert_uncased_L-2_H-128_A-2")76q_tokenizer = AutoTokenizer.from_pretrained("nlpconnect/dpr-question_encoder_bert_uncased_L-2_H-128_A-2")77 78def get_title_text_combined(passage_dicts):79 res = []80 for p in passage_dicts:81 res.append(tuple((p['title'], p['text'])))82 return res83 84def extracted_passage_embeddings(processed_passages, max_length=156):85 passage_inputs = p_tokenizer.batch_encode_plus(86 processed_passages,87 add_special_tokens=True,88 truncation=True,89 padding="max_length",90 max_length=max_length,91 return_token_type_ids=True92 )93 passage_embeddings = passage_encoder.predict([np.array(passage_inputs['input_ids']), 94 np.array(passage_inputs['attention_mask']), 95 np.array(passage_inputs['token_type_ids'])], 96 batch_size=64, 97 verbose=1)98 return passage_embeddings99 100def extracted_query_embeddings(queries, max_length=64):101 query_inputs = q_tokenizer.batch_encode_plus(102 queries,103 add_special_tokens=True,104 truncation=True,105 padding="max_length",106 max_length=max_length,107 return_token_type_ids=True108 )109 query_embeddings = query_encoder.predict([np.array(query_inputs['input_ids']), 110 np.array(query_inputs['attention_mask']), 111 np.array(query_inputs['token_type_ids'])], 112 batch_size=1, 113 verbose=1)114 return query_embeddings115 116#Wikipedia API:117 118def get_pagetext(page):119 s=str(page).replace("/t","")120 121 return s122 123def get_wiki_summary(search):124 wiki_wiki = wikipediaapi.Wikipedia('en')125 page = wiki_wiki.page(search)126 127 isExist = page.exists()128 if not isExist:129 return isExist, "Not found", "Not found", "Not found", "Not found"130 131 pageurl = page.fullurl132 pagetitle = page.title133 pagesummary = page.summary[0:60]134 pagetext = get_pagetext(page.text)135 136 backlinks = page.backlinks137 linklist = ""138 for link in backlinks.items():139 pui = link[0]140 linklist += pui + " , "141 a=1 142 143 categories = page.categories144 categorylist = ""145 for category in categories.items():146 pui = category[0]147 categorylist += pui + " , "148 a=1 149 150 links = page.links151 linklist2 = ""152 for link in links.items():153 pui = link[0]154 linklist2 += pui + " , "155 a=1 156 157 sections = page.sections158 159 ex_dic = {160 'Entity' : ["URL","Title","Summary", "Text", "Backlinks", "Links", "Categories"],161 'Value': [pageurl, pagetitle, pagesummary, pagetext, linklist,linklist2, categorylist ]162 }163 164 df = pd.DataFrame(ex_dic)165 166 return df167 168def search(question):169 concepts = get_concepts(question)170 print("concepts: ",concepts)171 dicts = get_dicts_for_dpr(concepts, n_results=1)172 lendicts = len(dicts)173 print("dicts len: ", lendicts)174 if lendicts == 0:175 return pd.DataFrame()176 processed_passages = get_title_text_combined(dicts)177 passage_embeddings = extracted_passage_embeddings(processed_passages)178 query_embeddings = extracted_query_embeddings([question])179 faiss_index = faiss.IndexFlatL2(128)180 faiss_index.add(passage_embeddings.pooler_output)181 prob, index = faiss_index.search(query_embeddings.pooler_output, k=lendicts)182 return pd.DataFrame([dicts[i] for i in index[0]])183 184# AI UI SOTA - Gradio blocks with UI formatting, and event driven UI185with gr.Blocks() as demo: # Block documentation on event listeners, start here: https://gradio.app/blocks_and_event_listeners/186 gr.Markdown("<h1><center>🍰 Ultimate Wikipedia AI 🎨</center></h1>")187 gr.Markdown("""<div align="center">Search and Find Anything Then Use in AI! <a href="https://www.mediawiki.org/wiki/API:Main_page">MediaWiki - API for Wikipedia</a>. <a href="https://paperswithcode.com/datasets?q=wikipedia&v=lst&o=newest">Papers,Code,Datasets for SOTA w/ Wikipedia</a>""")188 with gr.Row(): # inputs and buttons189 inp = gr.Textbox(lines=1, default="Syd Mead", label="Question")190 with gr.Row(): # inputs and buttons191 b3 = gr.Button("Search AI Summaries") 192 b4 = gr.Button("Search Web Live")193 with gr.Row(): # outputs DF1194 out = gr.Dataframe(label="Answers", type="pandas") 195 with gr.Row(): # output DF2196 out_DF = gr.Dataframe(wrap=True, max_rows=1000, overflow_row_behaviour= "paginate", datatype = ["markdown", "markdown"], headers=['Entity', 'Value'])197 inp.submit(fn=get_wiki_summary, inputs=inp, outputs=out_DF)198 b3.click(fn=search, inputs=inp, outputs=out)199 b4.click(fn=get_wiki_summary, inputs=inp, outputs=out_DF )200demo.launch(debug=True, show_error=True) 