File size: 3,665 Bytes
a1b76f2
b063ad5
 
a1b76f2
 
b063ad5
54a1079
a1b76f2
37516c9
 
 
4cd5c1e
 
37516c9
8da6c15
 
4cd5c1e
8da6c15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54a1079
 
a1b76f2
 
54a1079
a1b76f2
 
 
 
 
 
 
 
 
8da6c15
 
 
 
 
b063ad5
 
4cd5c1e
f071110
4cd5c1e
 
 
 
a59a366
8da6c15
4cd5c1e
b063ad5
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import gradio as gr
import os

import requests

from spacy import displacy
import streamlit as st

os.system("python -m spacy download en_core_web_md")
import spacy

# entities group method
# https://huggingface.co/spaces/crabz/sk-ner/blob/main/app.py

options = {"ents": ["Observation",
                    "Evaluation"],
           "colors": {
               "Observation": "#9bddff",
               "Evaluation": "#f08080",
           }

           }

nlp = spacy.load("en_core_web_md")


def postprocess(classifications):
    entities = []
    for i in range(len(classifications)):
        if classifications[i]['entity'] != 0:
            if classifications[i]['entity'][0] == 'B':
                j = i + 1
                while j < len(classifications) and classifications[j]['entity'][0] == 'I':
                    j += 1
                entities.append((classifications[i]['entity'].split('-')[1], classifications[i]['start'],
                                 classifications[j - 1]['end']))
    while True:
        merged = False
        to_remove = []
        merged_entities = []
        for i in range(len(entities)):
            for j in range(i + 1, len(entities)):
                if entities[i] != entities[j] and entities[i][0] == entities[j][0] and \
                        (entities[i][2] == entities[j][1] or entities[i][1] == entities[j][2]):
                    to_remove.append(entities[i])
                    to_remove.append(entities[j])

                    new_start = min(entities[i][1], entities[j][1])
                    new_end = max(entities[i][2], entities[j][2])
                    merged_entities.append((entities[i][0], new_start, new_end))
                    merged = True
                    break
            if merged:
                break
        for ent in to_remove:
            entities.remove(ent)
        entities += merged_entities
        if not merged:
            break
    return entities


def set_entities(sentence, entities):
    doc = nlp(sentence)
    ents = []
    for label, start, end in entities:
        ents.append(doc.char_span(start, end, label))
    try:
        doc.ents = ents
    except TypeError:
        pass
    return doc


def apply_ner(input_text_message: str):
    auth_endpoint_token = st.secrets["auth_endpoint_token"]
    endpoint_url = st.secrets["endpoint_url"]

    headers = {
        'Authorization': auth_endpoint_token,
        'Content-Type': 'application/json',
    }

    json_data = {
        'inputs': input_text_message,
    }

    response = requests.post(endpoint_url, headers=headers, json=json_data)

    classifications = response.json()
    entities = postprocess(classifications)
    doc = set_entities(input_text_message, entities)
    displacy_html = displacy.render(doc, style="ent", options=options)
    return displacy_html


examples = ['Things are complicated because we still live together but we have separate lives',
            'My dad is a monster and took his anger out on my mom by verbally abusing her and when she left he eventually moved on to my brother',
            'A two months ago, she was chatting with some random guy',
            'Not I have a horrid relationship with my brother we’ve never gotten along and probably never will',
            'I was outside trying to leave and he caught me to explain why Im so rude',
            ]

iface = gr.Interface(fn=apply_ner, inputs=gr.inputs.Textbox(lines=5, placeholder="Enter your text here",
                                                            label='Check your text for compliance with the NVC rules'),
                     outputs="html", examples=examples)
iface.launch()