|
import json |
|
from functools import partial |
|
from typing import Callable, Dict |
|
import transformers |
|
from transformers import ( |
|
AutoModelForTokenClassification, |
|
AutoTokenizer |
|
) |
|
|
|
from pipeline import ( |
|
TokenClassificationPipeline |
|
) |
|
import pythainlp |
|
from pprint import pprint |
|
from itertools import chain |
|
|
|
import gradio as gr |
|
|
|
|
|
ner_pipeline_group = TokenClassificationPipeline( |
|
model=AutoModelForTokenClassification.from_pretrained( |
|
'airesearch/wangchanberta-base-att-spm-uncased', |
|
revision='finetuned@thainer-ner' |
|
), |
|
tokenizer=AutoTokenizer.from_pretrained( |
|
'airesearch/wangchanberta-base-att-spm-uncased', |
|
revision='finetuned@thainer-ner' |
|
), |
|
space_token='<_>', |
|
lowercase=True, |
|
group_entities=True, |
|
strict=False, |
|
) |
|
|
|
color_mapper = { |
|
"DATE": "#f94144", |
|
"EMAIL":"#f3722c", |
|
"LAW":"#f8961e", |
|
"LEN":"#f9844a", |
|
"LOCATION":"#f9c74f", |
|
"MONEY":"#ffcb77", |
|
"ORGANIZATION":"#f5cac3", |
|
"PERCENT":"#90be6d", |
|
"PERSON":"#bfd200", |
|
"PHONE":"#43aa8b", |
|
"TIME":"#4d908e", |
|
"URL":"#577590", |
|
"ZIP":"#90e0ef", |
|
} |
|
|
|
|
|
css_text = 'p{width: 700px; color: #333; border-radius: 3px; border: solid 1.5px #DDD; background-color: #FFF;\n margin: 10px;\n padding: 30px}\n' |
|
for k,v in color_mapper.items(): |
|
css_text += "span."+f"{k.lower()}" \ |
|
+"{\n background-color: " \ |
|
+f"{v}"+"50;\n color: #333;\n border-right: 4px solid " \ |
|
+f"{v}"+";" \ |
|
+ "\n align-items: center;" \ |
|
+ "\n margin: 0;" \ |
|
+ "\n padding: 2px 8px;" \ |
|
+ "\n border-radius: 3px;\n}\n" \ |
|
+"span."+f"{k.lower()}"+"::after {" \ |
|
+"\npadding: 2px 1px;" \ |
|
+"font-size: 9.5px;" \ |
|
+"font-weight: bold;" \ |
|
+"font-family: Monaco;" \ |
|
+"vertical-align: super;" \ |
|
+"content: \"" + k.upper() + "\";" \ |
|
+"}\n" \ |
|
|
|
|
|
def modifiy_segment(text, tag, start, end): |
|
replaced_text = text[:start] + f'<span class="{tag}">' + text[start:end] +'</span>' + text[end:] |
|
return replaced_text, len(f'<span class="{tag}">') + len('</span>') |
|
|
|
|
|
def render_doc_with_label(label: Dict, doc: str): |
|
attribute_items = [] |
|
for i, ne_span in enumerate(label): |
|
if ne_span['entity_group'] != 'O': |
|
attribute_name = ne_span['entity_group'] |
|
attribute_name = attribute_name.lower() |
|
|
|
begin_char_idx = ne_span['begin_char_index'] |
|
|
|
tagged_text = ne_span['word'] |
|
end_char_idx = begin_char_idx + len(tagged_text) |
|
|
|
attribute_items.append((attribute_name, begin_char_idx, end_char_idx)) |
|
|
|
attribute_items = sorted(attribute_items, key=lambda x: (x[1])) |
|
print(f'attribute_items: {attribute_items}') |
|
|
|
acc_n_extra_chars = 0 |
|
modified_segment = doc |
|
for _selected_attribute_item in attribute_items: |
|
|
|
tag, start, end = _selected_attribute_item[0], _selected_attribute_item[1], _selected_attribute_item[2] |
|
|
|
modified_segment, n_extra_chars = modifiy_segment(modified_segment, tag, start + acc_n_extra_chars, end + acc_n_extra_chars) |
|
acc_n_extra_chars += n_extra_chars |
|
|
|
return f'<style>{css_text}</style><p>{modified_segment}</p>' |
|
|
|
def ner_tagging(text: str): |
|
results = ner_pipeline_group(text) |
|
print(f'results:\n{results}') |
|
html_text = render_doc_with_label(results, text) |
|
|
|
return json.dumps(results, ensure_ascii=False, indent=4), html_text |
|
|
|
|
|
demo = gr.Interface(fn=ner_tagging, |
|
inputs=gr.Textbox(lines=5, placeholder='Input text in Thai', label='Input text'), |
|
examples=[ |
|
["ไมโครซอฟท์ได้จัดจำหน่ายบนแพลตฟอร์มไมโครซอฟท์ วินโดวส์ ในเดือนเมษายน 2020"], |
|
['ชัชชาติ สิทธิพันธุ์ ผู้ว่าราชการกรุงเทพมหานคร (กทม.) คนที่ 17 เตรียมเข้ารับตำแหน่งอย่างเป็นทางการและเปิดตัวทีมงานในช่วงบ่ายวันนี้ (1 มิ.ย.) หลังรับมอบหนังสือรับรองการเป็นผู้ว่าฯ กทม. ที่สำนักงานคณะกรรมการการเลือกตั้ง (กกต.)'], |
|
["สถาบันวิทยาศาสตร์ทางทะเล มหาวิทยาลัยบูรพา เปิดให้บริการมายาวนานกว่า 30 ปี ตั้งอยู่บริเวณด้านหน้า มหาวิทยาลัยบูรพา บนเนื้อที่กว่า 30 ไร่ เป็นสถานที่ท่องเที่ยว ที่จัดแสดงเพื่อให้ความรู้เกี่ยวกับวิทยาศาสตร์ทางทะเล สิ่งมีชีวิตและความเป็นอยู่ของสัตว์ทะเลชนิดต่างๆที่อาศัยอยู่ในเขตน่านน้ำของไทย"], |
|
|
|
|
|
], |
|
|
|
outputs=[gr.Textbox(), gr.HTML()]) |
|
|
|
print(f'\nINFO: transformers.__version__: {transformers.__version__}') |
|
print(f'\nINFO: pythainlp.__version__: {pythainlp.__version__}') |
|
demo.launch() |