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

Stemming và Lemmatization trong Python

Hướng dẫn này trình bày stemming và lemmatization dưới góc độ thực hành bằng gói Python Natural Language ToolKit (NLTK).
Đã cập nhật 5 thg 10, 2026  · 12 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Tiếng Anh hiện đại được xem là một ngôn ngữ biến hình yếu. Điều này có nghĩa là có nhiều từ trong tiếng Anh được dẫn xuất từ một từ khác; ví dụ, từ biến hình “normality” được dẫn xuất từ “norm,” là dạng gốc. Tất cả các ngôn ngữ biến hình đều gồm những từ có chung dạng gốc, nhưng mức độ biến hình khác nhau tùy ngôn ngữ.  

Khi làm việc với văn bản, đôi khi cần áp dụng các kỹ thuật chuẩn hóa để đưa các từ từ dạng dẫn xuất về dạng gốc. Điều này giúp giảm tính ngẫu nhiên và đưa các từ trong kho văn bản tiến gần hơn tới một chuẩn xác định trước, qua đó cải thiện hiệu quả xử lý vì máy tính phải xử lý ít đặc trưng hơn. 

Hai kỹ thuật chuẩn hóa văn bản phổ biến nhất trong Xử lý ngôn ngữ tự nhiên (NLP) là stemming và lemmatization. 

Các nhà nghiên cứu đã nghiên cứu những kỹ thuật này trong nhiều năm; người thực hành NLP thường dùng chúng để chuẩn bị từ, văn bản và tài liệu cho các bước xử lý tiếp theo trong nhiều tác vụ. 

Hướng dẫn này sẽ trình bày stemming và lemmatization theo hướng thực hành bằng gói Python Natural Language ToolKit (NLTK).

Xem sổ tay DataLab này để tổng quan toàn bộ mã trong hướng dẫn. Để chỉnh sửa và chạy mã, hãy tạo một bản sao sổ tay để chạy và chỉnh sửa mã này.

Stemming là gì?

Stemming là kỹ thuật dùng để rút gọn một từ biến hình về thân từ (stem). Ví dụ, các từ “programming,” “programmer,” và “programs” đều có thể rút về thân từ chung “program.” Nói cách khác, “program” có thể được dùng như từ đồng nghĩa cho ba từ biến hình trước đó. 

Thực hiện kỹ thuật xử lý văn bản này thường hữu ích khi đối phó với độ thưa và/hoặc chuẩn hóa vốn từ. Nó không chỉ giúp giảm dư thừa, vì đa số thân từ và các từ biến hình của chúng có cùng nghĩa, mà còn cho phép các mô hình NLP học được mối liên hệ giữa các từ biến hình và thân từ của chúng, từ đó giúp mô hình hiểu cách dùng trong các ngữ cảnh tương tự. 

Các thuật toán stemming hoạt động bằng cách lấy danh sách tiền tố và hậu tố thường gặp ở các từ biến hình và cắt bỏ phần đầu hoặc cuối của từ. Đôi khi điều này cho ra các thân từ không phải là từ có thực — một hạn chế chúng ta sẽ bàn bên dưới.

Ưu điểm của stemming

  • Cải thiện hiệu năng mô hình: Stemming giảm số lượng từ duy nhất mà thuật toán cần xử lý, từ đó có thể cải thiện hiệu năng. Ngoài ra, nó cũng có thể giúp thuật toán chạy nhanh và hiệu quả hơn.
  • Nhóm các từ tương tự: Các từ có nghĩa tương tự có thể được nhóm lại, ngay cả khi chúng có dạng khác nhau. Đây là kỹ thuật hữu ích trong các tác vụ như phân loại tài liệu, nơi việc xác định chủ đề hoặc đề tài chính trong một tài liệu là quan trọng. 
  • Dễ phân tích và hiểu hơn: Vì stemming thường làm giảm kích thước vốn từ, việc phân tích, so sánh và hiểu văn bản trở nên dễ dàng hơn. Điều này hữu ích trong các tác vụ như phân tích cảm xúc, nơi mục tiêu là xác định cảm xúc của một tài liệu. 

Nhược điểm của stemming

  • Overstemming / dương tính giả: Đây là khi thuật toán stemming rút gọn các từ biến hình khác nhau về cùng một thân từ dù chúng không liên quan; ví dụ, thuật toán Porter Stemmer rút “universal”, “university”, và “universe” về cùng một thân từ. Dù chúng có liên hệ về từ nguyên, nghĩa hiện đại của chúng thuộc các lĩnh vực rất khác nhau. Xem chúng như từ đồng nghĩa sẽ làm giảm độ liên quan trong kết quả tìm kiếm. 
  • Understemming / âm tính giả: Đây là khi thuật toán stemming rút gọn các từ biến hình về những thân từ khác nhau dù chúng nên giống nhau. Ví dụ, thuật toán Porter Stemmer không rút “alumnus,” “alumnae,” và “alumni” về cùng một thân từ, dù chúng nên được xem là đồng nghĩa. 
  • Thách thức về ngôn ngữ: Khi hình thái, chính tả và mã hóa ký tự của ngôn ngữ đích trở nên phức tạp hơn, việc thiết kế stemmer trở nên khó khăn hơn; ví dụ, stemmer cho tiếng Ý phức tạp hơn tiếng Anh vì có nhiều biến tố động từ hơn. Stemmer cho tiếng Nga còn phức tạp hơn do có nhiều cách biến cách của danh từ.

Lemmatization là gì?

Lemmatization là một kỹ thuật khác dùng để rút các từ biến hình về từ gốc. Nó mô tả quy trình thuật toán nhằm xác định “lemma” (dạng từ điển) của một từ biến hình dựa trên nghĩa dự định của nó. 

Khác với stemming, lemmatization dựa vào việc xác định chính xác loại từ (part-of-speech) và nghĩa của từ dựa trên ngữ cảnh. Điều này có nghĩa là nó xét đến vị trí của từ biến hình trong câu, cũng như bối cảnh rộng hơn xung quanh câu đó, như các câu liền kề hoặc thậm chí cả tài liệu.

Lemmatization thường ám chỉ việc làm một cách chuẩn mực bằng cách sử dụng vốn từ và phân tích hình thái của từ, thường với mục tiêu chỉ loại bỏ các đuôi biến hình và trả về dạng gốc hoặc dạng từ điển của từ, được gọi là lemma

Standford NLP Group, Standford NLP Group

Nói cách khác, lemmatize một tài liệu nghĩa là làm đúng cách, vì nó liên quan đến việc dùng vốn từ và thực hiện phân tích hình thái của từ để chỉ loại bỏ các đuôi biến hình và trả về dạng gốc hoặc dạng từ điển của từ, được gọi là “lemma.” Ví dụ, bạn có thể kỳ vọng một thuật toán lemmatization sẽ ánh xạ “runs,” “running,” và “ran” về lemma “run.”  

Ưu điểm của lemmatization

  • Độ chính xác: Lemmatization không đơn thuần cắt ngắn từ như các thuật toán stemming. Việc phân tích từ được tiến hành dựa trên POS của từ để xét đến ngữ cảnh khi tạo ra các lemma. Ngoài ra, lemmatization tạo ra các từ có thật trong từ điển.

Nhược điểm của lemmatization 

  • Tốn thời gian: So với stemming, lemmatization là một quá trình chậm và tốn thời gian. Nguyên nhân là do lemmatization cần thực hiện phân tích hình thái và suy ra nghĩa của từ từ một từ điển. 

Bắt đầu học Python miễn phí

Nhập môn Khoa học Dữ liệu với Python

BasicSkill Level
4 giờ
504.2K learners
Khám phá Khoa học dữ liệu bằng Python và học cách phân tích, trực quan hóa dữ liệu hiệu quả. Không cần kinh nghiệm hay kỹ năng lập trình.
See DetailsRight Arrow
Start Course

Ví dụ về Stemming và Lemmatization trong Python với NLTK

Bây giờ bạn đã có cái nhìn tổng quan về stemming và lemmatization. Ở phần này, chúng ta sẽ thực hành và minh họa ví dụ cho cả hai kỹ thuật bằng Python và thư viện NLTK. 

Gói NLTK trong Python

Natural Language Tool Kit (NLTK) là một thư viện Python dùng để xây dựng các chương trình có khả năng xử lý ngôn ngữ tự nhiên. Thư viện có thể thực hiện nhiều thao tác như tách từ, stemming, phân loại, phân tích cú pháp, gán nhãn, suy luận ngữ nghĩa, phân tích cảm xúc, và nhiều hơn nữa.

Phiên bản mới nhất là NLTK 3.9.x, yêu cầu Python 3.10 trở lên (tới 3.14), nhưng bạn không phải lo vì nó đã được cài sẵn trong sổ tay DataLab — chỉ cần import nltk là có thể dùng.

Ví dụ stemming trong Python

Một trong những thuật toán stemming phổ biến nhất là “Porter stemmer.” Porter stemmer lần đầu được Martin Porter đề xuất trong bài báo năm 1980 có tiêu đề "An algorithm for suffix stripping." Bài báo này đã trở thành một trong những thuật toán phổ biến nhất cho stemming trong tiếng Anh.

Hãy xem nó hoạt động thế nào:

import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt_tab")  # Use punkt_tab in NLTK 3.9+; punkt is deprecated
​
# Initialize Python porter stemmer
ps = PorterStemmer()
​
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
​
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in example_words:
   print ("{0:20}{1:20}".format(word, ps.stem(word)))

"""
--Word--            --Stem--            
program             program             
programming         program             
programer           program             
programs            program             
programmed          program

"""

Đây là một ví dụ khá đơn giản; chúng ta kỳ vọng kết quả như vậy từ porter stemmer như đã đề cập ở phần “Stemming” bên trên. 

Hãy thử một ví dụ khó hơn:

import string
from nltk.tokenize import word_tokenize

example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."

# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))

# Create tokens
word_tokens = word_tokenize(example_sentence_no_punct)

# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in word_tokens:
    print ("{0:20}{1:20}".format(word, ps.stem(word)))

"""
--Word--            --Stem--            
Python              python              
programmers         programm            
often               often               
tend                tend                
like                like                
programming         program             
in                  in                  
python              python              
because             becaus              
its                 it                  
like                like                
english             english             
We                  we                  
call                call                
people              peopl               
who                 who                 
program             program             
in                  in                  
python              python              
pythonistas         pythonista
"""

Bạn có thể thấy một số từ đầu ra không có trong từ điển tiếng Anh (ví dụ, “becaus,” “peopl,” và “programm.”). Một điều nữa cần lưu ý là ngữ cảnh không được xét đến. Chẳng hạn, “programmers” là danh từ số nhiều nhưng bị rút về “program,” có thể là danh từ hoặc động từ – nói cách khác, các từ gốc trở nên mơ hồ. 

Ví dụ lemmatization trong Python

Động lực đằng sau các lemmatizer nhạy ngữ cảnh là cải thiện hiệu năng với các từ chưa thấy và mơ hồ. Trong ví dụ lemmatization, chúng ta sẽ dùng một lemmatizer phổ biến là WordNet lemmatizer. 

WordNet là một cơ sở dữ liệu từ vựng tiếng Anh lớn, miễn phí và công khai, nhằm thiết lập các quan hệ ngữ nghĩa có cấu trúc giữa các từ.

Hãy xem thực tế:

from nltk.stem import WordNetLemmatizer
nltk.download("wordnet")
nltk.download("omw-1.4")
​
# Initialize wordnet lemmatizer
wnl = WordNetLemmatizer()
​
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
​
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))

for word in example_words:
   # pos="v" tells the lemmatizer to treat words as verbs
   # Other options: "n" (noun), "a" (adjective), "r" (adverb)
   print("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))

"""
--Word--            --Lemma--           
program             program             
programming         program             
programer           programer           
programs            program             
programmed          program
"""   

Các từ đầu vào truyền vào lemmatizer sẽ giữ nguyên nếu không tìm thấy trong WordNet. Điều này có nghĩa cần cung cấp ngữ cảnh, được thực hiện bằng cách truyền giá trị tham số loại từ, pos, trong wordnet_lemmatizer.lemmatize.

Lưu ý từ “programmer” không bị cắt xuống “program” bởi lemmatizer: đó là vì chúng ta đã yêu cầu lemmatizer chỉ xử lý động từ. 

Hãy đưa cho lemmatizer một thứ phức tạp hơn để xem nó xử lý ra sao…

example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
​
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
​
word_tokens = word_tokenize(example_sentence_no_punct)
​
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in word_tokens:
   print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word--            --Lemma--           
Python              Python              
programmers         programmers         
often               often               
tend                tend                
like                like                
programming         program             
in                  in                  
python              python              
because             because             
its                 its                 
like                like                
english             english             
We                  We                  
call                call                
people              people              
who                 who                 
program             program             
in                  in                  
python              python              
pythonistas         pythonistas 
"""

Tất cả các từ do thuật toán lemmatization trả về đều có trong từ điển tiếng Anh - trừ “pythonistas,” vốn là thuật ngữ không chính thức dùng để chỉ lập trình viên Python. 

Stemming so với Lemmatization

Bạn đã thấy cách triển khai cả hai kỹ thuật, nhưng chúng so sánh với nhau thế nào? 

Stemming và lemmatization đều là các kỹ thuật xử lý văn bản nhằm rút các từ biến hình về một gốc chung. Mặc dù mục tiêu tổng thể tương đồng, hai kỹ thuật không giống nhau. 

Khác biệt chính giữa stemming và lemmatization nằm ở cách mỗi kỹ thuật đạt được mục tiêu rút các từ biến hình về gốc chung. 

Các thuật toán stemming cố gắng tìm gốc chung của nhiều biến thể bằng cách cắt bỏ phần đầu hoặc cuối của từ. Việc cắt dựa trên danh sách tiền tố và hậu tố thường thấy ở các từ biến hình. Tính “cắt bừa” này đôi khi dẫn tới việc tìm được thân từ có nghĩa, nhưng nhiều lúc thì không. 

Ngược lại, các thuật toán lemmatization tìm gốc chung từ các từ biến hình bằng cách thực hiện phân tích hình thái. Để rút gọn chính xác, cần duy trì một từ điển chi tiết để thuật toán có thể tra cứu và liên kết một từ biến hình về lemma của nó.

Hai kỹ thuật cũng có thể khác nhau ở chỗ stemming thường gộp các từ liên quan theo dẫn xuất, trong khi lemmatization thường chỉ gộp các dạng biến hình khác nhau của một lemma.

Stanford NLP, IR Book

Cách tiếp cận quy heuristics thô của các thuật toán stemming thường khiến chúng nhanh và hiệu quả nhưng không phải lúc nào cũng chính xác. Ngược lại, các thuật toán lemmatization hy sinh tốc độ và hiệu quả để đổi lấy độ chính xác, do đó cho ra các gốc từ có nghĩa. 

Ví dụ, một thuật toán stemming có thể rút “saw” xuống “s.” Trong khi đó, một thuật toán lemmatization sẽ xét “saw” là danh từ (dụng cụ cưa) hay động từ (quá khứ của see) dựa trên ngữ cảnh sử dụng trước khi quyết định trả về lemma – nếu là danh từ sẽ trả “saw,” còn nếu là động từ sẽ trả “see.”

Những điểm này có lẽ giờ đã khá rõ ràng, vậy đây là câu hỏi trị giá một triệu đô –  “tôi nên dùng stemming hay lemmatization cho tiền xử lý văn bản?” 

Như hầu hết vấn đề trong phần mềm; còn tùy. 

Bạn coi trọng tốc độ và hiệu quả? Nếu có, hãy chọn stemming. 

Ngữ cảnh có quan trọng với ứng dụng của bạn không? Nếu câu trả lời là “có,” hãy dùng lemmatization. 

Kỹ thuật bạn dùng hoàn toàn phụ thuộc vào ứng dụng bạn đang xây dựng và mục tiêu dự án. Bạn có thể chạy thử nghiệm với cả hai kỹ thuật và so sánh kết quả để xem cách tiếp cận nào cho ra kết quả phù hợp nhất với mục tiêu dự án. 

Một điều chúng ta chưa bàn nhiều trong hướng dẫn này là cách tạo ra các thuật toán lemmatization; đó là vì có nhiều thư viện (như SpaCy, NLTK, v.v.) tương thích với các ngôn ngữ khác nhau. Tuy nhiên, nếu bạn phải tự xây dựng lemmatizer cho một ngôn ngữ chưa được hỗ trợ (ví dụ, Akan), bạn sẽ cần hiểu biết sâu về ngôn ngữ đích để xây dựng lemmatizer. Thuật toán stemming thì dễ xây dựng hơn nhiều trong các tình huống như vậy.

  Stemming Lemmatization
Tốc độ Nhanh Chậm
Độ chính xác Thấp hơn Cao hơn
Đầu ra Có thể không phải từ có thực Luôn là từ có thực
Có dùng ngữ cảnh? Không Có
Phù hợp nhất cho Công cụ tìm kiếm, bộ lọc spam Chatbot, phân tích cảm xúc, Hỏi-Đáp

Kết luận

Tóm lại, stemming và lemmatization là các kỹ thuật dùng trong xử lý văn bản của NLP. Cả hai đều nhằm rút các biến thể về những từ gốc chung, nhưng mỗi kỹ thuật tiếp cận theo một cách khác nhau. 

Lemmatization chính xác hơn nhiều so với stemming. Nó luôn trả về các từ có thực trong từ điển và xét đến ngữ cảnh. Với hầu hết các pipeline NLP hiện đại, lemmatization được ưa chuộng khi độ chính xác là quan trọng. Tuy nhiên, nếu bạn làm việc ở quy mô lớn hoặc xây dựng nguyên mẫu nhanh, stemming có thể là đủ và nhanh hơn đáng kể.


Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn

FAQs

Tôi có cần tải thêm gì để dùng stemmer và lemmatizer của NLTK không?

Với Porter Stemmer, bạn không cần tải thêm gì ngoài việc cài đặt NLTK. Với WordNet Lemmatizer, bạn cần chạy nltk.download("wordnet") và nltk.download("omw-1.4") một lần trước khi dùng. Để tách từ, bạn cũng cần nltk.download("punkt_tab") trong NLTK 3.9+.

Vì sao lemmatizer trả về y nguyên từ tôi đưa vào mà không thay đổi?

Thường là do một trong hai lý do: hoặc từ đó không có trong từ điển của WordNet, hoặc bạn chưa chỉ định đúng tham số pos (loại từ). Ví dụ, wnl.lemmatize("running") mặc định trả về "running" vì giả định là danh từ. Truyền pos="v" để xử lý như động từ và nhận về "run".

Stemming hay lemmatization tốt hơn cho công cụ tìm kiếm?

Nhìn chung stemming được ưu tiên cho công cụ tìm kiếm vì tốc độ quan trọng hơn độ chính xác tuyệt đối ở quy mô đó. Khi người dùng tìm "running shoes," bạn muốn nhanh chóng trả kết quả cho "run," "runner," và "runs." Việc đôi khi có thân từ không có trong từ điển cũng không ảnh hưởng nhiều đến trải nghiệm. Lemmatization thường là dư thừa cho hầu hết trường hợp tìm kiếm.

Tôi có thể dùng các kỹ thuật này với ngôn ngữ khác ngoài tiếng Anh không?

Có, nhưng mức độ khó khác nhau. NLTK có hỗ trợ hạn chế cho các ngôn ngữ khác. Để hỗ trợ đa ngôn ngữ rộng hơn, các thư viện như spaCy hoặc Stanza là lựa chọn tốt — đặc biệt spaCy có hỗ trợ lemmatization mạnh cho các ngôn ngữ như Đức, Pháp, Tây Ban Nha, Bồ Đào Nha, và nhiều ngôn ngữ khác. Tự xây dựng stemmer hoặc lemmatizer cho một ngôn ngữ ít tài nguyên (như Akan) đòi hỏi hiểu biết sâu về hình thái của ngôn ngữ đó.

Lemmatization có luôn cho kết quả mô hình NLP tốt hơn stemming không?

Không hẳn. Còn tùy tác vụ và dữ liệu. Với các tác vụ mà nghĩa chính xác của từ là quan trọng — như hỏi đáp, phân tích cảm xúc, hoặc chatbot — lemmatization thường cho kết quả tốt hơn. Với các tác vụ đơn giản hơn như phân loại tài liệu hoặc trích xuất từ khóa, stemming thường cho kết quả tương đương với chi phí xử lý thấp hơn nhiều. Cách an toàn nhất là thử cả hai và so sánh kết quả trên dữ liệu cụ thể của bạn.

Chủ đề
Trí tuệ Nhân tạo
Python
Machine Learning

Tìm hiểu thêm về Python và Xử lý ngôn ngữ tự nhiên

Khóa học

Nhập môn Deep Learning với Python

4 giờ
264.8K
Tìm hiểu các kiến thức cơ bản về mạng nơ-ron và cách xây dựng mô hình học sâu bằng Keras 2.0 trong Python.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm