# კითხვების სემანტიკური ექვივალენტობა:


---
## 🧠 ისტორია:
წარმოიდგინეთ, რომ მუშაობთ მასშტაბური ციფრული ცოდნის პლატფორმის მონაცემთა მეცნიერების გუნდში. პლატფორმის ერთ-ერთი უმთავრესი გამოწვევაა მომხმარებლების მიერ დასმული კითხვების უზარმაზარი რაოდენობის ეფექტურად მართვა. ხშირად, მომხმარებლები სვამენ კითხვებს, რომლებზეც პასუხი უკვე არსებობს, ან აფორმულირებენ კითხვებს ოდნავ განსხვავებულად, თუმცა შინაარსობრივად იგივეს გულისხმობენ. ასეთი სემანტიკურად იდენტური, ანუ **ექვივალენტური კითხვების** იდენტიფიცირება კრიტიკულად მნიშვნელოვანია სისტემის ეფექტურობისა და მომხმარებლის გამოცდილების გასაუმჯობესებლად.


ამ პრობლემის გადასაჭრელად, თქვენმა გუნდმა უკვე ჩაატარა გარკვეული მოსამზადებელი სამუშაოები და შეიმუშავა საბაზისო, მცირე ზომის BERT მოდელი (**custom small BERT**), რომელიც ზოგადად გაწვრთნილია ტექსტის გასაგებად. ახლა კი, საჭიროა ამ მოდელის სპეციფიკურად ექვივალენტური კითხვების ამოცნობაზე დაფაინთუნება.


---
## 🎯 თქვენი მისია:
თქვენი ამოცანაა, მოახდინოთ მოწოდებული ქასთომ BERT მოდელის ფაინთუნინგი (**fine-tuning**), რათა მან შეძლოს განსაზღვროს, წარმოადგენს თუ არა კითხვების მოცემული წყვილი სემანტიკურ ექვივალენტს. მოდელმა უნდა ისწავლოს კითხვებს შორის შინაარსობრივი კავშირის დადგენა და მიიღოს გადაწყვეტილება: არის წყვილი ექვივალენტი (კლასი 1) თუ არა (კლასი 0).


განსაკუთრებული ყურადღება მიაქციეთ მოწოდებული მონაცემების სტრუქტურასა და ბუნებას, რადგან თქვენი წარმატება დიდად იქნება დამოკიდებული იმაზე, თუ რამდენად ჭკვიანურად მოამზადებთ მონაცემებს BERT მოდელის ეფექტური ფაინთუნინგისთვის.


---
## ⚙️ ფორმალური დავალება:
მოახდინეთ მოწოდებული, წინასწარ ნაწილობრივ გაწვრთნილი, მცირე ზომის BERT მოდელის ფაინთუნინგი ისე, რომ მან შეძლოს კითხვების წყვილის კლასიფიცირება სემანტიკურ ექვივალენტებად (1 – ექვივალენტი, 0 – არა-ექვივალენტი).


---
## ⚠️ მნიშვნელოვანი ნიუანსი:
გაითვალისწინეთ, რომ ფაინთუნინგისთვის საჭირო სატრენინგო მონაცემების მომზადებისას, 500 დადასტურებულად პოზიტიური კლასის წარმომადგენელი (ანუ **ექვივალენტი**) წყვილის გარდა, გადმოგეცემათ 1000 ცალი უნიკალური წინადადება (არა წყვილი, არამედ ცალკეული წინადადებები). ხაზგასმით უნდა აღინიშნოს, რომ ეს 1000 წინადადება ერთმანეთის სემანტიკური ექვივალენტები ცალსახად არ არის. ამ ინფორმაციის სტრატეგიულად და ეფექტურად გამოყენება თქვენი მოდელის ფაინთუნინგისთვის კრიტიკული იქნება. `თქვენმა გადაწყვეტამ უნდა იმუშაოს T4 GPU-ზე მაქსიმუმ 1 საათში`.


---
## 📁 მოწოდებული მასალები და მონაცემები:
თქვენ გადმოგეცემათ შემდეგი ფაილები და რესურსები:


* `train_data.csv`: ეს ფაილი შეიცავს 500 წყვილ კითხვას, რომლებიც დადასტურებულად სემანტიკური ექვივალენტებია. ფაილს აქვს შემდეგი სვეტები: `question1`, `question2`,`is_duplicate`.
* `raw_questions.csv`: ეს ფაილი შეიცავს 1000 უნიკალურ კითხვას. თითოეული კითხვა მოცემულია `question` სვეტში. ეს კითხვები, თავის მხრივ, ერთმანეთის ექვივალენტებს არ წარმოადგენენ.
* `test.csv`: ეს ფაილი შეიცავს 1500 წყვილ კითხვას, რომლებზეც თქვენმა დაფაინთუნებულმა მოდელმა უნდა გააკეთოს პროგნოზი. ფაილს აქვს სვეტები: `question1`, `question2`.
* `custom_bert_model/`: ეს დირექტორია შეიცავს მცირე ზომის, ქასთომ BERT მოდელის ფაილებს, რომელიც მზადაა Hugging Face transformers ბიბლიოთეკით ფაინთუნინგისთვის (მაგალითად, შეიძლება შეიცავდეს `config.json`, `pytorch_model.bin` ან `model.safetensors`, `tokenizer_config.json`, `vocab.txt` და ა.შ. ფაილებს). თქვენ უნდა გამოიყენოთ ეს მოდელი, როგორც საწყისი წერტილი.


---
## 📦 ჩასაბარებელი მასალები:
* ეს **Jupyter Notebook-ი**, თქვენი სრული ამონახსნის კოდით, რომელიც აღწერს თქვენს მიერ შემუშავებულ მონაცემთა მომზადების სტრატეგიას და BERT მოდელის ფაინთუნინგის პროცესს. Notebook-ი სრულად გაშვების („Run all“) შემდეგ ავტომატურად უნდა ქმნიდეს პროგნოზების ფაილს.
* `predictions.json`: JSON ფორმატის ფაილი, რომელიც შეიცავს თქვენი დაფაინთუნებული მოდელის პროგნოზებს `test_data.csv`-ში მოცემული თითოეული კითხვის წყვილისთვის.
   * ფაილის **key (გასაღები)** უნდა იყოს `pair_id` `test_data.csv` ფაილიდან (სტრიქონის ტიპად, მაგ. `"0"`, `"1"`, `"2"`, ...).
   * ფაილის **value (მნიშვნელობა)** უნდა იყოს თქვენი მოდელის მიერ პროგნოზირებული კლასი: 1 (ექვივალენტი) ან 0 (არა-ექვივალენტი) (რიცხვითი ტიპის).
   * მაგალითი `predictions.json` ფაილის შიგთავსისა:
       ```json
       {
         "0": 1,
         "1": 0,
         "2": 1,
         "3": 0,
         ...
       }
       ```


---
## 🏆 შეფასება:
თქვენი გადაწყვეტა შეფასდება **F1-Score** მეტრიკით `test_data.csv` მონაცემებზე. გაითვალისწინეთ, რომ მაღალი ქულის მისაღებად მნიშვნელოვანია როგორც Recall, ასევე Precision მაჩვენებლები, რაც თავის მხრივ, კარგად დაბალანსებული და ეფექტური კლასიფიკატორის შექმნას მოითხოვს.


---
წარმატებებს გისურვებთ კითხვების სემანტიკური ექვივალენტობის ამოხსნასა და თქვენი BERT მოდელის ეფექტურად დაფაინთუნებაში!




## საწყისი კოდი
იხილეთ საწყისი ინფორმაციის ჩატვირთვის და საბოლოო აუთფუთის შექმნის ინსტრუქციები. გთხოვთ ბოლო ნაწილში მხოლოდ ის ნაწილი შეცვალეთ სადაც პასუხს ინახავთ Dict-ში შენახვა განსაკუთრებით კი ფაილის სახელი არ შეცვალოთ წინააღმდეგ შემთხვევაში დაგიბრუნდებათ 0 ქულა.


```python
import pandas as pd
from transformers import AutoModel, AutoTokenizer

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
train_data = pd.read_csv("train_data.csv")
train_data

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
raw_questions = pd.read_csv("raw_questions.csv")
raw_questions

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
test = pd.read_csv("test.csv")
test

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
model = AutoModel.from_pretrained("./my_custom_bert_model")
tokenizer = AutoTokenizer.from_pretrained("./my_custom_bert_model")


# თქვენი კოდი
# ...
# ...




import json


# შეგიძლიათ ამ ფუნქციის პარამეტრებიც შეცვალოთ მთავარია ბოლოს submission.json #შემქნათ იმ პრინციპით როგორც აქ წერია
def create_predictions_json(test_data):
   """
   Creates submission.json file. Currently outputs 0 for all question couples.
   TODO: Replace hardcoded 0 with actual model predictions.
   Do not modify the JSON saving part at the end.
   """
   predictions = {}
   for idx in range(len(test_data)):
       # TODO: add prediction logic here using your model.
       final_prediction = 0  # Replace with actual prediction
      
       predictions[str(idx)] = final_prediction


   # DO NOT MODIFY
   with open('submission.json', 'w') as f:
       json.dump(predictions, f, indent=4)


   print(f"Predictions saved to submission.json with {len(predictions)} entries")


create_predictions_json(test)
```
