# 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)