FastText ile Twitter duygu analizi

Mehmet Ali SARIKAYA
Bankalararası Kart Merkezi
3 min readJul 17, 2019
fastText by Facebook AI Research [1]

FastText Nedir?

FastText, metin sınıflandırılması için Facebook AI Research tarafından geliştirilen bir kütüphanedir [1]. FastText aynı zamanda 294 dil için önceden eğitilmiş (pre-trained) kelime vektörleri sunmaktadır [2]. Kelime vektörleri, bütün kelimelerin birer boyut olarak ifade edildiği vektör uzay modelinde diğer kelimelerle olan ilişkisine göre bu uzayda yönlü bir vektör olarak yer alır. Bu vektörler, her bir kelime yerine kullanılacak olan sayısal özniteliği ifade eder. Kelimeleri vektör uzayında ifade etmeye çalışan, gözetimsiz bir öğrenme (unsupervised) modeli olan Word2Vec yaklaşımlarından Skip-Gram [3] ile Wikipedia üzerinden eğitilen bu vektörler, [2]’de yer alan linkten indirilebilmektedir.

FastText Kurulumu

$ wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip
$ unzip v0.2.0.zip
$ cd fastText-0.2.0
$ mkdir build && cd build && cmake ..
$ make && make install

Kullandığımız kelime vektörleri ve oluşacak model büyüklüğü 3GB civarı olacağı için aşağıdaki hatayı almamız muhtemeldir.

"src/model.cc:300: void fasttext::Model::update(const std::vector<int>&, const std::vector<int>&, int32_t, fasttext::real): Assertion `targetIndex < osz_"

Bu hatayı almamak için “fastText-0.2.0/src/model.cc” dosyasında 300. satır yorum satırı haline getirilir.

line 296: if (targetIndex == kAllLabelsAsTarget) {
line 297: loss_ += computeLoss(targets, -1, lr);
line 298: } else {
line 299: assert(targetIndex >= 0);
line 300: //assert(targetIndex < osz_);
line 301: loss_ += computeLoss(targets, targetIndex, lr);
line 302: }

Daha sonra fastText yeniden derlenir.

$ cd fastText-0.2.0
$ make

FastText için girdi dosyasının hazırlanması

FastText için girdi dosyasındaki etiketler “__label__” şeklinde başlaması gerekmektedir. Bu nedenle girdi olarak kullanacağımız dosyanın aşağıdaki formatta olması gerekmektedir.

__label__notr gelecegi yazanlar android programlama egitimindeyiz
__label__olumsuz sinifta bile dogru düzgün çekmiyor
__label__olumlu tesekkürler elime hizli bir sekilde geçti

Aşağıdaki formattaki csv dosyasını fastText inputu haline getireceğiz.

text, sentiment
gelecegi yazanlar android programlama egitimindeyiz, notr
sinifta bile dogru düzgün çekmiyor, olumsuz
tesekkürler elime hizli bir sekilde geçti, olumlu

Aşağıdaki R kodu bu dönüşümü sağlayacak.

#CSV dosyasını okuyoruz
train <- read.csv(file = "train.csv", encoding = "UTF-8")
#Prepare labels
train_labels <- paste0("__label__", train_data$sentiment)
#remove screen names
train_data$text <- gsub("@\\w{1,15}", '', train_data$text)
#remove hashtags
train_data$text <- gsub("#\\w{1,15}", '', train_data$text)
#delete links
train_data$text <- gsub("http://t.co/\\w{1,15}", '', train_data$text)
train_data$text <- gsub("https://t.co/\\w{1,15}", '', train_data$text)
#delete multilines
train_data$text <- gsub("[\r\n]", "", train_data$text)
#delete punctuation
train_data$text <- gsub('[[:punct:] ]+',' ',train_data$text)
# Clean text to remove odd characters
train_data$text <- sapply(train_data$text, function(row) iconv(row, "UTF-8", "latin1", sub=" "))
#convert to lower
train_texts <- stringr::str_to_lower(train_data$text, locale = "tr")
train_to_write <- paste(train_labels, train_texts)
writeLines(text = train_to_write, con = "train.txt")

Test verisi de aynı işlemlere tabi tutulur.

Türkçe için hazır kelime vektörlerinin indirilmesi

Türkçe için hazır kelime vektörleri [2] adresinde yer almaktadır. Burada bulunan [4] linki kullanılarak ilgili dosya indirilir.

Duygu analizi modelinin eğitilmesi

Hem kelime vektörlerini hem de girdi dosyasını hazırladığımıza göre modelimizi eğitebiliriz. Aşağıdaki komutu çalıştırdığımızda modelimiz eğitilecektir. Duygu analizi için pre-trained kelime vektörleri ile fastText içinde yer alan “multinomial logistic regression” modeli kullanarak modelimizi eğitiyoruz.

$ cd fastText-0.2.0
$ ./fasttext supervised -input train.txt -output modelTwitter -epoch 25 -wordNgrams 2 -dim 300 -loss hs -thread 7 -minCount 1 -lr 1.0 -verbose 2 -pretrainedVectors wiki.tr.vec
FastText eğitim çıktısı

Burada “train.txt” hazırladığımız girdiyi, “wiki.tr.vec” indirdiğimiz hazır kelime vektörünü “modelTwitter” ise oluşacak nihai modeli temsil etmektedir. “dim” parametresi hazır kelime vektörümüzün boyu ile aynı olmalıdır. “hs” parametresi “ hierarchical softmax” ifadesinin kısaltmasıdır. Bu fonksiyonla ilgili ayrıntıları [3] bağlantısından okuyabilirsiniz.

Duygu analizi modelinin test edilmesi

Aşağıdaki komut ile elde edilen modelimizi test edebiliriz.

$ ./fasttext test modelTwitter.bin test.txt
Test sonuçları

Yukarıdaki ekran görüntüsünde görüldüğü gibi precision ve recall değerleri elde edilir.

Mevcut modelin iyileştirilmesi

Mevcut modelin iyileştirilmesi için eğitim aşamasındaki parametreler değiştirilebilir. Ayrıca daha zengin eğitim verisi, test başarısını da artıracaktır.

Bir sonraki yazımızda görüşmek üzere :)

KAYNAKLAR

[1] https://research.fb.com/fasttext/

[2] https://fasttext.cc/docs/en/pretrained-vectors.html

[3] https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

[4] https://dl.fbaipublicfiles.com/fasttext/vectors-wiki/wiki.tr.zip

--

--