Spaces:
Running
Running
| # 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) |