3 changed files with 128 additions and 0 deletions
@ -0,0 +1,50 @@ |
|||||
|
{"text": "Як би ти не намагався, ти не вивчиш англійську за два-три місяці.", "translation": "Quels que soient tes efforts, tu ne pourras pas apprendre l’anglais en deux-trois mois."} |
||||
|
{"text": "Поки я не подзвонив, він не прийшов.", "translation": "Il n’est pas venu avant que je ne l’appelle."} |
||||
|
{"text": "У всесвіті багато галактик.", "translation": "Il y a beaucoup de galaxies dans l'univers."} |
||||
|
{"text": "Вона приймає душ щоранку.", "translation": "Elle prend une douche chaque matin."} |
||||
|
{"text": "У Майка є декілька друзів у Флориді.", "translation": "Mike a quelques amis en Floride."} |
||||
|
{"text": "Я зустрінуся з тобою в неділю о третій.", "translation": "On se voit dimanche à trois heures."} |
||||
|
{"text": "Я сказав собі: «Це гарна ідея».", "translation": "Je me suis dit : « C’est une bonne idée. »"} |
||||
|
{"text": "Ми збиралися пробути там біля двох тижнів.", "translation": "Nous avions l’intention de rester là près de deux semaines."} |
||||
|
{"text": "Як на мене, то наразі помовчу.", "translation": "En ce qui me concerne, je n’ai pour le moment rien à dire."} |
||||
|
{"text": "Мій дядько вчора помер від раку шлунку.", "translation": "Mon oncle est mort hier d’un cancer à l’estomac."} |
||||
|
{"text": "Я не знаю, що ще можна зробити.", "translation": "Je ne sais plus quoi faire."} |
||||
|
{"text": "Я навчився жити без неї.", "translation": "J’ai appris à vivre sans elle."} |
||||
|
{"text": "Мені завжди більше подобалися загадкові персонажі.", "translation": "J’ai toujours préféré les personnages mystérieux."} |
||||
|
{"text": "Тобі краще поспати.", "translation": "Tu ferais mieux de dormir."} |
||||
|
{"text": "Обдумай це.", "translation": "Penses-y."} |
||||
|
{"text": "Наприклад, тобі подобається англійська?", "translation": "Par exemple, est-ce que tu aimes l’anglais ?"} |
||||
|
{"text": "Коли Вам буде зручно?", "translation": "Quand est-ce que ça vous arrangera ?"} |
||||
|
{"text": "Том вільно розмовляє японською.", "translation": "Tom parle couramment japonais."} |
||||
|
{"text": "Ти не знаєш, де мій годинник?", "translation": "Tu ne sais pas où est ma montre ?"} |
||||
|
{"text": "Є ще одне питання, яке нам так само треба обміркувати.", "translation": "Il reste encore une question que nous devons discuter."} |
||||
|
{"text": "Я біжу якомога швидше, щоб наздогнати його.", "translation": "Je cours le plus vite possible pour le rattraper."} |
||||
|
{"text": "Не всі, хто тут живе, багаті.", "translation": "Tous ceux qui habitent ici ne sont pas forcément riches."} |
||||
|
{"text": "Ліки прискорили процес росту.", "translation": "Les médicaments accéléraient la croissance."} |
||||
|
{"text": "Я бачив, як він біг.", "translation": "Je l'ai vu courir."} |
||||
|
{"text": "Як ти ставишся до того, щоб погуляти в парку?", "translation": "Que penserais-tu d'une balade au parc ?"} |
||||
|
{"text": "Наближається Різдво.", "translation": "Noël approche."} |
||||
|
{"text": "Я передзвоню тобі пізніше.", "translation": "Je te rappelle plus tard."} |
||||
|
{"text": "Людина — це єдина тварина, яка може сміятися.", "translation": "L’Homme est le seul animal qui peut rigoler."} |
||||
|
{"text": "Я чищу зуби двічі на день.", "translation": "Je me brosse les dents deux fois par jour."} |
||||
|
{"text": "Він ніжно поклав руку на її плече.", "translation": "Il posa la main gentiment sur son épaule."} |
||||
|
{"text": "Сьогодні жахливо холодно.", "translation": "Il fait horriblement froid aujourd'hui."} |
||||
|
{"text": "У цю суму включено податки.", "translation": "Cette somme inclut les taxes."} |
||||
|
{"text": "Ця школа була заснована в 1650 році.", "translation": "Cette école fut fondée en 1650."} |
||||
|
{"text": "Я випадково знайшов цей ресторан.", "translation": "J'ai trouvé ce restaurant par hasard."} |
||||
|
{"text": "Я не хотів нікого образити.", "translation": "Je ne voulais vexer personne."} |
||||
|
{"text": "Цей сад найкраще виглядає весною.", "translation": "Ce parc est plus joli au printemps."} |
||||
|
{"text": "Цей сир виготовлено з овечого молока.", "translation": "Ce fromage est fait avec du lait de chèvre."} |
||||
|
{"text": "Він спить як немовля.", "translation": "Il dort comme un bébé."} |
||||
|
{"text": "Гора вкрита снігом.", "translation": "La montagne est recouverte de neige."} |
||||
|
{"text": "Я попав під дощ і промок.", "translation": "J’ai été pris sous la pluie, et suis tout trempé."} |
||||
|
{"text": "Прошу, дайте мені ще один шанс.", "translation": "Je vous en prie, donnez-moi encore une chance."} |
||||
|
{"text": "Я все сказав.", "translation": "J’ai tout dit."} |
||||
|
{"text": "Не забувай нас!", "translation": "Ne nous oublie pas !"} |
||||
|
{"text": "Випало багато снігу.", "translation": "Beaucoup de neige est tombée."} |
||||
|
{"text": "Йде сніг.", "translation": "Il est en train de neiger."} |
||||
|
{"text": "Може піти сніг.", "translation": "Il neigera peut-être."} |
||||
|
{"text": "У нас у січні йде сніг.", "translation": "Chez nous, il neige en janvier."} |
||||
|
{"text": "Сніг розтав.", "translation": "La neige a fondu."} |
||||
|
{"text": "Наша компанія планує побудувати новий хімічний завод у Росії.", "translation": "Notre entreprise a le projet de construire une nouvelle usine chimique en Russie."} |
||||
|
{"text": "Франція воювала з Росією.", "translation": "La France fut en guerre avec la Russie."} |
||||
@ -0,0 +1,77 @@ |
|||||
|
import torch |
||||
|
from transformers import AutoTokenizer, AutoModelForCausalLM |
||||
|
from datasets import load_dataset |
||||
|
from nltk.translate.bleu_score import corpus_bleu |
||||
|
|
||||
|
# ---------------------------- |
||||
|
# Configuration |
||||
|
# ---------------------------- |
||||
|
MODEL_DIR = "./qwen2.5-7b-uk-fr-lora" # dossier où tu as sauvegardé LoRA |
||||
|
VALIDATION_FILE = "validation.jsonl" # petit subset de test (5-50 phrases) |
||||
|
MAX_INPUT_LENGTH = 1024 |
||||
|
DEVICE = "cuda" if torch.cuda.is_available() else "cpu" |
||||
|
|
||||
|
print("=== Loading model and tokenizer ===") |
||||
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_DIR, trust_remote_code=True) |
||||
|
tokenizer.pad_token = tokenizer.eos_token |
||||
|
tokenizer.model_max_length = MAX_INPUT_LENGTH |
||||
|
|
||||
|
model = AutoModelForCausalLM.from_pretrained( |
||||
|
MODEL_DIR, |
||||
|
device_map="auto", |
||||
|
torch_dtype=torch.float16, |
||||
|
trust_remote_code=True |
||||
|
) |
||||
|
model.eval() |
||||
|
|
||||
|
print("Model loaded.") |
||||
|
|
||||
|
# ---------------------------- |
||||
|
# Load validation dataset |
||||
|
# ---------------------------- |
||||
|
print("Loading validation dataset...") |
||||
|
dataset = load_dataset("json", data_files=VALIDATION_FILE) |
||||
|
examples = dataset["train"] # petit subset |
||||
|
print(f"{len(examples)} examples loaded for testing.") |
||||
|
|
||||
|
# ---------------------------- |
||||
|
# Function to generate translation |
||||
|
# ---------------------------- |
||||
|
def translate(text): |
||||
|
prompt = f"Translate the following Ukrainian text into French:\nUkrainian: {text}\nFrench:" |
||||
|
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=MAX_INPUT_LENGTH).to(DEVICE) |
||||
|
with torch.no_grad(): |
||||
|
outputs = model.generate( |
||||
|
**inputs, |
||||
|
max_new_tokens=256, |
||||
|
do_sample=False, # deterministic |
||||
|
eos_token_id=tokenizer.eos_token_id, |
||||
|
pad_token_id=tokenizer.pad_token_id |
||||
|
) |
||||
|
result = tokenizer.decode(outputs[0], skip_special_tokens=True) |
||||
|
# Remove prompt from result |
||||
|
return result.replace(prompt, "").strip() |
||||
|
|
||||
|
# ---------------------------- |
||||
|
# Test all examples and compute BLEU |
||||
|
# ---------------------------- |
||||
|
print("Generating translations...") |
||||
|
references = [] |
||||
|
hypotheses = [] |
||||
|
|
||||
|
for i, example in enumerate(examples): |
||||
|
src_text = example["text"] |
||||
|
ref_text = example["translation"] |
||||
|
pred_text = translate(src_text) |
||||
|
|
||||
|
print(f"\n[{i+1}] Source: {src_text}") |
||||
|
print(f" Reference: {ref_text}") |
||||
|
print(f" Prediction: {pred_text}") |
||||
|
|
||||
|
# Prepare for BLEU (tokenized by space) |
||||
|
references.append([ref_text.split()]) |
||||
|
hypotheses.append(pred_text.split()) |
||||
|
|
||||
|
# Compute corpus BLEU |
||||
|
bleu_score = corpus_bleu(references, hypotheses) |
||||
|
print(f"\n=== Corpus BLEU score: {bleu_score:.4f} ===") |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue