Nlp_models/persian_nlp_model_sqlite.py
2025-07-22 10:04:04 +00:00

327 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#بسم الله
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()