| import streamlit as st |
| import pandas as pd |
| import plotly.graph_objects as go |
|
|
|
|
| entailment_html_messages = { |
| "entailment": 'The knowledge base seems to <span style="color:green">Not-a-mis-sell</span> about your statement', |
| "contradiction": 'The knowledge base seems to <span style="color:red">Mis-sell</span> about your statement', |
| "neutral": 'The knowledge base is <span style="color:darkgray">neutral</span> about your statement', |
| } |
|
|
|
|
| def build_sidebar(): |
| sidebar = """ |
| <h1 style='text-align: center'>NS-AI-Labs</h1> |
| <div style='text-align: center'> |
| <i>Text Entailment for Referral Mis-sell</i> |
| <p><br/><a href='https://www.newtonschool.co/'>Github project</a> - Based on <a href='https://github.com/deepset-ai/haystack'>Haystack</a></p> |
| <p><small><a href='https://www.newtonschool.co/'>Data crawled from Sales Call</a></small></p> |
| </div> |
| """ |
| st.sidebar.markdown(sidebar, unsafe_allow_html=True) |
|
|
|
|
| def set_state_if_absent(key, value): |
| if key not in st.session_state: |
| st.session_state[key] = value |
|
|
|
|
| |
| def reset_results(*args): |
| st.session_state.answer = None |
| st.session_state.results = None |
| st.session_state.raw_json = None |
|
|
|
|
| def create_ternary_plot(entailment_data): |
| """ |
| Create a Plotly ternary plot for the given entailment dict. |
| """ |
| hover_text = "" |
| for label, value in entailment_data.items(): |
| hover_text += f"{label}: {value}<br>" |
|
|
| fig = go.Figure( |
| go.Scatterternary( |
| { |
| "cliponaxis": False, |
| "mode": "markers", |
| "a": [i for i in map(lambda x: x["entailment"], [entailment_data])], |
| "b": [i for i in map(lambda x: x["contradiction"], [entailment_data])], |
| "c": [i for i in map(lambda x: x["neutral"], [entailment_data])], |
| "hoverinfo": "text", |
| "text": hover_text, |
| "marker": { |
| "color": "#636efa", |
| "size": [0.01], |
| "sizemode": "area", |
| "sizeref": 2.5e-05, |
| "symbol": "circle", |
| }, |
| } |
| ) |
| ) |
|
|
| fig.update_layout( |
| { |
| "ternary": { |
| "sum": 1, |
| "aaxis": makeAxis("Entailment", 0), |
| "baxis": makeAxis("<br>Contradiction", 45), |
| "caxis": makeAxis("<br>Neutral", -45), |
| } |
| } |
| ) |
| return fig |
|
|
|
|
| def makeAxis(title, tickangle): |
| return { |
| "title": title, |
| "titlefont": {"size": 20}, |
| "tickangle": tickangle, |
| "tickcolor": "rgba(0,0,0,0)", |
| "ticklen": 5, |
| "showline": False, |
| "showgrid": True, |
| } |
|
|
|
|
| def create_df_for_relevant_snippets(docs): |
| """ |
| Create a dataframe that contains all relevant snippets. |
| Also returns the URLs |
| """ |
| rows = [] |
| urls = {} |
| for doc in docs: |
| row = { |
| "Title": doc.meta["name"], |
| "Relevance": f"{doc.score:.3f}", |
| "con": f"{doc.meta['entailment_info']['contradiction']:.2f}", |
| "neu": f"{doc.meta['entailment_info']['neutral']:.2f}", |
| "ent": f"{doc.meta['entailment_info']['entailment']:.2f}", |
| "Content": doc.content, |
| } |
| urls[doc.meta["name"]] = doc.meta["url"] |
| rows.append(row) |
| df = pd.DataFrame(rows) |
| df["Content"] = df["Content"].str.wrap(75) |
| df = df.style.apply(highlight_cols) |
|
|
| return df, urls |
|
|
|
|
| def highlight_cols(s): |
| coldict = {"con": "#FFA07A", "neu": "#E5E4E2", "ent": "#a9d39e"} |
| if s.name in coldict.keys(): |
| return ["background-color: {}".format(coldict[s.name])] * len(s) |
| return [""] * len(s) |
|
|