Instructions to use ngocdang83/HachimiMT-60-zh-vi with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ngocdang83/HachimiMT-60-zh-vi with Transformers:
# Use a pipeline as a high-level helper # Warning: Pipeline type "translation" is no longer supported in transformers v5. # You must load the model directly (see below) or downgrade to v4.x with: # 'pip install "transformers<5.0.0' from transformers import pipeline pipe = pipeline("translation", model="ngocdang83/HachimiMT-60-zh-vi")# Load model directly from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("ngocdang83/HachimiMT-60-zh-vi") model = AutoModelForSeq2SeqLM.from_pretrained("ngocdang83/HachimiMT-60-zh-vi", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Xưng hô chưa đồng nhất.
Trong 1 chương truyện, lúc thì xưng hô chị em, lúc thì tỷ muội. AD nên đồng nhất cách xưng hô lại, theo hán việt cho khỏe được không: hắn/nàng/ta/tỷ/ca ca/muội muội....
Cái này là do khi xử lý dịch thường cắt thành từng câu, dịch riêng từng câu nên xưng hô bị lệch.
Muốn chuẩn hóa thì có thể xử lý post-process chuẩn hóa riêng. Còn nếu model muốn dịch đồng nhất thì phải đồng nhất việc đơn giản hóa xưng hô ngay từ trong dataset. Nào rảnh thì thử gắn thêm post process xử lý xưng hô hoặc lọc dataset train lại model bản xưng hô đơn giản/đồng nhất thử.
Bạn test thử bản post process ở đây https://huggingface.co/spaces/ngocdang83/HachimiMT-demo
Cảm ơn bạn đã trả lời.
Code bạn đưa ko thấy CT2.
Có thể max_length=512 góp phần gây lặp, nhưng chưa chắc là nguyên nhân duy nhất.
Bạn đang dùng transformers.generate(), chưa phải CTranslate2. Với model nhỏ này (~57M), nên dịch theo câu/đoạn ngắn, không đưa cả chương dài vào một lần — vì decoder nhỏ khi phải sinh chuỗi dài rất dễ lặp.
Bạn thử:
- chia text theo câu/đoạn nhỏ trước khi dịch
- dùng
beam_size/num_beams= 1 hoặc 2 - đổi
max_lengthsangmax_new_tokensthấp hơn, ví dụ 128–256 (kiểm soát số token sinh ra thay vì độ dài tổng) - giữ
no_repeat_ngram_size=2(đừng tăng lên 3 — số càng nhỏ chặn lặp càng chặt)
Hàm chia chunk theo câu (gom tới ngưỡng token), bạn có thể dùng luôn:
import re
def split_into_chunks(text, tokenizer, max_tokens=256):
# tách câu theo dấu câu tiếng Trung (giữ lại dấu)
sentences = [s for s in re.split(r'(?<=[。!?…])', text) if s.strip()]
chunks, cur = [], ""
for sent in sentences:
cand = cur + sent
# gom nhiều câu tới khi sắp vượt max_tokens thì chốt 1 chunk
if cur and len(tokenizer.encode(cand)) > max_tokens:
chunks.append(cur)
cur = sent
else:
cur = cand
if cur:
chunks.append(cur)
return chunks
Dịch (Transformers):
results = []
for chunk in split_into_chunks(long_text, tokenizer, max_tokens=256):
inputs = tokenizer(chunk, return_tensors="pt", truncation=True, max_length=256)
inputs = {k: v.to(device) for k, v in inputs.items()}
with torch.no_grad():
output = model.generate(
**inputs,
num_beams=2,
max_new_tokens=256,
repetition_penalty=1.15,
no_repeat_ngram_size=2,
early_stopping=True,
)
results.append(tokenizer.batch_decode(output, skip_special_tokens=True)[0])
final = " ".join(results)
Nếu dùng CTranslate2 thật thì tham số tương ứng là max_decoding_length, không phải max_length:
results = translator.translate_batch(
tokenized_sentences,
beam_size=2,
max_decoding_length=256,
repetition_penalty=1.15,
no_repeat_ngram_size=2,
)
Docs khuyên dùng max_new_tokens để kiểm soát số token sinh ra thay vì dựa vào max_length; còn CTranslate2 có max_decoding_length, repetition_penalty, no_repeat_ngram_size riêng cho translate_batch (mình đã kiểm tra, cả ba đều dùng được).
Tóm lại: gốc rễ thường là đưa văn bản quá dài vào model một lần. Chia nhỏ theo câu là cách hiệu quả nhất 👍
Tks bạn. Với vấn đề tên viết hoa không đồng nhất, câu trước đang là Vô Thượng Thiên, câu sau lại là Vô Đạo Thiên hoặc Vô thượng thiên. Bạn có thể dùng file bên dưới để đối chiếu trung-hán việt, rồi so sánh với cụm viết hoa để đổi thành đáp án chính xác.
https://drive.google.com/file/d/117nczj99X_pkxUvp8AR8852Ro-KziXta/view?usp=sharing