Tiếng Anh: "machine learning" → ["machine", "learning"] ← Rõ ràng
Tiếng Việt: "học sinh học sinh học" → ???
- "học_sinh / học / sinh_học" ← học sinh ĐI học môn sinh học
- "học / sinh_học / sinh_học" ← ???
from underthesea import word_tokenize
text = "Trường đại học Bách Khoa Hà Nội là trường đại học kỹ thuật hàng đầu"
tokens = word_tokenize(text)
print(tokens)
# ['Trường', 'đại_học', 'Bách_Khoa', 'Hà_Nội', 'là', 'trường',
# 'đại_học', 'kỹ_thuật', 'hàng_đầu']
1.2 トーンマーク
# 6 thanh điệu: ngang, sắc, huyền, hỏi, ngã, nặng
# "ma", "má", "mà", "mả", "mã", "mạ" — 6 từ hoàn toàn khác nghĩa!
# Vấn đề: user thường gõ không dấu
text_no_accent = "hoc sinh hoc sinh hoc"
# Cần accent restoration trước khi xử lý NLP
1.3 課題の比較表
チャレンジ
英語
ベトナム語
単語の境界
スペース
単語の分割が必要
形態学
活用 (run/ran/running)
語尾変化なし
トーン/アクセント
いいえ
6トーン
リソース
たくさん
ましてや
トークナイザーの効率
~1 トークン/ワード
~1.5 ~ 2 トークン/ワード (LLM)
2. ベトナム語 NLP ツール
2.1 海底
from underthesea import (
word_tokenize,
pos_tag,
ner,
classify,
sentiment,
)
text = "Nguyễn Phú Trọng làm việc tại Hà Nội, Việt Nam"
# Word segmentation
print(word_tokenize(text))
# POS Tagging
print(pos_tag(text))
# [('Nguyễn_Phú_Trọng', 'Np'), ('làm_việc', 'V'), ('tại', 'E'),
# ('Hà_Nội', 'Np'), (',', 'CH'), ('Việt_Nam', 'Np')]
# NER
print(ner(text))
# [('Nguyễn_Phú_Trọng', 'B-PER'), ..., ('Hà_Nội', 'B-LOC'), ...]
# Sentiment
print(sentiment("Sản phẩm này rất tốt"))
# positive
2.2 VnCoreNLP
from vncorenlp import VnCoreNLP
annotator = VnCoreNLP("VnCoreNLP-1.2.jar", annotators="wseg,pos,ner", max_heap_size='-Xmx2g')
text = "Trường Đại học Bách Khoa Hà Nội tuyển sinh năm 2026"
result = annotator.annotate(text)
for sentence in result['sentences']:
for word_info in sentence:
print(f" {word_info['form']:20s} | {word_info['posTag']:5s} | {word_info['nerLabel']}")
3. ベトナム語用の事前トレーニング済みモデル
モデル
タイプ
ベース
タスク
フォバート
エンコーダ
ロベルタ
分類、NER、QA
バートフォ
Enc-Dec
バート
要約、生成
ViT5
Enc-Dec
T5
要約、翻訳
XLM-ロベルタ
エンコーダ
ロベルタ
多言語タスク
BGE-M3
エンコーダ
—
多言語埋め込み
PhoBERT によるテキスト分類
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# PhoBERT yêu cầu word segmentation TRƯỚC khi tokenize
from underthesea import word_tokenize
text = "Sản phẩm rất tốt và giao hàng nhanh"
segmented = word_tokenize(text, format="text")
# "Sản_phẩm rất tốt và giao_hàng nhanh"
tokenizer = AutoTokenizer.from_pretrained("vinai/phobert-base-v2")
model = AutoModelForSequenceClassification.from_pretrained(
"vinai/phobert-base-v2", num_labels=3
)
inputs = tokenizer(segmented, return_tensors="pt")
outputs = model(**inputs)