Duygu Analizi ve Fikir Madenciliği — 3 ( Sentiment Analysis/Opinion Mining)/Stemming and Lemmitization

Arda Batuhan Demir
5 min readJan 5, 2020

--

Selamlar Herkese,

Duygu Analizi ve Fikir Madenciliği kapsamında serinin 3.ncü yazısı ile birlikte bugün bir parça daha Sentiment Analysis/Opinion Mining’de ‘Veri Normalizasyonu’nu ele almaya çalışacağız…Hatırlayacağınız üzere,ilk yazı da bir parça daha Sentiment Analysis’in ne olduğundan ve kullanım alanlarından bahsedip demo bir kod bloğu üzerinden bir örnek ile anlatmaya çalışmıştık,ikinci yazıda ise Doğal Dil İşleme ve PİP komutlarından bahsedip ilgili verilerin belirlenmesi ve elimizdeki verilerin tokenized edilmesinden bahsetmiştik…Bugün yine demo kod blokları ile çalışıp bunları anlamlandırmaya çalışacağız

Üçüncü Adım:Veri Normalizasyonu(Normalizing the Data)

Günlük hayatta kullandığımız sözcükler, farklı biçimlere ve farklı formlara sahiptir.İngilizce’den bir örnek vermek gerekirse:

“ran”,”runs”,”running” — — “koştu”,”koşar” ve “koşma” gibi koşma fiilinin aynı çeşitli biçimlerine sahiptir.Analizin gereksimine bağlı olarak, bu sürümlerin hepsinin aynı “run” biçimine dönüştürülmesi gerekebilir.Doğal Dil İşleme’de(NLP) normalleştirme, bir sözcüğü kurallı biçimine dönüştürme işlemidir.

Normalleştirme, kelimeleri aynı anlama gelen ancak farklı biçimlerde gruplandırmaya yardımcı olur.Normalleştirme olmadan “koştu,”koşar”,”koşuyor” aynı kelime olarak muamele görmelerini isteseniz bile, farklı kelimeler olarak ele alınacaktır.Bu bölümde, iki popüler normalleştirme tekniği olan “Stemming and “Lemmatization” tekniklerini keşfediyor olacağız.

Stem aslında ingilizcedeki kelime anlamıyla beraber, kök veya sap anlamına gelmekte…Stemming ise bir kelimeden eklerin kaldırılması işlemidir.Sadece basit fiil formları ile çalışan saplama, kelimelerin sonlarını kaldıran sezgisel bir süreçtir.

Metin işleme süreçleriyle uğraşırken örnek verebilmek gerekirse basit bir arama yaptığımızda kelimenin ekli halinden daha çok kök haliyle ilgileniyoruz

Kelimenin köküne erişebilmek için; genel olarak iki yöntemden yukarıda bahsetmiştim ve bir parça daha detaya inmemiz gerektiğini düşünüyorum: “Stemming and Lemmatization”…

Her iki işleminde aslına bakarsanız amacı aynıdır, her kelimeyi eklerinden arındırıp ortak bir temel ya da köke dönüştürmektir.Ancak bu iki yöntem tam olarak aynı değildir.Bu yüzden temel farklarından biraz bahsetmemiz gerekir…

Hem stemming hem de lemmatization, genellikle veri ön işleme(data pre-processing) adımlarından birisidir…Aralarındaki asıl fark ise; çalışma şekli ve dolayısıyla her birinin döndürdüğü sonuçtur.

Stemming Algoritmaları, ekli bir kelimede bulunabilen ortak ön eklerin ve son eklerin bir listesini dikkate alarak kelimenin başlangıcını veya sonunu kesmeye çalışır.Bu ayrım gözetmeksizin kesim, bazı durumlarda başarılı olabilir, ancak her zaman değil, bu yüzden bu yaklaşım bazı sınırlandırmalar getirmektedir…Yine ingillizce’den bir örnek verebilmek gerekirse:

Stemming’in Dezavantajları

Stemming, mükemmeliyetçilik olmaktan uzaktır.Temel olarak iki sorunla karşı karşıyadır: aşırı sıkılama ve eksik sıkılama

Aşırı Sıkılama, bir kelime çok fazla kırpıldığında ortaya çıkan bir durumdur.Bu durum,kelimenin bütün anlamlarının kaybolduğu veya karıştığı stem’lere neden olabilir veya kelimenin muhtemelen aynı stem’lere sahip olmamasına rağmen aynı stem’lere sahipmiş gibi çözümlenmesiyle sonuçlanabilir.

Eksik sıkılama ise, tam tersi bir duruma sahiptir.Birbirlerinin biçimleri şeklinde olan bir kaç keilme söz konusu olduğunda ortaya çıkmaktadır.

(Stemming Algoritmaları için 3 temel örnek bulunmakta; Porter Stammer,Snowball Stemmer ve Lancaster Stemmer…Geniş kapsamlı bir yazıda daha detaylı ele alınabilir…)

Çalışma biçimlilikleri

Stemming: Stemming sürecinde kullanılabilecek bir çok algotirmalardan yukarıda sözünü geçmiştik,İngilizce’de en yaygın olanı Porter Stammer’dır…Bu algoritmada ise yer alan kurallar 1 ile 5 arasında numaralandırılmış beş farklı aşamaya bölünmüştür.Bu kuralların genel amacı ise kelimeleri köküne kadar azaltabilmektir.

Lemmatization: Bu metodolojinin anahtarı dilbilimidir.Doğru lemma’yı açığa çıkarmak için her kelimenin morfolojik analizine bakmak gerekir.Bu, böyle bir analiz sağlanacak her dil için sözlüklere sahip olunması gerektiğini ele alır.

Sonuç olarak, Stemming ve Lemmatization karşılaştırılması sonuçta hız ve doğruluk arasında bir değişime yol açar.

Lemmatization’ı kullanmaya başlamadan önce Python ile aşağıdaki kaynakları local’imize indirmemiz gerekebilir(Ben yine Jupyter Notebook ile kullanmaya devam edeceğim..) :

>> import nltk>> nltk.download(‘wordnet’)>>nltk.download(‘averaged_perceptron_tagger’)

Yukarıdaki 3 satırı koşturduğumuzda sonuç bize boolean bir değer dönecektir.

wordnet”, betimin temel kelimeyi belirlemesine yardımcı olan bir ingilizce dili için kullanılan veritabanıdır.Bir cümledeki bir kelimenin içeriğini belirleyebilmek için “averaged_perceptron_tagger” kaynağına ihtiyacımız vardır.

Bir kez indirildikten sonra, lemmatizörü kullanmaya neredeyse hazırsınız. Bir lemmatizer çalıştırmadan önce, metninizdeki her kelimenin bağlamını belirlemeniz gerekir. Bu, bir kelimenin bir cümledeki göreli konumunu değerlendiren bir etiketleme algoritması ile elde edilir.

Python’da pos_tag işlevini içe aktarıp, etiketleri almak için bağımsız değişken olarak bir tokens listesi sağlayalım ve bunu Python üzerinde deneyelim:

from nltk.tag import pos_tagfrom nltk.corpus import twitter_samplestweet_tokens = twitter_samples.tokenized(‘positive_tweets.json’)print(pos_tag(tweet_tokens[0]))

Etiketler listesinden, en yaygın öğelerin listesi ve anlamlarına bir göz atalım :

  • NNP: Noun, proper, singular
  • NN: Noun, common, singular or mass
  • IN: Preposition or conjunction, subordinating
  • VBG: Verb, gerund or present participle
  • VBN: Verb, past participle

Buradan veritabanı’nın full listesine göz atabilirsiniz : https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html

Genel olarak, bir etiket ‘NN’ ile başlıyorsa sözcük bir ismidir ve ‘VB’ ile başlıyorsa sözcük bir fiildir.Etiketleri inceledikten sonra exit() ile Python oturumundan çıkabiliriz.

Bunu bir cümleyi normalleştiren bir işleve dahil etmek için, önce metindeki her belirteç için etiketleri oluşturmalı ve ardından etiketi kullanarak her sözcüğü lemmatize etmelisiniz.

Elimizde bulunan lemmatization yaptığımız kod bloğumuzu Python’da çalıştıralım :

from nltk.tag import pos_tag
from nltk.stem.wordnet import WordNetLemmatizer

def lemmatize_sentence(tokens):
lemmatizer = WordNetLemmatizer()
lemmatized_sentence = []
for word, tag in pos_tag(tokens):
if tag.startswith('NN'):
pos = 'n'
elif tag.startswith('VB'):
pos = 'v'
else:
pos = 'a'
lemmatized_sentence.append(lemmatizer.lemmatize(word, pos))
return lemmatized_sentence

print(lemmatize_sentence(tweet_tokens[0]))

Sonuç aşağıdaki gibi beklenmektedir:

Kodu bir parça analiz etmek gerekirse; WordNetLemmatizer sınıfını içeri aktaran bir değişen, lemmatizer’ı başlatır.

Lemmatize_sentence işlevi ilk olarak bir tweet’in her belirtecinin konum etiketini alır.If statement’da,eğer etiket NN ile başlarsa belirteç bir isim olarak atanır.Benzer şekilde,etiket VB ile başlarsa, belirteç bir ‘fiil’ olarak atanır.

Bu fiilin kök biçiminde değiştiğini, isim üyelerinin isim değiştirdiğini göreceksiniz. Devam etmeden önce, koddan örnek tweet yazdıran son satırı yorumlayın.

Artık kelimelerimizi normalleştirmek için bir işlevi başarılyla oluşturduğunuza göre, noise-data processing (gürültülü verileri kaldırma) için ilerlemeye hazırsınız demektir.

Bir sonraki yazımda Gürültülü verileri silme işlemlerinden daha da detaylı bir biçimde bahsediyor olacağım….

Takipte Kalın

Arda Batuhan Demir

--

--

Arda Batuhan Demir
Arda Batuhan Demir

Written by Arda Batuhan Demir

5x AWS Cert* | Senior DevOps Engineer | Cloud Architect | AWS Community Builder

Responses (1)