homa
fix
7fae527
"""
Hugging Face Space: Red Hat product/version NER.
Run NER on text to extract Red Hat products and versions. Model can be loaded
from the Hub (set MODEL_ID in Space settings or use default).
"""
import os
import gradio as gr
from transformers import pipeline
# Model: set in Space "Repository variables" or use default (your NER model on the Hub)
MODEL_ID = os.environ.get("MODEL_ID", "Neda7/ner-linux-product-version")
# Only show these entity types (filters stray labels; model may output PRODUCT, VERSION, etc.)
ALLOWED_ENTITY_GROUPS = {"PRODUCT", "VERSION"}
def load_ner():
return pipeline(
"token-classification",
model=MODEL_ID,
aggregation_strategy="simple",
)
# Lazy load so Space starts even if model is large
_ner = None
def get_ner():
global _ner
if _ner is None:
_ner = load_ner()
return _ner
def run_ner(text: str, min_confidence: float = 0.5) -> str:
if not text or not text.strip():
return "Enter some text to extract Red Hat products and versions."
try:
pipe = get_ner()
raw = pipe(text.strip())
except Exception as e:
return f"Error: {e}"
# Filter: keep only allowed types and scores >= threshold (removes junk low-confidence spans)
entities = []
for e in raw:
label = e.get("entity_group", e.get("entity", "?"))
if label not in ALLOWED_ENTITY_GROUPS:
continue
score = e.get("score")
if score is not None and score < min_confidence:
continue
entities.append(e)
if not entities:
return (
"No Red Hat products or versions detected above the confidence threshold. "
"Try lowering the **Min. confidence** slider or check that the text contains product/version names."
)
lines = []
for e in entities:
label = e.get("entity_group", e.get("entity", "?"))
word = e.get("word", "").strip()
score = e.get("score")
score_str = f" ({score:.2f})" if score is not None else ""
lines.append(f"- **{label}**: {word}{score_str}")
return "\n".join(lines)
with gr.Blocks(title="Red Hat NER", theme=gr.themes.Soft()) as demo:
gr.Markdown(
"## Red Hat product & version NER\n"
"Paste text below to detect Red Hat **products** (e.g. RHEL, OpenShift) and **versions**."
)
inp = gr.Textbox(
label="Input text",
placeholder="e.g. We use RHEL 8 and OpenShift 4.10 in production.",
lines=4,
)
min_conf = gr.Slider(
minimum=0.1,
maximum=0.95,
value=0.5,
step=0.05,
label="Min. confidence",
info="Hide entities below this score (higher = fewer, more precise results).",
)
out = gr.Markdown(label="Entities")
btn = gr.Button("Extract entities")
btn.click(fn=run_ner, inputs=[inp, min_conf], outputs=out)
gr.Markdown(
"Model is loaded from the Hugging Face Hub. "
"To use your own model, set the `MODEL_ID` variable in this Space's settings."
)
demo.launch()