Spaces:
Sleeping
Sleeping
import pandas as pd | |
import re | |
import json | |
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline | |
import gradio as gr | |
import tempfile | |
def read_from_excel(file_path): | |
df = pd.read_excel(file_path) | |
items = df['object'].astype(str).tolist() # تبدیل همه مقادیر به رشته | |
return items | |
def preprocess_text(text): | |
# حذف کاراکترهای غیرضروری و نرمالسازی متن | |
text = text.replace('\u200c', ' ').strip() # حذف نیمفاصله و فاصلههای اضافی | |
text = re.sub(r'\s+', ' ', text) # حذف فاصلههای تکراری | |
return text | |
def extract_items_in_text(text, items): | |
text = preprocess_text(text) | |
found_items = set() # استفاده از مجموعه برای جلوگیری از تکرار | |
for item in items: | |
item_normalized = preprocess_text(item) | |
if item_normalized.lower() in text.lower(): | |
found_items.add(item_normalized) | |
return list(found_items) | |
def compare_items(items_1, items_2): | |
common_items = set() | |
score = 0 # مقدار پیشفرض برای score | |
for item1 in items_1: | |
for item2 in items_2: | |
words1 = set(item1.lower().split()) | |
words2 = set(item2.lower().split()) | |
common_words = words1.intersection(words2) | |
num_common = len(common_words) | |
if num_common >= 3: | |
common_items.add((item1, item2)) | |
score = 100 | |
elif num_common == 2: | |
common_items.add((item1, item2)) | |
score = 75 | |
elif num_common == 1: | |
common_items.add((item1, item2)) | |
score = 50 | |
return score, common_items | |
def compare_skills(skill_1, skill_2): | |
common_skill = set(skill_1).intersection(set(skill_2)) | |
num_common = len(common_skill) | |
if num_common >= 10: | |
score = 100 | |
elif num_common == 7: | |
score = 75 | |
elif num_common == 5: | |
score = 50 | |
else: | |
score = 25 | |
return score, common_skill | |
def calculate_age(date_string): | |
current_year = 1403 | |
# تلاش برای پیدا کردن فرمت Y/M/D | |
ymd_match = re.match(r'(\d{1,4})/(\d{1,2})/(\d{1,2})', date_string) | |
if ymd_match: | |
year = int(ymd_match.group(1)) | |
if len(ymd_match.group(1)) == 4: # اگر سال چهار رقمی است | |
age = current_year - year | |
else: # اگر سال دو رقمی است | |
year += 1300 | |
age = current_year - year | |
return age | |
# تلاش برای پیدا کردن عدد ۴ رقمی که با ۱۳ شروع میشود | |
four_digit_match = re.match(r'(13\d{2})', date_string) | |
if four_digit_match: | |
year = int(four_digit_match.group(1)) | |
age = current_year - year | |
return age | |
return None | |
def extract_ner_info(text, nlp): | |
ner_results = nlp(text) | |
full_name = '' | |
loc = '' | |
age = None | |
# جمعآوری قطعات B-pers و I-pers برای تشکیل نام کامل با شرط کاهش ۱۰ درصدی | |
i = 0 | |
while i < len(ner_results): | |
if ner_results[i]['entity'] == 'B-pers' and ner_results[i]['score'] >= 0.80: | |
if full_name: # اگر قبلاً نامی پیدا کردهایم، فاصله اضافه کن | |
full_name += ' ' | |
full_name += ner_results[i]['word'] | |
current_score = ner_results[i]['score'] | |
stop_adding = False # پرچم برای توقف بعد از اولین نام کامل | |
for j in range(i + 1, len(ner_results)): | |
if ner_results[j]['entity'] == 'I-pers' and ner_results[j]['score'] >= 0.80: | |
if ner_results[j]['score'] >= current_score * 0.90: # شرط کاهش ۱۰ درصدی | |
full_name += ner_results[j]['word'].replace('##', '') | |
current_score = ner_results[j]['score'] | |
i = j # به موقعیت جدید برو | |
else: | |
stop_adding = True # توقف بعد از اولین نام کامل | |
break | |
else: | |
stop_adding = True # توقف بعد از اولین نام کامل | |
break | |
if stop_adding: | |
break # توقف بعد از اولین نام کامل | |
i += 1 | |
# جمعآوری مکانها با امتیاز بالای ۸۰ | |
for entity in ner_results: | |
if entity['entity'] in ['B-loc', 'I-loc'] : | |
if loc: | |
loc += ' ' | |
loc += entity['word'] | |
# استخراج سن از متن | |
age_match = re.search(r'سن\s*:\s*(\d+)', text) | |
if age_match: | |
age = int(age_match.group(1)) | |
else: | |
# تلاش برای پیدا کردن تاریخ تولد | |
date_match = re.search(r'(\d{1,4}/\d{1,2}/\d{1,2})', text) | |
if date_match: | |
age = calculate_age(date_match.group(1)) | |
else: | |
# تلاش برای پیدا کردن عدد ۴ رقمی که با ۱۳ شروع میشود | |
four_digit_match = re.search(r'(13\d{2})', text) | |
if four_digit_match: | |
age = calculate_age(four_digit_match.group(1)) | |
# بررسی امتیاز شباهت مکان | |
return full_name, loc, age | |
def process_text(input_text): | |
# مسیر فایل اکسلها را وارد کنید | |
job_excel_file_path = 'jobs_output.xlsx' | |
education_excel_file_path = 'education_output.xlsx' | |
skills_excel_file_path = 'N_F_skill_output.xlsx' | |
# خواندن شغلها، تحصیلات و مهارتها از فایلهای اکسل | |
jobs = read_from_excel(job_excel_file_path) | |
education = read_from_excel(education_excel_file_path) | |
skills = read_from_excel(skills_excel_file_path) | |
# متن ثابت | |
fixed_text = """استخدام کارآموز هوش مصنوعی (AI-شیراز) | |
دستهبندی شغلی | |
وب، برنامهنویسی و نرمافزار | |
موقعیت مکانی | |
فارس ، شیراز | |
نوع همکاری | |
تمام وقت کارآموزی | |
حداقل سابقه کار | |
مهم نیست | |
حقوق | |
توافقی | |
شرح موقعیت شغلی | |
شرکت تاو سیستم واقع در (شیراز - صدرا - خیابان البرز) در راستای تکمیل تیم نرم افزاری خود در نظر دارد دوره کارآموزی رایگان از مبتدی تا حرفه ای برای افراد پر انرژی و فعال برگزار کند. | |
هدف از این دوره آماده کردن نیروها جهت جذب در شرکت تاو سیستم است. | |
اگر فرد فعال و پر انرژی هستید و در جهت پیشرفت خود تلاش زیادی می کنید، ما منتظر شما هستیم.... | |
Machine Leaning | |
Deep learning | |
machine Leaning | |
deep learning | |
نحوه برگزاری: | |
دوره به مدت 4 ماه (سه روز در هفته) به صورت کلاس آموزشی برگزار می شود. | |
شرکت در (شیراز - صدرا - خیابان البرز) واقع شده و دوره آموزشی به صورت حضوری برگزار می شود. | |
شما در طول دوره توسط مدرس مورد ارزیابی مستمر قرار میگیرید و در صورت عدم توانایی شما برای ادامه دوره، به شما اعلام می شود و از دوره کنار گذاشته میشوید. | |
در انتهای دوره پروژه ای تستی با توجه به مسائلی که در دوره یاد گرفته اید برای شما تعریف می شود و برای انجام آن دو هفته فرصت دارید. | |
در صورت تایید پروژه شما توسط مدرس دوره، با شما قرارداد بسته می شود و به صورت حضوری در شرکت مشغول به فعالیت می شوید. | |
***لطفا در صورت داشتن همه (شرایط عمومی) زیر، رزومه خود را ارسال کنید.*** | |
شرایط عمومی: | |
۱. آشنایی مقدماتی با زبان برنامه نویسی پایتون | |
۲. سطح زبان انگلیسی متوسط به بالا (توانایی درک متون انگلیسی تخصصی) | |
۳. آشنایی مقدماتی با الگوریتم های هوش مصنوعی (یادگیری ماشین، یادگیری عمیق ) | |
۴. آشنایی با پایگاه داده مقدماتی | |
۵- امکان شرکت در دوره ها به صورت حضوری در آدرس (شیراز - صدرا - خیابان البرز) | |
۶- امکان گذاشتن وقت در خارج از تایم کلاس ها جهت انجام تمرینات | |
۷- امکان همکاری به صورت تمام وقت و حضوری در صورت قبولی در انتهای دوره (40 ساعت در هفته) | |
۸- از پذیرش دانشجو و افراد که شاغل هستند و یا اینکه در آینده درخواست کار به صورت ریموت دارند معذوریم. | |
۹- سن بین 18 الی 30 سال | |
۱۰- علاقه مند به یادگیری و به روز رسانی دانش فردی | |
۱۱- خلاق، پویا، با انگیزه و سرعت عملکرد بالا | |
۱۲- منظم و مسئولیت پذیر | |
مهارتهای امتیازی: | |
۱. آشنایی با با زبان برنامه نویسی پایتون در حد پیشرفته | |
۲. آشنایی با فریم ورک های pytorch , tensorflow | |
۳. آشنایی با کتاب خانه های numpy, pandas, matplotlib, sklearn .. | |
۴. آشنایی با data mining | |
۵. آشنایی با اصول solid | |
۶. آشنایی با Clean architecture | |
۷. آشنایی با Git , GitHub""" | |
input_text = input_text.replace("آدرس", "") | |
# استخراج شغلها، تحصیلات و مهارتها از متنها | |
jobs_in_fixed_text = extract_items_in_text(fixed_text, jobs) | |
jobs_in_input_text = extract_items_in_text(input_text, jobs) | |
education_in_fixed_text = extract_items_in_text(fixed_text, education) | |
education_in_input_text = extract_items_in_text(input_text, education) | |
skills_in_fixed_text = extract_items_in_text(fixed_text, skills) | |
skills_in_input_text = extract_items_in_text(input_text, skills) | |
# مقایسه و نمرهدهی | |
job_score, common_jobs = compare_items(jobs_in_fixed_text, jobs_in_input_text) | |
education_score, common_education = compare_items(education_in_fixed_text, education_in_input_text) | |
skill_score, common_skills = compare_skills(skills_in_fixed_text, skills_in_input_text) | |
# تنظیم و آمادهسازی مدل NER | |
model_name_or_path = "NLPclass/Named-entity-recognition" | |
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) | |
model = AutoModelForTokenClassification.from_pretrained(model_name_or_path) # Pytorch | |
nlp = pipeline("ner", model=model, tokenizer=tokenizer) | |
# استخراج اطلاعات NER | |
full_name, loc, age = extract_ner_info(input_text, nlp) | |
# نمرهدهی لوکیشن | |
fixed_loc = "شیراز" | |
loc_score = 100 if fixed_loc in loc else 0 | |
# نمرهدهی سن | |
age_score = 100 if age and 18 <= age <= 30 else 0 | |
# محاسبه و نمایش میانگین نمرات | |
average_score = (job_score + education_score + skill_score + loc_score + age_score) / 5 | |
# ساخت خروجی JSON | |
output = { | |
"average_score": average_score, | |
"full_name": full_name, | |
"age": age, | |
"location": loc, | |
"job_score": job_score, | |
"education_score": education_score, | |
"skill_score": skill_score, | |
"loc_score": loc_score, | |
"age_score": age_score, | |
"common_jobs": list(common_jobs), | |
"common_education": list(common_education), | |
"common_skills": list(common_skills) | |
} | |
# ذخیره خروجی JSON در یک فایل موقت | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".json", mode='w', encoding='utf-8') as tmp_file: | |
json.dump(output, tmp_file, ensure_ascii=False, indent=4) | |
return tmp_file.name | |
iface = gr.Interface( | |
fn=process_text, | |
inputs=gr.Textbox(lines=10, placeholder="لطفاً متن خود را وارد کنید..."), | |
outputs=gr.File(label="دانلود فایل JSON"), | |
title="متن پرداز", | |
description="این ابزار متن شما را پردازش کرده و امتیازات مشابهت را محاسبه میکند." | |
) | |
if __name__ == "__main__": | |
iface.launch() |