diff --git a/persian_nlp_model.db b/persian_nlp_model.db new file mode 100644 index 0000000..01500ef Binary files /dev/null and b/persian_nlp_model.db differ diff --git a/persian_nlp_model_sqlite.py b/persian_nlp_model_sqlite.py new file mode 100644 index 0000000..a80ebe3 --- /dev/null +++ b/persian_nlp_model_sqlite.py @@ -0,0 +1,326 @@ +#بسم الله +from huggingface_hub import HfApi +from datetime import date +from fpdf import FPDF +import random +import sqlite3 +import string + + + + +list1 = ["ID","model_id","url","downloads","private","author","tags","tag_dataset",\ + "tag_base_model","tag_license","tag_region","pipeline_tag","Likes","languages",\ + "library","datasets","license","just_persian","deleted","date_added"] +cnt = sqlite3.connect("persian_nlp_model.db") +c = cnt.cursor() +today = date.today() +d1 = today.strftime("%d-%m-%Y") + + + + +# فقط برای اولین بار که جدول قرار است ساخته شود از این کد ها استفاده شود +# c.execute("""CREATE TABLE PersianNlp( +# ID INT PRIMARY KEY , +# model_id TEXT , +# url TEXT , +# downloads INT, +# private TEXT, +# author TEXT, +# tags TEXT, +# tag_dataset TEXT, +# tag_base_model TEXT, +# tag_license TEXT, +# tag_region TEXT, +# pipeline_tag TEXT, +# Likes INT, +# languages TEXT, +# library TEXT, +# datasets TEXT, +# license TEXT, +# just_persian TEXT, +# deleted TEXT, +# date_added TEXT +# );""") + + + +# برای ساخت جدول میزان دانلود ها از این کد استفاده شود +# c.execute("""CREATE TABLE downloadCountHistory( +# ID INT PRIMARY KEY , +# key_id INT , +# downloads INT, +# date TEXT +# );""") + + + + + +# تعریف تسک‌های رایج 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 generate_random_id(length=10, chars=string.ascii_letters + string.digits): + """ + یک آیدی تصادفی با طول مشخص و از کاراکترهای داده شده تولید می‌کند. + :param length: طول آیدی (پیش‌فرض: 10) + :param chars: رشته‌ای از کاراکترهای مجاز (پیش‌فرض: حروف کوچک و بزرگ انگلیسی + ارقام) + :return: رشته آیدی تصادفی + """ + return ''.join(random.choice(chars) for _ in range(length)) + + + + +def persian_model_finder(nlp_tasks,idx): + today = date.today() + download_date = today.strftime("%d/%m/%Y") + idX = idx # اخرین آیدی موجود در دیتابیس را وارد میکنیم تا موارد جدید با آیدی های قبلی تداخل نکند + api = HfApi() + all_persian_nlp_models_data = [] + seen_model_ids = set() # برای جلوگیری از اضافه شدن مدل‌های تکراری + + print("در حال جستجو و استخراج اطلاعات مدل‌های NLP فارسی...") + + # فیلتر کردن و پیمایش روی مدل‌ها + # برای هر تسک NLP، مدل‌های فارسی را جستجو می‌کنیم. + # محدودیت 500 مدل برای هر تسک در نظر گرفته شده است تا از دانلود بیش از حد جلوگیری شود. + # اگر می‌خواهید همه مدل‌ها را استخراج کنید، ممکن است نیاز به پیجینیشن (pagination) باشد. + + try: + allModel = c.execute(f'''SELECT * +FROM PersianNlp''') + for model in allModel: + seen_model_ids.add(model[1]) + except: + print("database not find!") + + 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: + idX+=1 + # 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", + "deleted" : "False", + "date_added" : f"{download_date}" + + } + + 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) + c.execute(f"""INSERT INTO PersianNlp (ID,model_id,url,downloads,private,author,tags,tag_dataset,tag_base_model,tag_license,tag_region,pipeline_tag,Likes,languages,library,datasets,license,just_persian,deleted,date_added) +VALUES ({idX},"{model_data["model_id"]}","{model_data["url"]}",{model_data["downloads"]},"{model_data["private"]}","{model_data["author"]}","{model_data["tags"]}","{model_data["tag_dataset"]}","{model_data["tag_base_model"]}","{model_data["tag_license"]}","{model_data["tag_region"]}","{model_data["pipeline_tag"]}",{model_data["Likes"]},"{model_data["languages"]}","{model_data["library"]}","{model_data["datasets"]}","{model_data["license"]}","{model_data["just_persian"]}","{model_data["deleted"]}","{model_data["date_added"]}");""") + cnt.commit() + seen_model_ids.add(model_info.id) + + print(f"\nتعداد کل مدل‌های NLP فارسی منحصربه‌فرد یافت شده: {len(seen_model_ids)}") + +#اول لیست تسک ها را میدهیم برای جست و جو ، و بعد آخرین آیدی که در تیبل مدلها در دیتابیس موجود است +# persian_model_finder(nlp_task_list,8288) + + + + +def search(name,search_by): + + X = "------------------------------------------------------------------------------------\n+-+-+-+- FOUND MODEL +-+-+-+-\n------------------------------------------------------------------------------------\n\n" + n=0 + + if search_by == "name": + + model = c.execute(f'''SELECT * + FROM PersianNlp + WHERE model_id="{name}"''') + for x in model: + for y in x : + X+= f"{list1[n]} : {y}\n-----------------------------------------------------------------\n" + n+=1 + X+="\n\n" + n = 0 + print(X) + + if search_by == "task": + + model = c.execute(f'''SELECT * + FROM PersianNlp + WHERE pipeline_tag="{name}"''') + + for x in model: + for y in x : + X+= f"{list1[n]} : {y}\n-----------------------------------------------------------------\n" + n+=1 + X+="\n\n" + n = 0 + print(X) + +# search("text-ranking","task") + + + + +def pdf_saver(name): + + + X = "------------------------------------------------------------------------------------\n\ + +-+-+-+- FOUND MODEL +-+-+-+-\ + \n------------------------------------------------------------------------------------\n\n" + model = c.execute(f'''SELECT * +FROM PersianNlp +WHERE model_id="{name}"''') + n=0 + for x in model: + for y in x : + X+= f"{list1[n]} : {y}\n-----------------------------------------------------------------\n" + n+=1 + print(X) + pdf = FPDF() + pdf.add_page() + pdf.set_font("Arial", size=12) + pdf.multi_cell(0, 10, X) + pdf.output("found_model.pdf") + print("PDF generated successfully!") + +# pdf_saver("Alibaba-NLP/gte-multilingual-reranker-base") + + + + +# برای پیدا کردن مدل ها بر اساس تاریخ ، برای مثال سه ماه پیش +# راهنمایی بیشتر در انتها +def find_by_date(month_later , year_later): + + today = date.today() + date_year = today.strftime("%Y") + date_month = today.strftime("%m") + month = int(date_month) + year = int(date_year) + allModel = c.execute(f'''SELECT * +FROM PersianNlp''') + n=0 + for model in allModel: + if int(model[19].split("/")[1]) >= month-month_later and int(model[19].split("/")[2]) >= year-year_later : + X = "" + for y in model : + X+= f"{list1[n]} : {y}\n-----------------------------------------------------------------\n" + n+=1 + n = 0 + print(X) + +# برای مثال میخواهیم مدل های یک سال و شش ماه قبل تا الان را ببینیم +# اول ماه و بعد سال را وارد میکنیم به این صورت : +# find_by_date(6,1) + +# یا میخواهیم مدل های سه ماه گذشته را ببینیم : +# find_by_date(3,0) + + + + +def add_download_count(): + + count = 1 + api = HfApi() + allModel = c.execute(f'''SELECT * +FROM PersianNlp''') + all_model_id = [] + for model in allModel: + all_model_id.append([model[0],model[1]]) + + for id_ in all_model_id: + # try: + print(count) + count+=1 + id_12_digits = generate_random_id(length=12, chars=string.digits) + model_details = api.model_info(repo_id=id_[1]) + c.execute(f"""INSERT INTO downloadCountHistory(ID,key_id,downloads,date) + VALUES ({id_12_digits},"{int(id_[0])}","{int(model_details.downloads)}","{str(d1)}");""") + cnt.commit() + # except: + # print("Error!!") + +# add_download_count() + +