Duygu Analizi Çalışması

Bu süreç boyunca elde bulunan eğitim kümesi nden veri ambarı tasarımı yapılması hedeflenir. Kelime bazlı frekans hesabı yapılır, kelime kümesi seçilir, seçilen küme ayrı bir tabloda saklanır ve kaynak olarak kullanılır. Veri ambarı söz konusu 2 tablo yardımıyla meydana getirilir ve süreç sonucunda artık veri algoritma girdisi olarak hazır hale gelmiş olur.

Kelime Bazlı Frekans Hesabının Yapılması

Duygu ağırlığı olan kelimeler seçme aşamasına ulaşabilmek için eğitim kümemizde bulunan girdilerin içeriklerindeki her bir kelimenin frekans hesabının yapılması gerekir. Bu frekans hesabı sonunda elde edilen yeni veri tabanı tablosundan kelimeler seçerek veri ambarı tasarlanır.

Bu adımı gerçekleştirmek üzere bir frekans tablosu yaratılır ve bu tabloya PHP çatımız yardımıyla oluşturulan fonksiyonlar sayesinde kelimeler eklenir. Fonksiyon her bir girdi metnini alıp boşluklara göre kelimelere böler, girdinin her bir kelimesini frekans tablosunda arar, varsa sayısını güncelleyerek bir arttırır yoksa tabloya ekleyerek bir sonraki kelimeye geçer. Kelime seçimi yaparken karar verme açısından yardımcı olsun diye her bir kelime için hangi analizde kaç tane geçtiği bilgisi de tutulur. Bu işlevler yönetim paneline kazandırılır.

CREATE TABLE `words_frequency` ( `id` int(11) NOT NULL, `word` varchar(50) NOT NULL, `count` int(11) NOT NULL DEFAULT '0', `count_n` int(11) NOT NULL DEFAULT '0', `count_h` int(11) NOT NULL DEFAULT '0', `count_u` int(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; public function update_frequencies() { $data['chosen_entries'] = $this->Entry_Model->get_chosen_entries(); foreach ($data['chosen_entries'] as $row){ $entry_words = explode(' ', $row->content_text); $entry_words = array_unique($entry_words); foreach ($entry_words as $word) { if($this->Word_Model->is_adready_inserted($word)) $this->Word_Model->count_up_word_f($word, $row->analysis); else $this->Word_Model->insert_word_f($word, $row->analysis); } } redirect(''); }
ID WORD COUNT COUNT_N COUNT_H COUNT_U
78 adam 830 406 207 217
236 iyi 689 342 178 169
1341 lan 662 300 209 153
1196 son 572 305 134 133
620 insan 555 252 131 172
175 guzel 537 264 166 107
2056 yeni 340 169 94 77
518 para 332 162 64 106

Çizelge: Frekans tablosundaki bazı kayıtlar.

Bu çalışmada 8 çekirdekli bir bilgisayarda saatlerce frekans hesabı yapıldıktan sonra frekans tablosunda yaklaşık 100.000 kelime yer almış ve bunların arasından yaklaşık 63.000’i sadece bir kez geçmiş olduğu saptanmıştır.

Duygu Ağırlıklı Kelimelerin Seçimi

Veri ambarı tasarımı hedefine adım adım yaklaşırken duygu ağırlıklı kelimeleri seçmek için bir kaynak oluşturuldu. Bu kaynaktan yararlanarak kelimeler seçilir ve yeni bir seçilmiş kelime tablosu oluşturulur.

Frekans tablosu “COUNT” kolonunun değeriyle büyükten küçüğe doğru sıralanır ve Mysql Workbench yardımıyla Excel CSV dosyası olarak çıktı alınır. Alınan bu çıktı içerisindeki kelimelerden, araştırmacı ve sözlüğü kullanan kişilerden oluşan bir takım mutlu veya mutsuz gibi polar ağırlıkları olan kelimeleri tartışarak seçerler. Bu kelimeler çok sayıda girdi içerisinde geçen kelimeler, sayısı baskın olmasa da keskin bir şekilde duyguyu hissettiren kelimeler ve eğitim kümesinde kendini ifade etme şansı bulamamış, kullanımı sonucunda duygu ağırlığını ciddi şekilde etkileyen kelimeler olabilirler. Seçimi tamamlanmış kelimeler seçilen kelime tablosuna aktarılırlar.

Bu çalışmada bu şekilde yaklaşık 200 kelime seçilmiştir. Seçimlere karar verirken daha önce bu konuda çalışmalara imza atmış olan proje danışmanının yardımlarından yararlanılmıştır.

WORD CNT WORD CNT WORD CNT WORD CNT
bile 1005 dedim 188 chp 106 dibine 36
ya 907 arasinda 187 takip 105 orgut 34
iyi 689 turkiyede 185 ilan 103 tecavuze 33
zaten 669 SMILEEMOTICON 175 arkadasim 101 kuran 33
lan 662 amina 174 kan 99 vicdan 30
insan 555 bizi 172 hava 99 muhalefet 29
guzel 537 gol 168 nefret 99 fiziksel 28
artik 535 calisan 167 adamlarin 98 polise 27
ilk 526 cevap 162 saygi 97 mutsuz 27
oyle 488 bok 160 aciklama 96 patlama 25
neden 412 el 160 galatasaray 96 pislik 24
bunun 402 sozluk 160 besiktas 95 bozuk 24
olsa 387 maci 152 teror 94 suriyeli 24
fazla 376 yoktur 152 sikeyim 79 gencecik 24
insanlar 359 kendisine 146 adalet 79 osmanli 24
beni 342 hak 145 anasini 78 islami 23
yeni 340 cocugu 145 islam 78 muslumanlar 21
kisi 337 sabah 141 sozlukte 77 nobel 21
hicbir 337 orospu 141 canim 77 irkci 20
ulan 336 gelecek 140 terorist 76 yasta 20
para 332 entry 140 aci 75 kizla 18
burada 325 cikip 138 tecavuz 74 pezevenk 18
eden 303 kendine 136 efendim 74 polisler 18
an 302 futbol 135 pkk 73 bal 18
olmayan 302 kardesim 134 film 73 vur 18
sizin 289 bunlarin 134 sehit 67 sabir 17
tarafindan 271 insanlari 132 futbolcu 66 karanlik 17
kotu 260 parti 132 soguk 64 kahkaha 17
allah 254 a 129 bomba 64 sikik 16
ulkede 253 milli 128 isid 63 gotunuze 16
gerek 250 yalniz 128 sicak 62 saniyorsunuz 16
adamlar 249 baslik 127 dizi 61 bombayi 15
oy 247 kendimi 127 sampiyon 57 burs 15
tabi 244 sacma 127 SADEMOTICON 51 cocukluk 14
olabilir 238 yazik 125 euro 48 multeci 14
yaptigi 237 ciddi 124 cay 46 hmm 14
onemli 237 evde 123 sert 45 dondurma 14
cocuk 235 polis 120 katil 45 cocugunun 14
bence 234 mutlu 119 genis 45 siddetli 13
akp 234 yahu 116 birinci 44 irkcilik 12
diyor 230 mal 116 saldiri 44 icmeye 11
hemen 229 eksi 113 lanet 43 jest 11
mesela 214 gordum 110 tatli 41 hastane 11
ulkenin 210 hdp 110 siddet 39 polisten 10
insanlarin 209 ev 110 serefsiz 38 yerim 10
kiz 205 takimi 109 evin 37 yaratiklar 9
sanirim 196 oglum 108 hirsiz 36 mina 8
devlet 196 kadinin 107 ataturk 36 iftira 7
takim 195 devletin 107 aksine 36 dumur 7
ulke 194 fenerbahce 107

Çizelge: Duygu ağırlığı olan seçilmiş sözcükler.

Veri Ambarının Dinamik Olarak İnşa Edilmesi

Veri madenciliği algoritmalarının girdisi olarak kabul ettiğimiz veri matrisinin oluşturulması için atılan adımlar tamamlandığında veri tabanı tablosu bu kez farklı bir biçimde tasarlanır. Adım adım oluşturulan süreçlerin işaret ettiği tablodur veri ambarı. Her bir satırı bir girdiyi temsil eder ve her bir sütunu seçilmiş olan kelimelerden meydana gelir. Girdi içerisinde geçen kelimeler ilgili sütunda 1 değerini alırken içermeyenler 0 değerlerini alırlar. Kelime sütunlarının sonunda girdinin analizini tutan kolon bulunur.

ID ENTRY_ID WORD_23

WORD_63741 ANALYSIS
1 2 1

0 n
2 5 1 0 h
3 8 0 0 u

Çizelge: Veri ambarı tablosunun yapısı.

Yönetim panelinin duygu analizi sürecindeki fonksiyonlardan sonuncusu olan veri ambarının oluşturulması birkaç adımdan oluşur. İlk olarak tablo yapısına seçilen kelimelerin benzersiz sütunları “WORD_” kelimesinin sonuna bir alttan tire sonrasında eklenerek kolonlar oluşturulur. Böylece veri ambarının genişliği dinamik olarak kurulmuş olur. Sonrasında her bir girdi tekrar kelimelerine ayrıştırılıp, sırasıyla her girdi kelimesi seçilen kelime tablosundaki bütün kelimeler ile karşılaştırılır. Eğer eşleşme gerçekleşirse girdi veri ambarına ilgili kelime için 1 değerini alarak kaydedilir.

Duygu analizi sırasında projenin planladığı bir diğer başarım metodu ise veri ambarını 3 farklı biçimde tasarlamaktır. Bu tasarım sayesinde veriler 2 boyutlu olarak duygu analizinden geçebileceklerdir. 1. boyutta girdiler nötr yada polar,

  1. boyutta ise mutlu yada mutsuz olarak işaretlenebilir hale geleceklerdir. Bunu gerçekleştirmek için yönetim paneline seçenek eklenir.
CREATE TABLE `words` ( `id` int(11) NOT NULL, `entry_id` int(11) NOT NULL, `length` bigint(20) NOT NULL, `analysis` varchar(1) DEFAULT 'n' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
public function build()
{
    $fields = array();
    $results = array();

    $data['chosen_words'] = $this->Word_Model->get_chosen_words();
    foreach ($data['chosen_words']  as $row)
        $results[] = array( 'id' => $row->id );

    foreach ($results as $value)
        $fields[ 'word_'.$value['id'] ] = array('type' => 'INT', 'constraint' => 1, 'default' => 0);

    if($this->Word_Model->add_column_to_cws($fields))
        redirect('');
}
public function drop_columns()
{
$results = array();

    $data['chosen_words'] = $this->Word_Model->get_chosen_words();
    foreach ($data['chosen_words']  as $row)
        $results[] = array( 'id' => $row->id );

    foreach ($results as $value)
        $this->Word_Model->drop_column_from_cws( 'word_'.$value['id'] );

    redirect('');
}
function truncate()
{
if($this->Word_Model->truncate_table())
redirect('');
}
public function update()
{
$result = $this->Word_Model->get_chosen_words();
$this->Entry_Model->update_whole_table($result);

    redirect('');
}

public function clear()
{
$this->Entry_Model->clear_notr_entries();
redirect('');
}
public function clear_weaks()
{
$data['chosen_words'] = $this->Word_Model->get_chosen_words();
foreach ($data['chosen_words']  as $row)
$results[] = array( 'id' => $row->id );
$data['words'] = $this->Word_Model->get_words();
foreach ($data['words'] as $row)
if( $this->Entry_Model->clear_weak_entry($row->id, $results) )
$this->Entry_Model->delete_word_by_id($row->id);

    redirect('');
}

Yukarıdaki şekildeki aşamalardan geçerek oluşan veri ambarı artık veri madenciliği işlemine hazırdır. Projede karar kılınan veri ambarı yapısı aşağıdaki çizelgede gösterilen testler sonucunda yaklaşık 200 seçilmiş kelime kolonundan oluşan ve içerisinde en az 3 seçilmiş kelime geçen girdilerden meydana gelir. Bu bağlamda uygulama kolaylığı ve verdiği başarı göz önüne alınarak SMO algoritması veri madenciliği yöntemi olarak seçilmiştir.

Veri Madenciliği Aşaması

Bütün olarak sürecin son adımı olan bu adımda veri madenciliği uygulamaları test edilerek oluşturulan veri ambarından amacına uygun, en verimli olanını seçmek hedeflenir. Bu seçim 2 boyutta oluşturulan verilerin başarı oranlarıyla yapılır. Birinci boyutta verinin polaritesine göre, ikinci boyutta ise verinin duygu türüne göre ölçümler yapılır. SMO fonksiyonel algoritmasıyla gerçekleştirilen WEKA çalışması.

Veri ambarı Workbench yardımı ile CSV formatında dışa aktarılır. WEKA’nın Explorer penceresinden dışa aktardığımız dosya seçilir ve ilk iki sütun bir karara etkisi olmadığı için devre dışı bırakılır. Sınıflandırma sekmesinden bir algoritma seçilir ve Cross-Validation seçeneği ile sonuç elde edilir. Bu yöntem veriyi yanındaki kutuda belirtilen yüzdeye göre bölerek her defasında farklı bir parçasından olmak üzere test ederek sonuç ürettiği için daha verimli sonuçlar elde edilebilir.

ALG.YÖNTEMN H UN PH U
NaiveBayes100 Kelime (6323)46.0699 %54.2464 %62.4927 %
‘’ Min 3 kel. içeren(2309)48.246  %56.9511 %68.9984 %
150 Kelime (6323)45.0894 %55.9545 %62.9597 %
‘’ Min 3 kel. içeren(3043)48.4719 %59.4151 %68.6732 %
200 Kelime (6323)45.3582 %56.0177 %63.1349 %
‘’ Min 3 kel.içeren(3239)48.3483 %58.9071 %68.8005 %
SMO100 Kelime (6323)47.6198 %55.6856 %63.8646 %
‘’ Min 3 kel. içeren(2309)49.5453 %56.9078 %68.9984 %
150 Kelime (6323)48.1575 %57.789  %65.2948 %
‘’ Min 3 kel. içeren(3043)50.838  %58.6592 %68.1204 %
200 Kelime (6323)48.6636 %57.9155 %65.5867 %
‘’ Min 3 kel.içeren(3239)51.59   %58.2587 %69.6078 %
lazyIBk100 Kelime (6323)44.0614 %52.5384 %58.9901 %
‘’ Min 3 kel. içeren(2309)41.1    %51.3209 %56.8362 %
150 Kelime (6323)43.9348 %53.3449 %58.7274 %
‘’ Min 3 kel. içeren(3043)43.2468 %51.6595 %58.3538 %
200 Kelime (6323)44.4251 %53.3133 %58.202  %
‘’ Min 3 kel.içeren(3239)43.5011 %51.0034 %58.5352 %
J48100 Kelime (6323)44.346  %54.6734 %61.7046 %
‘’ Min 3 kel. içeren(2309)41.0134 %52.9233 %61.3672 %
150 Kelime (6323)44.2828 %55.3693 %61.9089 %
‘’ Min 3 kel. içeren(3043)43.1811 %55.2744 %61.4251 %
200 Kelime (6323)44.0297 %55.5907 %60.3327 %
‘’ Min 3 kel.içeren(3239)44.3347 %55.2331 %60.6113 %
Random Forest100 Kelime (6323)44.346  %54.3413 %62.4051 %
‘’ Min 3 kel. içeren(2309)47.2066 %56.2148 %67.0906 %
150 Kelime (6323)45.121  %55.907  %62.843  %
‘’ Min 3 kel. içeren(3043)47.6503 %57.3447 %66.0934 %
200 Kelime (6323)46.1964 %56.8559 %63.7186 %
‘’ Min 3 kel.içeren(3239)49.3053 %57.3016 %68.3391 %
SimpleCart100 Kelime (6323)46.9872 %55.5274 %60.7706 %
‘’ Min 3 kel. içeren(2309)46.9034 %55.6951 %62.8776 %
150 Kelime (6323)47.0505 %56.6661 %60.7414 %
‘’ Min 3 kel. içeren(3043)47.5846 %57.0818 %61.3022 %
200 Kelime (6323)47.0346 %56.761  %61.0625 %
‘’ Min 3 kel.içeren(3239)47.5764 %57.0238 %61.4764 %

Çizelge: Sınıflandırma algoritmalarının WEKA’da veri ambarı başarım tablosu.

Bu projede yapılan testler sonucunda karşılaştırmalar ve fikir yürütmeler yapılmış, SMO algoritması seçilmiştir. Böylece veri madenciliği çalışması burada sona ermiş ve artık projeyi gerçekleştirme adımına geçmek için bir engel kalmamıştır. WEKA çıktıları SMO fonksiyonel algoritmasının ürettiği değerleri bünyesinde tuttuğu için bu veriler kaydedilerek gerçekleştirim aşamasında kullanılmak üzere saklanır.