File size: 12,700 Bytes
05595e1
 
7c0115f
05595e1
 
3c7517e
05595e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3fb2884
 
 
 
 
 
4c30a39
 
 
 
 
3fb2884
 
 
 
 
 
 
 
f13ffd9
05595e1
 
 
 
520f7d0
d054022
 
520f7d0
d054022
 
 
520f7d0
 
d054022
520f7d0
 
 
 
 
 
 
 
05595e1
520f7d0
05595e1
520f7d0
 
d054022
5846ff3
 
837811b
5846ff3
 
 
 
 
05595e1
 
3fb2884
 
 
 
 
 
 
 
 
 
d054022
3fb2884
05595e1
 
1dc1048
3fb2884
05595e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d75fabf
 
 
 
05595e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1dc1048
05595e1
 
 
 
 
 
 
 
 
d054022
05595e1
 
 
 
 
 
 
7c0115f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c7517e
 
 
 
 
05595e1
 
 
01faf43
3c7517e
05595e1
 
 
 
 
7b059c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
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()