Lemmalaştırma genellikle bir sözlük ve kelimelerin biçimbilimsel analizini kullanarak işleri düzgün yapmaya atıfta bulunur; normalde yalnızca çekim eklerini kaldırmayı ve bir kelimenin temel ya da sözlük biçimini, yani lemma'yı döndürmeyi amaçlar
Başka bir deyişle, bir belgeyi lemmalaştırmak, bir sözlük kullanmayı ve kelimelerin biçimbilimsel analizini yaparak yalnızca çekim sonlarını kaldırıp bir kelimenin temel ya da sözlük biçimi olan “lemma”yı döndürmeyi içerdiğinden işleri doğru yapmak anlamına gelir. Örneğin, bir lemmalaştırma algoritmasının “runs”, “running” ve “ran” sözcüklerini “run” lemmaya eşlemesini bekleyebilirsiniz.
Lemmalaştırmanın avantajları
- Doğruluk: Lemmalaştırma, stemming algoritmalarında gördüğünüz gibi kelimeleri yalnızca kesip atmaz. Lemma üretirken bağlamı dikkate almak için kelimelerin POS’una göre analiz yapılır. Ayrıca lemmalaştırma sonucunda gerçek sözlük kelimeleri elde edilir.
Lemmalaştırmanın dezavantajları
- Zaman alıcı: Stemming’e kıyasla lemmalaştırma daha yavaş ve zaman alan bir süreçtir. Bunun nedeni, lemmalaştırmanın biçimbilimsel analiz yapmayı ve kelimelerin anlamını bir sözlükten çıkarmayı içermesidir.
NLTK ile Python'da Stemming ve Lemmalaştırma Örnekleri
Artık kök bulma ve lemmalaştırmaya genel bir bakışınız var. Bu bölümde, Python ve NLTK adlı bir kütüphaneyi kullanarak her iki tekniğin de örneklerini uygulamalı olarak göstereceğiz.
Python NLTK paketi
Natural Language Tool Kit (NLTK), doğal dili işleyebilen programlar geliştirmek için kullanılan bir Python kütüphanesidir. Kütüphane, tokenleştirme, stemming, sınıflandırma, ayrıştırma, etiketleme, anlamsal akıl yürütme, duygu analizi ve daha fazlası gibi farklı işlemler gerçekleştirebilir.
En son sürüm NLTK 3.9.x’tir ve Python 3.10 veya üzerini (3.14’e kadar) gerektirir; ancak DataLab çalışma kitabında önceden yüklü geldiği için endişelenmenize gerek yok — nltk’yi içe aktarın ve hazırsınız.
Python stemming örneği
En popüler kök bulma algoritmalarından biri “Porter stemmer” olarak adlandırılır. Porter stemmer ilk olarak Martin Porter tarafından 1980 tarihli "An algorithm for suffix stripping" başlıklı makalede önerildi. Bu makale, İngilizcede kök bulma için en yaygın algoritmalardan biri haline gelmiştir.
Nasıl çalıştığına bakalım:
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
"""
Bu oldukça basit bir örnek; “Stemming” bölümünde belirtildiği gibi porter stemmer’dan bu sonuçları bekliyorduk.
Daha zor bir örnek deneyelim:
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
"""
Burada çıktıdaki bazı kelimelerin İngilizce sözlükte yer almadığını görebilirsiniz (ör. “becaus”, “peopl” ve “programm.”). Dikkat edilmesi gereken bir diğer nokta da bağlamın dikkate alınmamasıdır. Örneğin “programmers” çoğul bir isimdir ancak “program”a indirgenmiştir; bu ise isim ya da fiil olabilir — başka bir deyişle, kök kelimeler belirsizdir.
Python lemmalaştırma örneği
Bağlama duyarlı lemmalaştırıcıların arkasındaki motivasyon, görülmemiş ve belirsiz kelimelerdeki performansı iyileştirmektir. Lemmalaştırma örneğimizde, WordNet lemmatizer adlı popüler bir lemmalaştırıcıyı kullanacağız.
WordNet, kelimeler arasında yapılandırılmış anlamsal ilişkiler kurmayı amaçlayan, İngilizce için büyük, ücretsiz ve herkese açık bir sözlüksel veritabanıdır.
İşe koyulalım:
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
"""
WordNet’te bulunamazsa lemmalaştırıcıya verilen giriş kelimeleri değişmeden kalır. Bu, bağlamın sağlanması gerektiği anlamına gelir; bu da wordnet_lemmatizer.lemmatize içinde sözcük türü parametresi olan pos’a bir değer vererek yapılır.
“programmer” kelimesinin lemmalaştırıcı tarafından “program”a indirgenmediğine dikkat edin: bunun nedeni, lemmalaştırıcıya yalnızca fiilleri işleme talimatı vermiş olmamızdır.
Lemmalaştırıcımıza nasıl başa çıktığını görmek için biraz daha karmaşık bir şey verelim…
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
"""
Lemmalaştırma algoritması tarafından döndürülen tüm kelimeler İngilizce sözlükte yer alır — “pythonistas” hariç; bu, daha çok Python programcılarına atıfta bulunan gayriresmî bir terimdir.
Stemming vs. Lemmatization
Her iki tekniğin nasıl uygulanacağını gördünüz, peki bunlar nasıl karşılaştırılır?
Stemming ve lemmalaştırma, çekimli kelimeleri ortak bir temel köke indirgemeyi amaçlayan metin işleme teknikleridir. Genel amaçtaki bu benzerliğe rağmen iki teknik aynı değildir.
Stemming ile lemmalaştırma arasındaki temel farklar, her tekniğin çekimli kelimeleri ortak bir temel köke indirgeme hedefine nasıl ulaştığında yatar.
Stemming algoritmaları, çekimli kelimelerde tipik olarak bulunan yaygın önek ve sonek listelerine dayanarak kelimenin sonunu veya başını keserek çeşitli çekimlerin ortak köklerini bulmaya çalışır. Kelimeleri ayrım gözetmeksizin kesip biçme niteliği bazen anlamlı kökler bulmaya yol açsa da, bazen de bulmaz.
Öte yandan, lemmalaştırma algoritmaları çekimli kelimelerden ortak temel kökleri bulmaya biçimbilimsel bir analiz yaparak çalışır. Çekimleri doğru biçimde indirgemek için, algoritmanın arama yaparak çekimli bir kelimeyi lemmaya bağlayabilmesi adına ayrıntılı bir sözlüğün tutulması gerekir.
İkisi arasındaki bir diğer fark da, stemming'in çoğunlukla türetimsel olarak ilişkili kelimeleri bir araya toplaması, lemmalaştırmanın ise genellikle yalnızca bir lemmaya ait farklı çekimsel biçimleri bir araya toplamasıdır.
Stemming algoritmalarının benimsediği kaba sezgisel yaklaşım genellikle hızlı ve verimlidir, ancak her zaman doğru değildir. Buna karşılık lemmalaştırma algoritmaları hız ve verimlilikten ödün vererek doğruluğu artırır ve böylece anlamlı temel kökler elde edilir.
Örneğin, bir stemming algoritması “saw” kelimesini “s.”ye indirebilir. Bir lemmalaştırma algoritması ise “saw”ın kullanıldığı bağlama göre isim (kesmeye yarayan el testeresi) mi yoksa fiil (to see) mi olduğunu dikkate alarak lemma döndürmeye karar verir — eğer isimse “saw”, fiilse “see” döner.
Bu noktalar artık size oldukça net gelmiş olabilir, o hâlde işte milyon dolarlık soru — “metin ön işleme için stemming mi, lemmalaştırma mı kullanmalıyım?”
Çoğu yazılım işi gibi; duruma bağlıdır.
Hız ve verimlilik sizin için önemli mi? Öyleyse stemming’i seçin.
Uygulamanız için bağlam önemli mi? “Evet” dediyseniz lemmalaştırma kullanın.
Hangi tekniği kullanacağınız tamamen üzerinde çalıştığınız uygulamaya ve proje hedeflerinize bağlıdır. Her iki teknikle de deneyler yapıp sonuçları karşılaştırarak, proje hedeflerinizle en çok örtüşen yaklaşımın hangisi olduğunu görebilirsiniz.
Bu eğitimde pek değinmediğimiz bir nokta, lemmalaştırma algoritmalarının nasıl oluşturulduğudur; bunun nedeni, farklı dillerle uyumlu (SpaCy, NLTK vb. gibi) çeşitli kütüphanelerin bulunmasıdır. Ancak, kullanılabilir olmayan bir dil (ör. Akan) için kendi lemmalaştırıcınızı oluşturmanız gerekseydi, bir lemmalaştırıcı inşa etmek için hedef dili iyi derecede bilmeniz ve anlamanız gerekirdi. Böyle senaryolarda stemming algoritmalarını oluşturmak çok daha kolaydır.
| Stemming | Lemmatization | |
|---|---|---|
| Hız | Hızlı | Yavaş |
| Doğruluk | Daha düşük | Daha yüksek |
| Çıktı | Gerçek bir kelime olmayabilir | Her zaman gerçek bir kelime |
| Bağlam kullanır mı? | Hayır | Evet |
| En uygun alanlar | Arama motorları, spam filtreleri | Chatbot'lar, duygu analizi, SSS |
Sonuç
Özetle, stemming ve lemmalaştırma, NLP’de metin işleme için kullanılan tekniklerdir. Her ikisi de çekimleri ortak temel kök kelimelere indirmeyi amaçlar, ancak bunu yaparken farklı yaklaşımlar benimser.
Lemmalaştırma, stemming’e kıyasla çok daha doğrudur. Her zaman gerçek sözlük kelimeleri döndürür ve bağlamı dikkate alır. Çoğu modern NLP hattında, doğruluğun önemli olduğu durumlarda lemmalaştırma tercih edilir. Ancak, ölçekli çalışıyor veya hızlı bir prototip geliştiriyorsanız, stemming yeterince iyi olabilir ve oldukça daha hızlıdır.

SSS
NLTK'nın stemmer ve lemmatizer'ını kullanmak için ekstra bir şey indirmem gerekiyor mu?
Porter Stemmer için NLTK'yı kurmanın dışında ekstra bir indirme gerekmez. WordNet Lemmatizer için, kullanmadan önce bir kez nltk.download("wordnet") ve nltk.download("omw-1.4") çalıştırmanız gerekir. Tokenleştirme için ayrıca NLTK 3.9+ sürümünde nltk.download("punkt_tab") gerekir.
Lemmatizer neden girdiğim kelimeyi değiştirmeden aynen geri döndürüyor?
Bu genellikle iki şeyden birini ifade eder: ya kelime WordNet sözlüğünde bulunmamıştır ya da doğru pos (sözcük türü) parametresini belirtmemişsinizdir. Örneğin, varsayılan olarak wnl.lemmatize("running") bir ismi varsaydığı için "running" döner. Bunu fiil olarak ele almak ve "run" sonucunu almak için pos="v" geçin.
Arama motorları için stemming mi yoksa lemmalaştırma mı daha iyidir?
Genellikle arama motorları için stemming tercih edilir; çünkü bu ölçekte hız, kusursuz doğruluktan daha önemlidir. Bir kullanıcı "running shoes" aradığında, "run", "runner" ve "runs" sonuçlarının hızlıca dönmesini istersiniz. Ara sıra sözlükte olmayan bir kök deneyimi çok etkilemez. Çoğu arama kullanım durumu için lemmalaştırma gereğinden fazladır.
Bu teknikleri İngilizce dışındaki dillerle kullanabilir miyim?
Evet, ancak zorluk derecesi değişir. NLTK'nın kutudan çıktığı hâliyle diğer dillere sınırlı desteği vardır. Daha geniş çok dilli destek için spaCy veya Stanza gibi kütüphaneler daha iyi seçeneklerdir — özellikle spaCy'nin Almanca, Fransızca, İspanyolca, Portekizce ve daha birçok dil için güçlü lemmalaştırma desteği vardır. Düşük kaynaklı bir dil (Akan gibi) için kendi stemmer veya lemmalaştırıcınızı oluşturmak, o dilin biçimbilgisini derinlemesine bilmeyi gerektirir.
Lemmalaştırma, NLP modeli sonuçlarında her zaman stemming'den daha iyi midir?
Gerekli değil. Görevinize ve veri kümenize bağlıdır. Kesin kelime anlamının önemli olduğu görevlerde — soru cevaplama, duygu analizi veya chatbot'lar gibi — lemmalaştırma genellikle daha iyi performans verir. Belge sınıflandırma veya anahtar kelime çıkarımı gibi daha basit görevlerdeyse, stemming çoğu zaman çok daha düşük işlem maliyetiyle aynı derecede iyi sonuçlar üretir. En güvenli yaklaşım, ikisini de test edip kendi veriniz üzerinde sonuçları karşılaştırmaktır.

Modern İngilizce zayıf çekimli bir dil olarak kabul edilir. Bu, İngilizcede başka bir kelimeden türetilmiş çok sayıda kelime olduğu anlamına gelir; örneğin, çekimli "normality" kelimesi, kök biçim olan "norm" kelimesinden türetilmiştir. Tüm çekimli diller ortak kök biçimlere sahip kelimelerden oluşur, ancak çekim derecesi dile göre değişir.
Metinlerle çalışırken, bazen kelimeleri türetilmiş hallerinden kök biçimlerine döndürmek için normalleştirme tekniklerini uygulamak gerekir. Bu, rastgeleliği azaltmaya ve derlemdeki kelimeleri önceden tanımlanmış standarda yaklaştırmaya yardımcı olur; bilgisayarın işlemeye çalıştığı özellik sayısı azaldığı için işleme verimliliğini artırır.
Doğal Dil İşleme (NLP) alanındaki en popüler metin normalleştirme tekniklerinden ikisi kök bulma (stemming) ve lemmalaştırmadır.
Araştırmacılar bu teknikleri yıllardır inceliyor; NLP uygulayıcıları da genellikle kelimeleri, metinleri ve belgeleri çok sayıda görevde daha ileri işlemeye hazırlamak için bunları kullanır.
Bu eğitimde, Python Natural Language ToolKit (NLTK) paketini kullanarak kök bulma ve lemmalaştırmayı pratik açıdan ele alacağız.
Bu eğitimdeki tüm kodların genel görünümü için bu DataLab çalışma kitabına göz atın. Kodu düzenlemek ve çalıştırmak için çalışma kitabının bir kopyasını oluşturun.
Stemming Nedir?
Stemming, çekimli bir kelimeyi kelime köküne indirgemek için kullanılan bir tekniktir. Örneğin, "programming", "programmer" ve "programs" kelimelerinin tümü ortak kök olan "program"a indirgenebilir. Başka bir deyişle, "program" önceki üç çekimli kelime için eşanlamlı olarak kullanılabilir.
Bu metin işleme tekniğini uygulamak, seyrekliğin giderilmesi ve/veya kelime dağarcığının standartlaştırılması için sıklıkla yararlıdır. Yalnızca gereksizliği azaltmaya yardımcı olmakla kalmaz (çoğu zaman kök kelime ve çekimli halleri aynı anlama gelir), aynı zamanda NLP modellerinin çekimli kelimeler ile kökleri arasındaki bağlantıları öğrenmesini sağlar; bu da modelin benzer bağlamlardaki kullanımlarını anlamasına yardımcı olur.
Stemming algoritmaları, çekimli kelimelerde bulunan sık önek ve soneklerin bir listesini alarak kelimenin sonunu veya başını keserek çalışır. Bu, zaman zaman gerçek bir kelime olmayan köklerin ortaya çıkmasıyla sonuçlanabilir — aşağıda ele alacağımız bir sınırlama.
Stemming'in avantajları
Stemming'in dezavantajları
Lemmatization Nedir?
Lemmalaştırma, çekimli kelimeleri kök kelimelerine indirgemek için kullanılan bir başka tekniktir. Bir çekimli kelimenin, amaçlanan anlamına göre sözlükteki biçimi olan "lemma"sını algoritmik olarak belirleme sürecini tanımlar.
Stemming'in aksine, lemmalaştırma bir kelimenin amaçlanan sözcük türünü (POS) ve anlamını bağlama göre doğru biçimde belirlemeye dayanır. Bu, çekimli kelimenin bir cümle içinde nerede yer aldığını ve o cümleyi çevreleyen daha geniş bağlamı — komşu cümleler veya hatta tüm bir belge gibi — dikkate aldığı anlamına gelir.