Stemming là gì? Ngram là gì?
🧠 1. STREMMING LÀ GÌ?
Stemming là quá trình rút gọn từ về gốc (stem) bằng cách loại bỏ hậu tố, tiền tố hoặc đuôi để làm cho các từ liên quan về ngữ nghĩa được đưa về cùng một dạng.
Ví dụ:
"connect", "connecting", "connected", "connection" → "connect"
🧾 2. VÌ SAO CẦN STEMMING?
-
Trong thực tế, một từ có thể có nhiều biến thể, nhưng tất cả đều mang ý nghĩa tương tự.
-
Khi xử lý văn bản, bạn muốn các biến thể đó được xem là một từ duy nhất → giúp tăng hiệu quả thống kê và học máy.
🛠 3. CÁCH DÙNG STEMMING TRONG PYTHON
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
stemmer = PorterStemmer()
sentence = "The system is connecting to multiple connections and was previously connected."
tokens = word_tokenize(sentence)
for token in tokens:
print(f"{token:>12} → {stemmer.stem(token)}")
Kết quả:
connecting → connect
connections → connect
connected → connect
🚀 4. ỨNG DỤNG THỰC TẾ CỦA STEMMING
✅ 4.1. Phân loại log máy chủ (Log Classification)
Mục tiêu: Phân tích log và phân loại thành lỗi (ERROR), cảnh báo (WARNING), thông tin (INFO)
Dữ liệu log:
2025-11-26 10:02:12 ERROR Connection failed for user admin
2025-11-26 10:03:55 INFO User admin connected successfully
→ Từ "connection", "connected", "connecting", "connects" → đều sẽ được stem thành "connect".
Giúp mô hình ML hiểu rằng các lỗi liên quan đến kết nối đều giống nhau về ý nghĩa.
✅ 4.2. Phân tích phản hồi khách hàng (Sentiment Analysis)
Dùng stemming để chuẩn hóa từ vựng giúp mô hình dễ học hơn.
Ví dụ:
"The product is disappointing and disappointing!"
→ stemming → ["product", "disappoint", "disappoint"]
→ Giúp thống kê từ khóa chính xác, giảm nhiễu dữ liệu.
✅ 4.3. Tìm kiếm văn bản (Search Engine / Full Text Search)
Stemming giúp cải thiện kết quả tìm kiếm, ví dụ:
Người dùng tìm: connect
→ Tài liệu chứa "connected", "connecting", "connection" cũng sẽ được trả về.
→ Được dùng trong:
-
Elasticsearch (có built-in stemmer)
-
Apache Lucene / Solr
✅ 4.4. Lọc spam email / tin nhắn
Chuẩn hóa từ như "viagra", "viagras", "viagralike" → stem về "viagra" để mô hình dễ nhận diện spam.
✅ 4.5. Trích xuất chủ đề (Topic Modeling)
Dùng trước khi áp dụng LDA hoặc NMF để giảm số lượng từ cần học.
⚠️ 5. HẠN CHẾ CỦA STEMMING
-
Không phân biệt từ đồng âm (playing vs playground)
-
Có thể tạo ra từ không đúng ngữ pháp
-
Không chính xác như lemmatization (dùng từ điển để phân tích ngữ pháp)
📌 6. KHI NÀO NÊN DÙNG STEMMING?
| Tình huống | Nên dùng |
|---|---|
| Văn bản lớn, không cần ngữ pháp | ✅ Stemming |
| Tìm kiếm, phân loại log, phân tích lỗi | ✅ Stemming |
| Ứng dụng ngôn ngữ học sâu | ❌ Dùng lemmatization tốt hơn |
📦 GỢI Ý THÊM CHO BẠN
-
PorterStemmer– đơn giản, phổ biến -
SnowballStemmer– mở rộng cho nhiều ngôn ngữ -
LancasterStemmer– mạnh hơn nhưng cắt "dữ dội" hơn
🔤 N-gram là gì?
N-gram là một chuỗi gồm N từ liên tiếp nhau (hoặc ký tự liên tiếp) trong một đoạn văn bản. Đây là một kỹ thuật phổ biến trong xử lý ngôn ngữ tự nhiên (NLP) dùng để nắm bắt ngữ cảnh cục bộ, giúp máy hiểu mối quan hệ giữa các từ.
📚 Ví dụ cơ bản:
Giả sử bạn có câu:
"Tôi đang học Python"
| Loại n-gram | Kết quả |
|---|---|
| Unigram (1-gram) | ["Tôi", "đang", "học", "Python"] |
| Bigram (2-gram) | ["Tôi đang", "đang học", "học Python"] |
| Trigram (3-gram) | ["Tôi đang học", "đang học Python"] |
🔧 Mục đích sử dụng:
| Mục tiêu | Cách sử dụng |
|---|---|
| 💬 Hiểu ngữ cảnh | N-gram nắm bắt các từ gần nhau (ví dụ: "máy học", "trí tuệ nhân tạo") |
| 🔍 Tìm cụm từ phổ biến | Tìm các bigram phổ biến trong tập dữ liệu lớn |
| 🤖 Train mô hình NLP | N-gram dùng để tạo đặc trưng (features) cho mô hình ML |
| 📨 Phân loại văn bản | Dựa vào chuỗi từ liên tiếp để phân tích chủ đề hoặc cảm xúc |
| 📈 Dự đoán từ kế tiếp | Mô hình gợi ý từ dựa trên n-gram (như bàn phím điện thoại) |
🛠 Cách tạo n-gram bằng Python
▶️ Dùng nltk:
import nltk
from nltk.util import ngrams
from nltk.tokenize import word_tokenize
sentence = "Tôi đang học xử lý ngôn ngữ tự nhiên"
tokens = word_tokenize(sentence)
bigrams = list(ngrams(tokens, 2))
print(bigrams)
Kết quả:
[('Tôi', 'đang'), ('đang', 'học'), ('học', 'xử'), ('xử', 'lý'), ('lý', 'ngôn'), ('ngôn', 'ngữ'), ('ngữ', 'tự'), ('tự', 'nhiên')]
▶️ Dùng CountVectorizer trong scikit-learn:
from sklearn.feature_extraction.text import CountVectorizer
text = ["tôi đang học xử lý ngôn ngữ tự nhiên"]
vectorizer = CountVectorizer(ngram_range=(2, 2)) # bigram
X = vectorizer.fit_transform(text)
print(vectorizer.get_feature_names_out())
Kết quả:
['đang học' 'học xử' 'ngôn ngữ' 'tự nhiên' 'tôi đang' 'xử lý' 'lý ngôn']
✅ Khi nào nên dùng N-gram?
| Trường hợp | Dùng N-gram |
|---|---|
| Văn bản ngắn (log, tweet) | ✅ bigram hoặc trigram giúp bổ sung ngữ cảnh |
| Phân loại văn bản | ✅ n-gram giúp nhận diện cụm từ đặc trưng |
| Dự đoán từ tiếp theo | ✅ trigram, 4-gram |
| Dịch máy hoặc chatbot | ✅ để hiểu mối quan hệ giữa các từ |
⚠️ Lưu ý:
-
N càng lớn, mô hình càng hiểu ngữ cảnh tốt hơn → nhưng cũng dễ gây bùng nổ đặc trưng (high dimensionality).
-
Thường dùng
n = 1 → 3là hợp lý.
📌 Tổng kết:
| Thuật ngữ | Ý nghĩa |
|---|---|
| N-gram | Một chuỗi gồm N từ liên tiếp |
| Unigram | 1 từ (độc lập) |
| Bigram | 2 từ liên tiếp |
| Trigram | 3 từ liên tiếp |