Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import streamlit as st | |
| from annotated_text import annotated_text | |
| from annotated_text.util import get_annotated_html | |
| from streamlit_annotation_tools import text_labeler | |
| from evaluation_metrics import EVALUATION_METRICS, get_evaluation_metric | |
| from predefined_example import EXAMPLES | |
| from span_dataclass_converters import ( | |
| get_highlight_spans_from_ner_spans, | |
| get_ner_spans_from_annotations, | |
| ) | |
| def get_examples_attributes(selected_example): | |
| "Return example attributes so that they are not refreshed on every interaction" | |
| return ( | |
| selected_example.text, | |
| selected_example.gt_labels, | |
| selected_example.gt_spans, | |
| selected_example.predictions, | |
| ) | |
| if __name__ == "__main__": | |
| st.set_page_config(layout="wide") | |
| st.title("NER Evaluation Metrics Comparison") | |
| st.write( | |
| "Evaluation for the NER task requires a ground truth and a prediction that will be evaluated. The ground truth is shown below, add predictions in the next section to compare the evaluation metrics." | |
| ) | |
| # with st.container(): | |
| st.subheader("Ground Truth") # , divider='rainbow') | |
| selected_example = st.selectbox( | |
| "Select an example text from the drop down below", | |
| [example for example in EXAMPLES], | |
| format_func=lambda ex: ex.text, | |
| ) | |
| text, gt_labels, gt_spans, predictions = get_examples_attributes(selected_example) | |
| annotated_text( | |
| get_highlight_spans_from_ner_spans( | |
| get_ner_spans_from_annotations(gt_labels), text | |
| ) | |
| ) | |
| annotated_predictions = [ | |
| get_annotated_html(get_highlight_spans_from_ner_spans(ner_span, text)) | |
| for ner_span in predictions | |
| ] | |
| predictions_df = pd.DataFrame( | |
| { | |
| # "ID": [f"Prediction_{index}" for index in range(len(predictions))], | |
| "Prediction": annotated_predictions, | |
| "ner_spans": predictions, | |
| }, | |
| index=[f"Prediction_{index}" for index in range(len(predictions))], | |
| ) | |
| st.subheader("Predictions") # , divider='rainbow') | |
| with st.expander("Click to Add Predictions"): | |
| st.subheader("Adding predictions") | |
| st.markdown( | |
| """ | |
| Add predictions to the list of predictions on which the evaluation metric will be caculated. | |
| - Select the entity type/label name and then highlight the span in the text below. | |
| - To remove a span, double click on the higlighted text. | |
| - Once you have your desired prediction, click on the 'Add' button.(The prediction created is shown in a json below) | |
| """ | |
| ) | |
| st.write( | |
| "Note: Only the spans of the selected label name is shown at a given instance.", | |
| ) | |
| labels = text_labeler(text, gt_labels) | |
| st.json(labels, expanded=False) | |
| # if st.button("Add Prediction"): | |
| # labels = text_labeler(text) | |
| if st.button("Add!"): | |
| spans = get_ner_spans_from_annotations(labels) | |
| spans = sorted(spans, key=lambda span: span["start"]) | |
| predictions.append(spans) | |
| annotated_predictions.append( | |
| get_annotated_html(get_highlight_spans_from_ner_spans(spans, text)) | |
| ) | |
| predictions_df = pd.DataFrame( | |
| { | |
| # "ID": [f"Prediction_{index}" for index in range(len(predictions))], | |
| "Prediction": annotated_predictions, | |
| "ner_spans": predictions, | |
| }, | |
| index=[f"Prediction_{index}" for index in range(len(predictions))], | |
| ) | |
| print("added") | |
| highlighted_predictions_df = predictions_df[["Prediction"]] | |
| st.write(highlighted_predictions_df.to_html(escape=False), unsafe_allow_html=True) | |
| st.divider() | |
| ### EVALUATION METRICS COMPARISION ### | |
| st.subheader("Evaluation Metrics Comparision") # , divider='rainbow') | |
| st.markdown(""" | |
| The different evaluation metrics we have for the NER task are | |
| - Span Based Evaluation with Partial Overlap | |
| - Token Based Evaluation with Micro Avg | |
| - Token Based Evaluation with Macro Avg | |
| """) | |
| with st.expander("View Predictions Details"): | |
| st.write(predictions_df.to_html(escape=False), unsafe_allow_html=True) | |
| if st.button("Get Metrics!"): | |
| for evaluation_metric_type in EVALUATION_METRICS: | |
| predictions_df[evaluation_metric_type] = predictions_df.ner_spans.apply( | |
| lambda ner_spans: get_evaluation_metric( | |
| metric_type=evaluation_metric_type, | |
| gt_ner_span=gt_spans, | |
| pred_ner_span=ner_spans, | |
| text=text, | |
| ) | |
| ) | |
| metrics_df = predictions_df.drop(["ner_spans"], axis=1) | |
| st.write(metrics_df.to_html(escape=False), unsafe_allow_html=True) | |
| print("compared") | |