--- language: ar datasets: - Marefa-NER --- # Tebyan تبيـان # Marefa Arabic Named Entity Recognition Model # نموذج المعرفة لتصنيف أجزاء النص ## Model description **Marefa-NER** is a Large Arabic NER model built on a completely new dataset and targets to extract up to 9 different types of entities ``` Person, Location, Organization, Nationality, Job, Product, Event, Time, Art-Work ``` نموذج المعرفة لتصنيف أجزاء النص. نموذج جديد كليا من حيث البيانات المستخدمة في تدريب النموذج. كذلك يستهدف النموذج تصنيف حتى 9 أنواع مختلفة من أجزاء النص ``` شخص - مكان - منظمة - جنسية - وظيفة - منتج - حدث - توقيت - عمل إبداعي ``` ## How to use كيف تستخدم النموذج Install transformers AND nltk (python >= 3.6) `$ pip3 install transformers==4.3.0 nltk==3.5 protobuf==3.15.3 torch==1.7.1` > If you are using `Google Colab`, please restart your runtime after installing the packages. ----------- ```python # we need to install NLTK punkt to be used for word tokenization from collections import defaultdict import nltk nltk.download('punkt') from nltk.tokenize import word_tokenize from transformers import AutoTokenizer, AutoModelForTokenClassification from transformers import pipeline # ===== import the model m_name = "marefa-nlp/marefa-ner" tokenizer = AutoTokenizer.from_pretrained(m_name) model = AutoModelForTokenClassification.from_pretrained(m_name) # ===== build the NER pipeline nlp = pipeline("ner", model=model, tokenizer=tokenizer, grouped_entities=True) # ===== extract the entities from a sample text example = 'قاد عمر المختار القوات في ليبيا ضد الجيش الإيطالي' # clean the text example = " ".join(word_tokenize(example)) # feed to the NER model to parse ner_results = nlp(example) # as the [grouped_entities] parameter does not perform well in Arabic, # we prepared a simple fixing code to generate full entities tokens grouped_ner_results = defaultdict(list) fixed_ner_results = [] for ent in ner_results: grouped_ner_results[ent['entity_group']].append(ent) for group, ents in grouped_ner_results.items(): if len(ents) == 1: fixed_ner_results.append(ents[0]) continue current_ent = {"word": ents[0]['word'], "start": ents[0]['start'], "end": ents[0]['end'], "entity_group": group, "score": ents[0]['score']} for i in range(1, len(ents)): if ents[i]['start'] == current_ent["end"]: current_ent["word"] += ents[i]['word'] current_ent["end"] = ents[i]['end'] current_ent["score"] = max(ents[i]['score'], current_ent["score"]) else: fixed_ner_results.append(current_ent) current_ent = {"word": ents[i]['word'], "start": ents[i]['start'], "end": ents[i]['end'], "entity_group": group, "score": ents[i]['score']} fixed_ner_results.append(current_ent) # sort entities fixed_ner_results = sorted(fixed_ner_results, key=lambda e: e['start'], reverse=False) # ===== print the ner_results for ent in fixed_ner_results: print(ent["word"], '->' ,ent['entity_group'], " # score:", "%.2f" % ent['score']) ##### # عمر المختار -> person # score: 1.00 # ليبيا -> location # score: 0.99 # الجيش الإيطالي -> organization # score: 0.99 #### ``` ## Acknowledgment شكر و تقدير قام بإعداد البيانات التي تم تدريب النموذج عليها, مجموعة من المتطوعين الذين قضوا ساعات يقومون بتنقيح البيانات و مراجعتها - على سيد عبد الحفيظ - إشراف - نرمين محمد عطيه - احمد علي عبدربه - عمر بن عبد العزيز سليمان - محمد ابراهيم الجمال - عبدالرحمن سلامه خلف - إبراهيم كمال محمد سليمان - حسن مصطفى حسن - أحمد فتحي سيد - عثمان مندو - عارف الشريف - أميرة محمد محمود - حسن سعيد حسن - عبد العزيز علي البغدادي - واثق عبدالملك الشويطر - عمرو رمضان عقل الحفناوي - حسام الدين أحمد على - أسامه أحمد محمد محمد - حاتم محمد المفتي - عبد الله دردير - أدهم البغدادي - أحمد صبري - عبدالوهاب محمد محمد - أحمد محمد عوض