File size: 4,208 Bytes
b495719
ab78124
 
b495719
 
ab78124
b495719
 
 
ab78124
b495719
ab78124
 
 
 
 
 
 
b495719
ab78124
 
 
 
 
 
 
 
 
b495719
 
 
 
ab78124
b495719
 
 
 
 
 
 
 
 
 
 
 
ab78124
b495719
 
ab78124
b495719
ab78124
 
b495719
 
 
 
 
 
 
 
 
 
ab78124
 
b495719
ab78124
b495719
ab78124
b495719
ab78124
b495719
 
ab78124
 
 
 
 
 
b495719
ab78124
b495719
ab78124
 
 
b495719
 
 
 
 
 
 
 
 
 
 
 
 
 
ab78124
 
b495719
 
 
 
 
 
ab78124
b495719
ab78124
 
b495719
ab78124
b495719
 
ab78124
 
b495719
ab78124
b495719
 
ab78124
b495719
 
ab78124
 
b495719
 
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# import examples object from examples.json file
import json

with open("examples.json", "r") as f:
    examples = json.load(f)

from typing import Dict, Union
from gliner import GLiNER
import gradio as gr

model = GLiNER.from_pretrained("urchade/gliner_medium-v2.1")

def merge_entities(entities):
    if not entities:
        return []
    merged = []
    current = entities[0]
    for next_entity in entities[1:]:
        if next_entity['entity'] == current['entity'] and (next_entity['start'] == current['end'] + 1 or next_entity['start'] == current['end']):
            current['word'] += ' ' + next_entity['word']
            current['end'] = next_entity['end']
        else:
            merged.append(current)
            current = next_entity
    merged.append(current)
    return merged

def ner(
    text, labels: str, threshold: float, nested_ner: bool
) -> Dict[str, Union[str, int, float]]:
    labels = labels.split(",")
    r = {
        "text": text,
        "entities": [
            {
                "entity": entity["label"],
                "word": entity["text"],
                "start": entity["start"],
                "end": entity["end"],
                "score": 0,
            }
            for entity in model.predict_entities(
                text, labels, flat_ner=not nested_ner, threshold=threshold
            )
        ],
    }
    # r["entities"] =  merge_entities(r["entities"])
    return r

with gr.Blocks(title="GLiNER-medium-v2.1") as demo:
    gr.Markdown(
        """
        # GLiNER Testbed

        GLiNER is a Named Entity Recognition (NER) model capable of identifying any entity type using a bidirectional transformer encoder (BERT-like). It provides a practical alternative to traditional NER models, which are limited to predefined entities, and Large Language Models (LLMs) that, despite their flexibility, are costly and large for resource-constrained scenarios. This model has the commercially permissive Apache 2.0 license.

        ## Links

        * Model: https://huggingface.co/urchade/gliner_medium-v2.1
        * All GLiNER models: https://huggingface.co/models?library=gliner
        * Paper: https://arxiv.org/abs/2311.08526
        * Repository: https://github.com/urchade/GLiNER
        """
    )

    input_text = gr.Textbox(
        value=examples[0][0], label="Text input", placeholder="Enter your text here"
    )
    with gr.Row() as row:
        labels = gr.Textbox(
            value=examples[0][1],
            label="Labels",
            placeholder="Enter your labels here (comma separated)",
            scale=2,
        )
        threshold = gr.Slider(
            0,
            1,
            value=0.3,
            step=0.01,
            label="Threshold",
            info="Lower the threshold to increase how many entities get predicted.",
            scale=1,
        )
        with gr.Column() as col:
            nested_ner = gr.Checkbox(
                value=examples[0][2],
                label="Nested NER",
                info="Allow for nested NER?",
                scale=0,
            )
            merged_ent = gr.Checkbox(
                #value=examples[0][3],
                value=False,
                label="Merged Entities",
                info="Merge adjacent entities?",
                scale=0,
            )
    output = gr.HighlightedText(label="Predicted Entities")
    submit_btn = gr.Button("Submit")
    examples = gr.Examples(
        examples,
        fn=ner,
        inputs=[input_text, labels, threshold, nested_ner],
        outputs=output,
        cache_examples=True,
    )

    # Submitting
    input_text.submit(
        fn=ner, inputs=[input_text, labels, threshold, nested_ner], outputs=output
    )
    labels.submit(
        fn=ner, inputs=[input_text, labels, threshold, nested_ner], outputs=output
    )
    threshold.release(
        fn=ner, inputs=[input_text, labels, threshold, nested_ner], outputs=output
    )
    submit_btn.click(
        fn=ner, inputs=[input_text, labels, threshold, nested_ner], outputs=output
    )
    nested_ner.change(
        fn=ner, inputs=[input_text, labels, threshold, nested_ner], outputs=output
    )

demo.queue()
demo.launch(debug=True)