فولدر enums:
در این فولدر یک فایل enums.py وجود دارد که در آن مقادیر static که در پروژه وجود دارد مقداردهی شده است.
فولدر requirments:
در این فولدر دو فایل numpy_encoder.py و news_dataset.py وجود دارد که در ادامه به شرح هر یک از آنها خواهیم پرداخت:
- فایل numpy_encoder.py برای save و load کردن numpy array میباشد.
- فایل news_dataset.py برای ساخت dataset از روی دیتا برای بخش transformer classification است
فایلهای root اصلی فولدر src:
-
بخش preprocessing پروژه در فایل preprocessing.py وجود دارد بدین صورت که ابتدا دیتا crawl شده که در
data/news.json
است را لود میکنیم میکنیم و در ادامه دیتا را نرمالایز کرده سپس توکنایز میکنیم و سپس حرفهای اضافه را حذف میکنیم و در نهایت lemmatize میکنیم و دیتا پیشپردازش شده را save میکنیم و در ادامه پروژه آن را لود میکنیم. لازم به ذکر است که برای تحلیل لینک باید روی عنوان خبرها پیشپردازش را انجام دهیم. بنابراین حالت دیگری برای پیش پردازش روی عنوان خبر را انجام میدهیم همچنین نحوه دیتا پیشپردازش شده در حالت transformer classification متفاوت است که آن را با boolean متمایز میکنیم. همجنین برای transformer search از آنجا که ترین کردن روی کل حجم دیتا بسیار زمانبر بود ازdata/news_12.json
استفاده میکردیم که تنها روی ۱۲ صفحه از هر کتگوری کراول انجام میدهد. در نهایت فایلهای save شده بدین صورت است که درmodels/preprocessed_data/data.plk
دیتا کامل پیشپردازش شده روی متن میباشد، درmodels/preprocessed_data/clf_data.plk
دیتا کامل پیشپردازش شده روی متن برای transformer classification میباشد، درmodels/preprocessed_data/tran_data.plk
دیتا پیش پردازش شده روی متن که از هر کتگوری ۱۲ صفحه میباشد و درmodels/preprocessed_data/title_data.plk
دیتا کامل پیش پردازش شده بر روی عنوان خبر میباشد که برای تحلیل لینک کاربرد دارد. -
بخش query expansion پروژه در فایل query_expansion.py وجود دارد بدین صورت است که کوئری را میگیرد و با دو روش آن را گسترش میدهد. روش اول استفاده از الگوریتم rocchio است بدین صورت که امبدینگ هر کوئری را محاسبه میکنیم و با میانگین امبدینگ ده تا مرتبطترین داک جمع میکنیم و از میانگین امبدینگ ده تا نامرتبطترین داکها کم میکنیم و حال امبدینگ حاصل را به عنوان کوئری جدید میگیریم و آن را جستجو میکنیم. (از این روش برای گسترش کوئری در روشهاس جستوجو transformers و fasttext استفاده میکنیم.) روش دیگری که پیادهسازی کردهایم بدین صورت است که ابتدا برای تمام کلمات تمام داکهایمان امبدینگ fasttext آن را محاسبه کرده و در
models/QE_fasttext/all_words_vectors_emb_fasttext.json
ذخیره میکنیم و حال برای تک تک کلمات کوئریمان امبدینگ fastetxt محاسبه میکنیم و فاصله کسینوسی تک تک کلمات کوئریمان را با امبدینگ fasttext ای که برای تمام کلمات تمام داکهایمان به دست آورده بودیم محاسبه میکنیم. (یک threshold برای فاصله کسینوسی برای جلوگیری از شباهت بسیار زیاد و بیهوده بودن گسترش کوئریمان در نظر میگیریم.) در نهایت کوئریمان را با کلمات به دست آمده جایگزین میکنیم و کوئری جدیدمان را جستجو میکنیم.
ارزیابی query expansion برای روشهای مختلف با معیار MRR را در این لینک می توانید مشاهده کنید.
در ادامه MRR هر یک از روشها آمده است که به وضوح مشخص است که گسترش کوئری باعث بهبود نتایج جستوجو میشود.
QE Boolean Search MRR results Query Sum of reciprocal rank Q1 1 + 1/5 Q2 1/4 + 1/4 Q3 1/2 + 1 Q4 1 + 1 Q5 1/2 + 1/3 Q6 1/4 + 1/3 Q7 1 + 1/3 Q8 1 + 1/2 Q9 1/3 + 1/5 Q10 1/2 + 1/3 QE TFIDF Search MRR results Query Sum of reciprocal rank Q1 1/2 + 1/2 Q2 1 + 1 Q3 1 + 1 Q4 1 + 1 Q5 1 + 1/2 Q6 1/2 + 1/2 Q7 1 + 1/3 Q8 1 + 1/2 Q9 1/3 + 1/2 Q10 1/2 + 1 QE Transformer Search MRR results Query Sum of reciprocal rank Q1 1 + 1 Q2 1 + 1 Q3 1 + 1 Q4 1 + 1/2 Q5 1 + 1 Q6 1 + 1 Q7 1 + 1 Q8 1/2 + 1 Q9 1 + 1/2 Q10 1 + 1 QE Fasttext Search MRR results Query Sum of reciprocal rank Q1 1 + 1 Q2 1/2 + 1 Q3 1 + 1 Q4 1 + 1 Q5 1 + 1 Q6 1 + 1/2 Q7 1 + 1 Q8 1/3 + 1 Q9 1/2 + 1 Q10 1/3 + 1 مقدار MRR نهایی: 0.74
QE Elastic Search MRR results Query Sum of reciprocal rank Q1 1 + 1 Q2 1 + 1/2 Q3 1 + 1 Q4 1 + 1 Q5 1 + 1 Q6 1 + 1/2 Q7 1 + 1 Q8 1 + 1 Q9 1 + 1 Q10 1/2 + 1 مقدار MRR نهایی: 0.925
-
فایل boolean_search.py برای search کردن به روش بولین است. بدبن گونه عمل می کنیم که با کلمات کوئریمان و تمام داکهایمان یک ماتریس sparse میسازیم و در نهایت خبرهایی را به کاربر نشان میدهیم که تمام کلمات کوئریمان در متن خبر آمده باشد.
ارزیابی boolean search با معیار MRR را در این لینک می توانید مشاهده کنید.
Query Sum of reciprocal rank Q1 1 + 1/9 Q2 1/5 + 1/5 Q3 1/2 + 1 Q4 1 + 1 Q5 1/3 + 1/3 Q6 1/4 + 1/5 Q7 1 + 1/3 Q8 1 + 1/2 Q9 1/9 + 1/9 Q10 1/2 + 1/7 -
فایل tfidf_search.py برای search کردن به روش tfidf است. بدین گونه عمل میکنیم که مدل tfidf vectorizer را در
models/tfidf_search/tfidf.pk
ذخیره میکنیم. همچنین ماتریس sparse به دست آمده از tfidf را نیز درmodels/tfidf_search/tfidf_tran.npz
ذخیره میکنیم حال کوئری داده شده را با tfidf vectorizer به وکتور تبدیل میکنیم و فاصله کسینوسی میان وکتور کوئری و وکتورهای داک محاسبه میکنیم و با محاسبه فاصله کسینوسی نزدیکترین خبرها را خروجی میدهیم.
ارزیابی tfidf search با معیار MRR را در این لینک می توانید مشاهده کنید.
Query Sum of reciprocal rank Q1 1/3 + 1/3 Q2 1 + 1 Q3 1 + 1 Q4 1 + 1 Q5 1 + 1/3 Q6 1/2 + 1/2 Q7 1/3 + 1/3 Q8 1/5 + 1/7 Q9 1 + 1 Q10 1 + 1/2 -
فایل transformer_search.py برای search کردن به روش transformer است. بدین گونه عمل میکنیم که از مدل pars big bert که روی زبان فارسی train شده است استفاده میکنیم و با استفاده از tokenizer این کتابخانه دیتامان را توکنایز میکنیم و آن را روی دیتا خودمان fine tune میکنیم و مدلمان را در
models/transformers_search/transformer_model.model
ذخیره کرده و توکنایزرمان را نیز درmodels/transformers_search/transformer_tokenizer
ذخیره میکنیم. حال برای هر داک میانگین امبدینگ توکنایز شده آن را به عنوان امبدینگ داک در نظر میگیریم و آن را درmodels/transformers_search/transformer_vectors_emb.json
ذخیره میکنیم. همچنین کوئریمان را نیز توکنایز میکنیم و امبدینگ آن را نیز با استفاده از مدلمان محاسبه میکنیم و در نهایت با محاسبه فاصله کوسینوسی مرتبطترین داکهای آن را به عنوان خروجی میدهیم.
ارزیابی transformer search با معیار MRR را در این لینک می توانید مشاهده کنید.
Query Sum of reciprocal rank Q1 1 + 1 Q2 1 + 1/2 Q3 1 + 1 Q4 1 + 1/2 Q5 1 + 1 Q6 1 + 1 Q7 1 + 1 Q8 1/3 + 1 Q9 1 + 1 Q10 1/2 + 1/2 -
فایل fasttext_search.py برای search کردن به روش fasttext است. بدین گونه عمل میکنیم که از مدل fasttext استفاده میکنیم و آن را روی دیتا خودمان ترین میکنیم. سپس آن را در
models/fasttext_search/fasttext.bin
ذخیره میکنیم و میانیگین امبدینگهای کلمات داکمان را محاسبه میکنیم و درmodels/fasttext_search/fasttext_vectors_emb.json
ذخیره میکنیم سپس امبدینگ کوئریمان را محاسبه کرده و در نهایت با محاسبه فاصله کوسینوسی مرتبطترین داکهای آن را به عنوان خروجی میدهیم.
ارزیابی fasttext search با معیار MRR را در این لینک می توانید مشاهده کنید.
Query Sum of reciprocal rank Q1 1 + 1 Q2 1/2 + 1/2 Q3 1 + 1 Q4 1 + 1 Q5 1 + 1 Q6 1 + 1/2 Q7 1 + 1 Q8 1/4 + 1/3 Q9 1/4 + 1/6 Q10 1/3 + 1 -
فایل elastic_search.py برای سرچ کردن به کمک الستیک است برای این کار ابتدا یک cloud در خود الستیک ساختیم و با استفاده از credentional یعنی cloud_id و password ای که به ما میدهد به آن کانکت میشویم و سپس دیتا خاممان یعنی بدون preprocessed شده را در cloud ایندکس میکنیم و با کوئری match ریزالتهای آن را میگیریم. (لازم به ذکر است که خود الستیک پیشپردازشهای لازم را روی دیتا انجام میدهد.)
ارزیابی elastic search با معیار MRR را در این لینک می توانید مشاهده کنید.
Query Sum of reciprocal rank Q1 1 + 1 Q2 1 + 1/2 Q3 1 + 1 Q4 1 + 1 Q5 1 + 1 Q6 1 + 1/2 Q7 1 + 1 Q8 1 + 1/2 Q9 1 + 1 Q10 1/2 + 1 -
فابل classification_logistic_regression.py برای انجام classification به یکی از روشهای سنتی است. بدین صورت که در تمرین چهار این را با naive bayes انجام دادیم اما برای بهبود آن از روش سنتی دیگری استفاده میکنیم همچنین به جای استفاده از امبدینگ روش tfidf برای بهبود آن از روش fasttext استفاده میکنیم. سپس روی دیتا x_train و y_train آن را فیت میکنیم و مدلمان را در
models/classification_logistic_regression_improved/logistic_regression_model.sav
ذخیره میکنیم و با دادن یک کوئری به آن امبدینگ fasttext آن را محاسبه میکنیم و برای predict کردن دستهبندی آن را به مدلمان داده و لیبل آن را predict میکنیم
معیارهای ارزیابی این حالت دستهبندی رابط کاربری مشخص است و به شرح زیر میباشد.
Evaluion criteria Value (%) accuracy score 80.0132362 f1 macro score 79.896585 -
فایل classification_transformer.py برای انجام classification از روش دیگری مبتنی بر transformer ها استفاده میکنیم از مدل AutoModelForSequenceClassification استفاده میکنیم بدین صورت که x, y را تفکیک کرده و با سپس آن را به بخش train و test تفکیک میکنیم و روی بخش train آن را train میکنیم و مدل را در
models/classification_transformers
save میکنیم سپس با توکنایزر pars big bert کوئریمان را توکنایز میکنیم و به مدلمان میدهیم و روی آن لیبلمان را predict میکنیم. معیارهای ارزیابی این حالت دستهبندی در رابط کاربری مشخص است و به شرح زیر است.Evaluion criteria Value (%) accuracy score 86.149095 f1 macro score 85.920362 -
فایل clustering.py برای انجام clustering یا همان خوشهبندی است که از روش kmeans استفاده میکنیم امبدینگ fasttext داکهایمان را لود میکنیم و سپس x, y را از روی آن میسازیم و x مان را fit میکنیم مدلمان را در
models/clustering/kmeans_clustering.pkl
ذخیره میکنیم. سپس برای کوئری کاربر امبدینگ fasttext آن را محاسبه کرده و برای predict کردن دستهبندی آن را به مدلمان میدهیم و سایر خبرهایی که مرتبط با آن cluster هستند را به کاربر میدهیم. معیارهای ارزیابی این حالت خوشهبندی در رابط کاربری مشخص است و به شرح زیر است.Evaluion criteria Value (%) RSS score 3340.408663 purity score 85.920362 davies bouldien score 1.94489853 silhouette score 0.137699 -
فایل link_analysis.py برای تحلیل لینک میباشد که دو روش page rank و hits را شامل میشود ابتدا از کاربر category میگیرد سپس در الگوریتم page rank پنجتا از مهمترین خبرها را به کاربر نشان میدهد. همچنین روشی دیگر که hits باشد پیادهسازی شده است بدین صورت که کاربر بر اساس تعداد ارجاعها به آن خبر و تعداد ارجاعهایی که از آن خبر گرفته شده است را مبتنی بر hubs و authorities می دهد. لازم به ذکر است که مدل تحلیل لینک به صورت یک گراف برای هر دسته در
models/link_analysis
قرار دارد. به طور کلی شانس حضور جملات طولانی در میان top ھا بیشتر است زیرا جملھ مھم جملھای است کھ اطلاعات بیشتری در آن باشد در جملات bottom معمولا جملات کوتاه که اطلاعات خاصی ندارند میآید.