Python ile Basİt Türkçe Semtİment Analİzİ

Sentiment analizi, doğal dil işleme kullanılarak bir veri setinden kişilerin görüşlerini elde etmek için kullanılan bir yöntemdir. Genel veya daha detaylı analizler yapılabilir. Bu yazıda İngilizce restoran yorumları için sentiment analiz yapan bir kılavuzu1 takip ederek COVID-19 dönemindeki Türkçe haber akışını olumluluk/olumsuzluk anlamında değerlendirebilecek bir kodu nasıl yazabileceğimizden bahsedceğim.

Türkçe NLP aracı olarak Java ile yazılmış olan Zemberek2 aracını kullandım. Python kodunda jar kütüphanesini kullanabilmek için Jpype3 aracından faydalandım.

Öncelikle girilen metni cümlelerine tokenize ediyoruz, Zemberek aracından zemberek.tokenization.TurkishTokenizer classından faydalanarak:

tokenized_sentences = [self.turkishTokenizer.tokenizeToStrings(sentence) for sentence in sentences]

[['Bu', 'bir', 'cümle'], ['Bu', 'da', 'diğeri']]

Kelimeleri ayırdıktan sonra tokenlarımızı hazırlayabiliriz. Bu örnekte her token 3 elemandan oluşacak:

  • Kelimenin cümlede kullanıldığı hali
  • Kelimenin sözlük hali (lemma)
  • Etiketler (POS etiketleri) Bunun için zemberek.morphology.TurkishMorphology classından faydalanabiliriz. Örnek bir çıktı aşağıdaki gibi:
[
('Yeni', 'yeni', ['Adj']), 
('formülle', 'formül', ['Noun']), 
('müzakere', 'müzakere', ['Noun']), 
('yoluyla', 'yol', ['Noun']), 
('pide', 'pide', ['Noun']), 
('fiyatlarını', 'fiyat', ['Noun']), 
('%50', '%50', ['Num']), 
('ucuzlatmış', 'ucuzla', ['Verb'])
], 
[
('#SONDAKİKA', '?sondakika', ['Noun']), 
('|', 'UNK', ['Unk']), ('26', '26', ['Num']), 
('Nisan', 'nisa', ['Noun']), 
('Türkiye', 'türkiye', ['Noun']), 
('Koronavirüs', 'UNK', ['Unk']), 
('verileriVaka', 'UNK', ['Unk']), 
('sayısı', 'sayı', ['Noun']), 
('2357', '2357', ['Num']), 
('artarak', 'art', ['Adv']), 
('yüz', 'yüz', ['Num']), 
('on', 'on', ['Num']), 
('bin', 'bin', ['Num']), 
('130', '130', ['Num']), 
('oldu', 'ol', ['Verb'])
], 
[('Can', 'can', ['Noun']), 
('kaybı', 'kayıp', ['Noun']), 
('99', '99', ['Num']), 
('artarak', 'art', ['Adv']), 
('iki', 'iki', ['Num']), 
('bin', 'bin', ['Num']), 
('805', '805', ['Num']), 
('oldu', 'ol', ['Verb'])
]

Ardından olumlu veya olumsuz ifadelere karar vermek için basit sözlükler ekliyoruz. negative.yml

kayıp: [negative]
ölüm: [negative]
yasak: [negative]
hastalık: [negative]
virüs: [negative]
vaka: [negative]

positive.yml

mutluluk: [positive]
tedavi: [positive]
özgür: [positive]
kurtuldu: [positive]

Bu sözlüklere göre etiket ekliyoruz, örnek sonuçlar:

('ölüm', 'ölüm', ['negative', 'Noun'])
('vakalar', 'vaka', ['negative', 'Noun'])

Bu noktadan sonra sözlükleri geliştirerek daha kapsamlı bir rapor hazırlamak mümkün. Basitçe negatif ve pozitif etiketleri toplayarak ağırlığın ne tarafta olduğu belirlenebilir. Uyguladığım örnek kodu şurada4 bulabilirsiniz.