|
|
import gradio as gr |
|
|
from transformers import pipeline |
|
|
import pandas as pd |
|
|
import time |
|
|
TASK = "fill-mask" |
|
|
MODEL_OPTIONS = [ |
|
|
"ai-forever/ruBert-large", |
|
|
"google-bert/bert-base-multilingual-cased", |
|
|
"FacebookAI/xlm-roberta-large" |
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
MAX_CHARS = 500 |
|
|
|
|
|
|
|
|
def run_mask(text, top_k, model_name): |
|
|
|
|
|
fill_mask = pipeline(TASK, model=model_name) |
|
|
|
|
|
if text is None or not text.strip(): |
|
|
return "ошибка", None, None |
|
|
|
|
|
|
|
|
if "[MASK]" not in text: |
|
|
return "ошибка. Добавьте [MASK] в текст", None, "-" |
|
|
|
|
|
|
|
|
text = text.strip() |
|
|
|
|
|
if len(text) > MAX_CHARS: |
|
|
text = text[:MAX_CHARS] |
|
|
|
|
|
|
|
|
processed_text = text.replace("[MASK]", fill_mask.tokenizer.mask_token) |
|
|
|
|
|
|
|
|
t0 = time.time() |
|
|
|
|
|
try: |
|
|
|
|
|
preds = fill_mask(processed_text, top_k=int(top_k)) |
|
|
|
|
|
|
|
|
latency = round((time.time() - t0) * 1000, 1) |
|
|
|
|
|
|
|
|
rows = [] |
|
|
|
|
|
for p in preds: |
|
|
|
|
|
rows.append({ |
|
|
"Вариант": p["token_str"], |
|
|
"Вероятность": round(p["score"], 3), |
|
|
"Предложение": p["sequence"] |
|
|
}) |
|
|
|
|
|
|
|
|
df = pd.DataFrame(rows) |
|
|
|
|
|
|
|
|
return "okey", df, f"{latency} ms" |
|
|
|
|
|
|
|
|
except Exception as e: |
|
|
return f"Error {type(e).__name__}: {e}", None, None |
|
|
|
|
|
|
|
|
|
|
|
def clear_all(): |
|
|
return "", "", None, "" |
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
|
|
|
|
|
|
gr.Markdown( |
|
|
f""" |
|
|
### Заполнение маски (Fill Mask) |
|
|
**Задача:** {TASK} |
|
|
""" |
|
|
) |
|
|
|
|
|
|
|
|
inp = gr.Textbox( |
|
|
lines=4, |
|
|
label="Введите текст с [MASK]", |
|
|
placeholder="На ужин я приготовил [MASK] с овощами." |
|
|
) |
|
|
|
|
|
|
|
|
top_k = gr.Slider( |
|
|
minimum=1, |
|
|
maximum=10, |
|
|
value=5, |
|
|
step=1, |
|
|
label="Количество вариантов (top_k)" |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
model_select = gr.Dropdown( |
|
|
choices=MODEL_OPTIONS, |
|
|
value=MODEL_OPTIONS[0], |
|
|
label="Выберите модель" |
|
|
) |
|
|
|
|
|
|
|
|
with gr.Row(): |
|
|
|
|
|
btn_run = gr.Button("Обработать") |
|
|
btn_clear = gr.Button("Очистить") |
|
|
|
|
|
|
|
|
status = gr.Textbox(label="Статус") |
|
|
out = gr.DataFrame(label="Результат модели") |
|
|
latency = gr.Textbox(label="Время ответа") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btn_run.click( |
|
|
run_mask, |
|
|
inputs=[inp, top_k, model_select], |
|
|
outputs=[status, out, latency] |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
btn_clear.click( |
|
|
clear_all, |
|
|
outputs=[inp, status, out, latency] |
|
|
) |
|
|
|
|
|
|
|
|
gr.Examples( |
|
|
examples=[ |
|
|
["Терпение и труд всё [MASK]."], |
|
|
["В шкафу лежал старый [MASK], который никто не использовал."], |
|
|
["Этот фильм оказался очень [MASK]."], |
|
|
["Лучше один раз увидеть, чем сто раз [MASK]."], |
|
|
["Сквозь шум города прорывался тихий [MASK] надежды."] |
|
|
|
|
|
], |
|
|
inputs=inp |
|
|
) |
|
|
|
|
|
|
|
|
demo.launch() |
|
|
|