Chuyển đến nội dung chính

レッスン 17: ベトナム人のための NLP — 課題と解決策

ベトナム語の特徴: 単語の分割 (VnCoreNLP、海底)、発音記号、複合語。 PhoBERT、ViT5、BARTpho。ベトナム語データセット: VLSP、vietnews。ベトナム語タスクのベンチマーク モデル。多言語 NLP のベスト プラクティス。

🧠 AI と ML — レッスン 16 レッスン 17: ベトナム人のための NLP — 課題と 解決策

NLP の基礎から上級まで: 自然言語処理をマスターする

パート 6: NLP の作成と現代のトレンド

xdev.asia

はじめに

ベトナム語は 分析言語 (孤立言語) のグループに属しており、英語とは根本的に異なります。ベトナム語の NLP には、言語の特性と特殊なツールについての深い理解が必要です。


1. 具体的な課題

1.1 単語の分割 — 問題 #1

ベトナム語では、英語のように 単語をスペースで区切ることはありません。

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バート要約、生成
ViT5Enc-DecT5要約、翻訳
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)

4. ベトナム語のデータセット

データセットタスクサイズ出典
VLSP 2016-2023NER、SA、QA、WSさまざまVLSP ワークショップ
UIT-VSFC感想16,000 件のレビュー大学
ベトニュース要約150,000 件の記事ベトアイ
フォンナー_新型コロナウイルス19NER(新型コロナウイルス)35,000 のエンティティヴィンアイ
ヴィクアド質問への回答23,000 の QA ペア大学

5. ベストプラクティス

  1. PhoBERT を使用する前に 必ず単語を分割してください
  2. Unicode NFC 正規化 — 特に重要
  3. 多言語モデル (XLM-R、BGE-M3) は多くの場合、ゼロショットに適しています。
  4. 逆翻訳 (EN→VI→EN) または LLM 合成データによる データの増加

概要

側面ソリューション
単語の分割海底、VnCoreNLP
分類/NERPhoBERT v2
要約ViT5、BARTpho
埋め込みBGE-M3、多言語-e5
翻訳NLLB、envit5

次の記事

レッスン 18: NLP パイプラインの本番環境 — NLP モデルを本番環境に導入する: サービス提供、モニタリング、CI/CD。