diff --git a/hugingFace_persianModelList.py b/hugingFace_persianModelList.py new file mode 100644 index 0000000..ba746bf --- /dev/null +++ b/hugingFace_persianModelList.py @@ -0,0 +1,173 @@ +from huggingface_hub import HfApi +import json +import datetime + + + +# تعریف تسک‌های رایج NLP +nlp_task_list = [ + "text-classification", + "token-classification", + "question-answering", + "summarization", + "translation", + "text-generation", + "fill-mask", + "zero-shot-classification", + "feature-extraction", + "sentence-similarity", + "text2text-generation", + "conversational" +] + +def persian_model_finder(nlp_tasks,json_file_name): + + api = HfApi() + all_persian_nlp_models_data = [] + seen_model_ids = set() # برای جلوگیری از اضافه شدن مدل‌های تکراری + + print("در حال جستجو و استخراج اطلاعات مدل‌های NLP فارسی...") + + # فیلتر کردن و پیمایش روی مدل‌ها + # برای هر تسک NLP، مدل‌های فارسی را جستجو می‌کنیم. + # محدودیت 500 مدل برای هر تسک در نظر گرفته شده است تا از دانلود بیش از حد جلوگیری شود. + # اگر می‌خواهید همه مدل‌ها را استخراج کنید، ممکن است نیاز به پیجینیشن (pagination) باشد. + for task in nlp_tasks: + print(f" جستجو برای تسک: {task} (زبان: فارسی)...") + try: + models_for_task = api.list_models( + language="fa", + task=task, + sort="downloads", + direction=-1, # نزولی (از بیشترین دانلود به کمترین) + limit=None # می‌توانید این عدد را تغییر دهید + ) + + for model_info in models_for_task: + if model_info.id not in seen_model_ids: + try : # اگر از کارت مدل توانست اطلاعات بیشتری به دست بیاورد : + model_ = api.model_info(model_info.id) # به دست آوردن شناسه مدل + card_data_dict = model_.card_data.to_dict() # از روی کارت مدل که شامل اطلاعات مدل میباشد یک دیکشنری میسازیم + model_data = { + "model_id": model_info.id, + "url": f"https://huggingface.co/{model_info.id}", + "downloads": model_info.downloads, + "private": model_info.private, + "author": model_info.author, + "tags": model_info.tags, # شامل زبان‌ها، تسک‌ها، لایبرری‌ها و... + "tag_dataset":"-", + "tag_base_model":"-", + "tag_license":"-", + "tag_region":"-", + "pipeline_tag": model_info.pipeline_tag, # تسک اصلی مدل که توسط هاب تعیین شده + "Likes":model_info.likes, + # چهار مورد پایینی از روی دیکشنری کارت مدل خوانده میشود + "languages":card_data_dict.get('language', 'N/A'), # زبان هایی که پشتیبانی میشود + "library":card_data_dict.get('library', 'N/A'), # کتابخانه های مورد استفاده + "datasets":card_data_dict.get('datasets', 'N/A'), # دیتابیس های مورد استفاده + "license":card_data_dict.get('license', 'N/A'), + "just_persian" : False + + } + + if model_data["library"] == 'N/A': # در بعضی موارد کتابخانه به این نام ('library_name') در دیکشنری کارت مدل ذخیره شده + model_data["library"] = card_data_dict.get('library_name', 'N/A') + # شرط پایینی ، مواردی که فقط مختص زبان فارسی هستند را در دیکشنری مشخص میکند + if len(model_data["languages"]) == 2 and "multilingual" in model_data["languages"] or\ + len(model_data["languages"]) == 2 and "persian" in model_data["languages"] or\ + len(model_data["languages"]) == 2 and "farsi" in model_data["languages"] or\ + len(model_data["languages"]) == 2 and "fas" in model_data["languages"] or\ + len(model_data["languages"]) == 2 and model_data["languages"]=="fa" or\ + model_data["languages"] == "persian" or\ + model_data["languages"] == "farsi" or\ + model_data["languages"] == "fas" or\ + model_data["languages"] == "pes" or\ + len(model_data["languages"]) == 1 : + model_data["just_persian"] = True + + for value in model_data["tags"]: + + if "dataset:" in value : + if type(model_data["tag_dataset"]) == type(""): + model_data["tag_dataset"] = list(model_data["tag_dataset"]) + model_data["tag_dataset"].pop(0) + model_data["tag_dataset"].append(f"{str(value).replace("dataset:","")}") + + if "base_model:" in value : + if type(model_data["tag_base_model"]) == type(""): + model_data["tag_base_model"] = list(model_data["tag_base_model"]) + model_data["tag_base_model"].pop(0) + model_data["tag_base_model"].append(f"{str(value).replace("base_model:","")}") + + if "region:" in value : + model_data["tag_region"]=f"{str(value).replace("region:","")}" + + if "license:" in value : + model_data["tag_license"]=f"{str(value).replace("license:","")}" + + + all_persian_nlp_models_data.append(model_data) + seen_model_ids.add(model_info.id) + + except : # اگر استفاده از کارت مدل با مشکل مواجه شد : + model_data = { + "model_id": model_info.id, + "url": f"https://huggingface.co/{model_info.id}", + "downloads": model_info.downloads, + "private": model_info.private, + "author": model_info.author, + "tags": model_info.tags, # شامل زبان‌ها، تسک‌ها، لایبرری‌ها و... + "pipeline_tag": model_info.pipeline_tag, # تسک اصلی مدل که توسط هاب تعیین شده + "Likes":model_info.likes, + "library":model_info.library_name, + # افزودن لایسنس اگر موجود باشد + "license": model_info.card_data.license if model_info.card_data and model_info.card_data.license else "N/A" + } + + for value in model_data["tags"]: + + if "dataset:" in value : + if type(model_data["tag_dataset"]) == type(""): + model_data["tag_dataset"] = list(model_data["tag_dataset"]) + model_data["tag_dataset"].pop(0) + model_data["tag_dataset"].append(f"{str(value).replace("dataset:","")}") + + if "base_model:" in value : + if type(model_data["tag_base_model"]) == type(""): + model_data["tag_base_model"] = list(model_data["tag_base_model"]) + model_data["tag_base_model"].pop(0) + model_data["tag_base_model"].append(f"{str(value).replace("base_model:","")}") + + if "region:" in value : + model_data["tag_region"]=f"{str(value).replace("region:","")}" + + if "license:" in value : + model_data["tag_license"]=f"{str(value).replace("license:","")}" + + all_persian_nlp_models_data.append(model_data) + seen_model_ids.add(model_info.id) + + print(f" تعداد مدل‌های یافت شده برای تسک '{task}': {len(models_for_task)}") + + except Exception as e: + print(f" خطا در جستجو برای تسک {task}: {e}") + + # مرتب‌سازی نهایی مدل‌ها بر اساس تعداد دانلود (کل لیست) + # این مرحله اطمینان می‌دهد که حتی اگر مدل‌ها از تسک‌های مختلف جمع‌آوری شده باشند، + # در نهایت بر اساس دانلود مرتب شده باشند. + all_persian_nlp_models_data_sorted = sorted(all_persian_nlp_models_data, key=lambda x: x['downloads'], reverse=True) + + print(f"\nتعداد کل مدل‌های NLP فارسی منحصربه‌فرد یافت شده: {len(all_persian_nlp_models_data_sorted)}") + + # ذخیره اطلاعات در یک فایل JSON + output_json_file = f"{json_file_name}" + with open(output_json_file, "w", encoding="utf-8") as f: + json.dump(all_persian_nlp_models_data_sorted, f, ensure_ascii=False, indent=4) + + print(f"اطلاعات {len(all_persian_nlp_models_data_sorted)} مدل در فایل '{output_json_file}' ذخیره شد.") + + + +persian_model_finder(nlp_task_list,"persian_nlp_models_info.json") + +