--- license: cc-by-4.0 datasets: - pythainlp/thainer-corpus-v2 language: - th metrics: - f1 widget: - text: "ฉันชื่อ นางสาวมะลิวา บุญสระดี อาศัยอยู่ที่อำเภอนางรอง จังหวัดบุรีรัมย์ อายุ 23 ปี เพิ่งเรียนจบจาก มหาวิทยาลัยขอนแก่น และนี่คือข้อมูลปลอม ชื่อคนไม่มีอยู่จริง" --- This is a Named Entity Recognition model that trained with [Thai NER v2.0 Corpus](https://huggingface.co/datasets/pythainlp/thainer-corpus-v2) Training script and split data: [https://zenodo.org/record/7761354](https://zenodo.org/record/7761354) The model was trained by [WangchanBERTa base model](https://huggingface.co/airesearch/wangchanberta-base-att-spm-uncased). Validation from the Validation set - Precision: 0.830336794125095 - Recall: 0.873701039168665 - F1: 0.8514671513892494 - Accuracy: 0.9736483416628805 Test from the Test set - Precision: 0.8199168093956447 - Recall: 0.8781446540880503 - F1: 0.8480323927622422 - Accuracy: 0.9724346779516247 Download: [HuggingFace Hub](https://huggingface.co/datasets/pythainlp/thainer-corpus-v2) Read more: [Thai NER v2.0](https://pythainlp.github.io/Thai-NER/version/2) ## Inference Huggingface doesn't support inference token classification for Thai and It will give wrong tag. You must using this code. ```python from transformers import AutoTokenizer from transformers import AutoModelForTokenClassification from pythainlp.tokenize import word_tokenize # pip install pythainlp import torch name="pythainlp/thainer-corpus-v2-base-model" tokenizer = AutoTokenizer.from_pretrained(name) model = AutoModelForTokenClassification.from_pretrained(name) sentence="ฉันชื่อ นางสาวมะลิวา บุญสระดี อาศัยอยู่ที่อำเภอนางรอง จังหวัดบุรีรัมย์ อายุ 23 ปี เพิ่งเรียนจบจาก มหาวิทยาลัยขอนแก่น และนี่คือข้อมูลปลอมชื่อคนไม่มีอยู่จริง อายุ 23 ปี" cut=word_tokenize(sentence.replace(" ", "<_>")) inputs=tokenizer(cut,is_split_into_words=True,return_tensors="pt") ids = inputs["input_ids"] mask = inputs["attention_mask"] # forward pass outputs = model(ids, attention_mask=mask) logits = outputs[0] predictions = torch.argmax(logits, dim=2) predicted_token_class = [model.config.id2label[t.item()] for t in predictions[0]] def fix_span_error(words,ner): _ner = [] _ner=ner _new_tag=[] for i,j in zip(words,_ner): #print(i,j) i=tokenizer.decode(i) if i.isspace() and j.startswith("B-"): j="O" if i=='' or i=='' or i=='': continue if i=="<_>": i=" " _new_tag.append((i,j)) return _new_tag ner_tag=fix_span_error(inputs['input_ids'][0],predicted_token_class) print(ner_tag) ``` output: ```python [('ฉัน', 'O'), ('ชื่อ', 'O'), (' ', 'O'), ('นางสาว', 'B-PERSON'), ('มะลิ', 'I-PERSON'), ('วา', 'I-PERSON'), (' ', 'I-PERSON'), ('บุญ', 'I-PERSON'), ('สระ', 'I-PERSON'), ('ดี', 'I-PERSON'), (' ', 'O'), ('อาศัย', 'O'), ('อยู่', 'O'), ('ที่', 'O'), ('อําเภอ', 'B-LOCATION'), ('นาง', 'I-LOCATION'), ('รอง', 'I-LOCATION'), (' ', 'O'), ('จังหวัด', 'B-LOCATION'), ('บุรีรัมย์', 'I-LOCATION'), (' ', 'O'), ('อายุ', 'O'), (' ', 'O'), ('23', 'B-AGO'), (' ', 'I-AGO'), ('ปี', 'I-AGO'), (' ', 'O'), ('เพิ่ง', 'O'), ('เรียนจบ', 'O'), ('จาก', 'O'), (' ', 'O'), ('มหาวิทยาลั', 'B-ORGANIZATION'), ('ยขอนแก่น', 'I-ORGANIZATION'), (' ', 'O'), ('และ', 'O'), ('นี่', 'O'), ('คือ', 'O'), ('ข้อมูล', 'O'), ('ปลอม', 'O'), ('ชื่อ', 'O'), ('คน', 'O'), ('ไม่', 'O'), ('มี', 'O'), ('อยู่', 'O'), ('จริง', 'O'), (' ', 'O'), ('อายุ', 'O'), (' ', 'O'), ('23', 'B-AGO'), (' ', 'O'), ('ปี', 'I-AGO')] ``` ## Cite > Wannaphong Phatthiyaphaibun. (2022). Thai NER 2.0 (2.0) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.7761354 or BibTeX ``` @dataset{wannaphong_phatthiyaphaibun_2022_7761354, author = {Wannaphong Phatthiyaphaibun}, title = {Thai NER 2.0}, month = sep, year = 2022, publisher = {Zenodo}, version = {2.0}, doi = {10.5281/zenodo.7761354}, url = {https://doi.org/10.5281/zenodo.7761354} } ```