Trong các bài toán học máy liên quan đến xử lý ngôn ngữ tự nhiên (NLP), dữ liệu được gán nhãn đóng vai trò cực kỳ quan trọng. Tuy nhiên, quá trình gán nhãn thủ công cho văn bản thường tốn thời gian và chi phí. Đây là lúc các công cụ như spaCy phát huy sức mạnh: giúp bạn tự động gán nhãn từ dữ liệu thô, rút ngắn quá trình chuẩn bị tập huấn luyện.
Nếu bạn từng đọc qua bài Hướng dẫn dùng LabelImg để gán nhãn dữ liệu ảnh thì việc gán nhãn dữ liệu văn bản bằng spaCy cũng là một bước không thể thiếu trong pipeline NLP. Bên cạnh đó, bài Phân tích cảm xúc Facebook bằng Python và Tạo pipeline học máy đầy đủ từ raw data đến model sẽ giúp bạn hiểu rõ cách kết nối dữ liệu gán nhãn vào huấn luyện mô hình thực tế.
Bài viết này sẽ hướng dẫn bạn sử dụng spaCy để tự động gán nhãn cho văn bản, bao gồm Named Entity Recognition (NER), tokenization, và chuyển đổi sang định dạng có thể dùng để huấn luyện mô hình.
Giới thiệu về spaCy và NER
spaCy là thư viện NLP mạnh mẽ và nhanh gọn, hỗ trợ nhiều ngôn ngữ và đi kèm với các mô hình được huấn luyện sẵn. Một trong những tính năng nổi bật nhất của spaCy là nhận dạng thực thể có tên (NER).
NER là kỹ thuật phân tích văn bản để nhận diện và phân loại các thực thể như:
- Tên người (PERSON)
- Tổ chức (ORG)
- Địa điểm (GPE)
- Ngày tháng (DATE),…
Thay vì bạn phải ngồi gán nhãn từng đoạn văn bản, mô hình có sẵn trong spaCy sẽ hỗ trợ tự động nhận diện và phân loại nhanh chóng.
Cài đặt spaCy và mô hình
Trước tiên, bạn cần cài spaCy và tải mô hình tiếng Anh hoặc tiếng Việt nếu có hỗ trợ.
pip install spacy python -m spacy download en_core_web_sm
Nếu bạn muốn áp dụng cho tiếng Việt, có thể dùng mô hình do cộng đồng huấn luyện như vi_spacy_model, hoặc kết hợp thêm underthesea, pyvi để xử lý sơ bộ.
Tự động gán nhãn NER cho văn bản
Sau khi đã cài đặt xong, chúng ta thử dùng mô hình tiếng Anh mặc định để gán nhãn cho một đoạn văn bản.
import spacy
nlp = spacy.load("en_core_web_sm")
text = "Apple is looking at buying U.K. startup for $1 billion"
doc = nlp(text)
for ent in doc.ents:
print(ent.text, ent.label_)
Đoạn code trên sẽ tự động trích xuất các thực thể như “Apple” (ORG), “U.K.” (GPE), và “$1 billion” (MONEY).
Chuyển dữ liệu đã gán nhãn sang định dạng huấn luyện
Để huấn luyện mô hình NER tuỳ chỉnh, bạn cần có dữ liệu ở định dạng TRAIN_DATA, gồm cặp (văn bản, từ điển các thực thể).
spaCy cho phép bạn chuyển đổi dữ liệu đã phân tích sang định dạng này.
TRAIN_DATA = []
for ent in doc.ents:
TRAIN_DATA.append((ent.start_char, ent.end_char, ent.label_))
example = (text, {"entities": TRAIN_DATA})
print(example)
Bạn có thể lặp qua nhiều văn bản và gom lại thành tập dữ liệu để fine-tune mô hình của riêng mình.
Tự động gán nhãn nhiều dòng văn bản
Nếu bạn có danh sách văn bản (từ file CSV, JSON, hoặc crawl web), có thể áp dụng pipeline spaCy để xử lý hàng loạt.
texts = [
"Facebook acquired WhatsApp in 2014",
"Barack Obama was born in Hawaii",
"Amazon plans to open a new warehouse in Texas"
]
data = []
for t in texts:
doc = nlp(t)
entities = [(ent.start_char, ent.end_char, ent.label_) for ent in doc.ents]
data.append((t, {"entities": entities}))
print(data)
Sau bước này, bạn có thể lưu data vào file JSON hoặc .spacy để dùng trong huấn luyện.
Kết luận
Tự động gán nhãn văn bản là bước giúp tăng tốc phát triển hệ thống NLP. Với sự hỗ trợ từ spaCy, bạn có thể dễ dàng chuyển từ dữ liệu thô sang tập huấn luyện chuẩn hóa để fine-tune mô hình hoặc phục vụ phân tích thực thể.
spaCy không chỉ hỗ trợ NER mà còn hỗ trợ POS tagging, Dependency Parsing và nhiều công cụ mạnh khác. Bạn có thể kết hợp spaCy với các thư viện như Hugging Face, hoặc dùng các mô hình tiếng Việt để mở rộng hệ thống xử lý ngôn ngữ tiếng Việt tự động và thông minh hơn.

