Ember.js Javascript Framework’una Giriş


How to Create Ember.js Entities from Scratch • Nearsoft

Javascript dünyası hergün daha da hızla ilerliyor. Bu noktada özellikle tecrübeli yazılımcılar eski alışkanlıklarını devam ettirerek Javascript’i sadece HTML içinde çağrılan bir yan araç olarak görme eğilimine giriyor. Oysa durum sandığımız gibi değil. C# veya Java ile sunucu tarafında uygulama geliştirirken MVC denilen mantığa benzer mantık çoktan Javascript’e girdi bile. Diğer yandan bir çok eski yazılımcı sırf Javascript geliştirirken lazım olan bir kütüphaneyi kurmak için komut satırına şunu yazın: npm ifadesini gördüğünde hemen yolunu değiştiriyor olabilir. Aslında başta biraz tuhaf ancak kolaylıklarını görünce yazılımcının buna alışmaması içten bile değil.

Eski yazılımcıların diğer bir eğilimi ise bu tür yeni yazılım araçlarına bir sürü var diyerek ön yargı ile bakmaları. Aslında evet, bir sürü var ancak bu kötü bir durum değil. Çoğu yeni araç yazılımcıların bir kaç saatte öğrenip kullanmaya başlayabilecekleri şekilde tasarlandı. Dolayısıyla kaçmak yok.

Bir diğer eski yazılımcı adeti: Mevcut yapımı bu yeni yapıya uyarlamam zaman alır kaygısı. Haksız değiller. Ancak çoğu kez bu yapıları hemen uyarlamak zorunda değilsiniz. Ufak pilot uygulamalarla deneyebilir ikna olursanız mevcut sisteme entegre edebilirsiniz.

Şimdi bu yeni icat olmuş araçlardan biri ve en pratiklerinden olan ember.js i tanıtacağım. Bunun için dokümantasyonunu tek tek okudum. Oturdum öğrendim:) Bu arada yeni icat olmuş dedim ama bu kütüphane 2011 yılında çıktı. Bu yazının yazıldığı dönem itibariyle kaç yıl oldu? 11 yıl. O nedenle artık yeni diyerek burun kıvırmayın. Onlar kendini biliyor. Ahmet abee…

Yazıyı tasarlarken daha sonra kendim ve başkaları için kolay erişim olsun diye sık kullanılan oluşturma komutlarını en alta Hızlı Komutlar altına yazdım. Keyifli okumalar!

Şimdi başlayalım:

Nedir:

Herhangi bir tarayıcıda veya cihazda çalışabilecek ve modern uygulamalar geliştirmeye imkan tanıyan bir framework’tür. Daha verimli ve hızlı geliştirme vadeder. Modern Javascript (ES6) özelliklerini Ember ile kullanabilirsiniz.2011’de çıkmıştır. 10 yıldır var olduğuna göre oturmuş bir araç olduğunu düşünüyorum.

Şurada bitmiş bir Ember.js projesi var kodlarına bakmak isteyebilirsiniz:

https://github.com/ember-learn/super-rentals/tree/super-rentals-tutorial-output

Bundan sonraki adımları işleyebilmek için bu yazının altındaki Hızlı Komutlar başlığındaki komutları çalıştırın. Şöyle bir gir göz atmak isterseniz okumaya devam edin.

Sayfa Oluşturma

ember new <yeniprojeadi>

komutu ile hızlı proje oluşturduktan sonra app/templates altına gidip application.hbs dosyasını kaldırın ve kendi index.hbs dosyanızı yazın. Burada sadece body etiketinin içini yazabilirsiniz. Gerisine gerek yok. Bir div içine yazılar vs.

Sayfa Ekleme

Mesela hakkında diye bir sayfa oluşutacağız.

Önce router.js’a bunu söylemelisiniz.

app/router.js dosyasını açın. router.map fonksiyonu içine şu satırı ekleyin:

this.route('hakkinda');

Kod şu hale gelmeli:

Router.map(function() {  this.route('hakkinda');});

Şimdi ap/templates/hakkinda.hbs sayfamızı oluşturalım ve içine yine HTML ile içerik yazalım.

Şu anda http://localhost:4200/hakkinda sayfasına giderseniz sayfanız orada olmalı.

Burada dikkat ettiyseniz ‘hakkinda’ adı hem rotada hem templates klasöründe aynı ada sahip. Eğer farklı olsun isterseniz şöyle bir yol var:

this.route('hakkinda', { path: '/kimizbiz' });​

Bu durumda web sayfasında şöyle olamalı:

http://localhost:4200/kimizbiz

Yani bir maskeleme yaptık.

Sayfaları Birbirine Bağlama

Normalde sayfaları <a href=''></a> etiketi ile birbirine bağlarız. Ancak bunu yaptığımızda sayfa ‘full refresh’ olur yani suncuya gidip yeni sayfayı getirir. Oysa Ember.js kullanıyorsak buna gerek yoktur. Bunun yerine sayfaları şöyle bağlarız:

<LinkTo @route="hakkinda" class="button">Hakkımızda</LinkTo>

Otomatize Testler Yapma

ember generate acceptance-test <proje_test_adi>

Bu arada generate yerine kısaca g komutunu da kullanabiliriz.

Bu durumda tests/acceptance/ klasörü altında otomatik olarak oluşturulmuş test dosyaları hazırlanır.

Peki nedir bu test? Uygulamamızı kullanıcının bakış açısından test ediyorlar – daha önce yaptığımız “tıkla ve çalışıp çalışmadığını gör” testinin otomatikleştirilmiş bir sürümüdür ve tam da ihtiyacımız olan şey budur.

Buraya girip test fonksiyonlarının nasıl yazılacağı için şu linke bakın:

https://guides.emberjs.com/release/tutorial/part-1/automated-testing/

Temel mantık teste sayfaya gidip içeriğe bakmasını ve istediğiniz bazı nesnelerin orada olup olmadığın bakmasını sağlamaktır. Test sunucusunu başlatmak için en alttaki hızlı komutlar listesine bakın.

Bu arada test sunucusu da otomatiktir. Yani siz test fonksionu yazdıkça o test sunucusunun açtığı tarayıcı sayfasında hataları gösterir.

Bileşen (Component yazma)

Mesala şöyle bir kodumuz olsun her yerde kullancağız:

<div id="bizimkodumuz" class="jumbo">  <div class="right tomster"></div>  {{yield}}</div>

Bu kodu alıp /app/components/kodum.hbs diye kaydedelim. Daha sonra herhangi bir sayfamızda

<Kodum>Buraya ne yazarsanız yukarıdaki yield yazan yerin içine yazar</Kodum>

Diye yazarsak bu hazır etiketimiz çalışır. Böylece sayfa başlığı veya özel bazı yerleri tekrar tekra yazmanıza gerek kalmaz.

Bu arada yazdığımız bileşenler için de test dosyası yazabiliriz. Bu sayede bileşenlerimizin sağlığında emin oluruz. Bu test kodlarında bileşene bir yield yani bileşenin içindeki kısmı gönderip bizim istediğimiz sonuçları verip vermediğini test ediyoruz. Bileşen testleri için şu linke lazım olduğunda bakarsınız:

https://guides.emberjs.com/release/tutorial/part-1/component-basics/

Outlet Kavramı:

Master template dediğimiz her sayfada hazır gelmesini istediğimiz şablonlar vardır. Genellikle sayfanın logosu vs. buraya koyarız. Bu tür sayfa için app/templates/application.hbs dosyasını kullanırız bu dosya şöyledir:

<div class="container">  <NavBar />  <div class="body">    {{outlet}}  </div></div>

Bu dosyayı böyle yazdıktan sonra yukarıda sayfa oluşturken yazdığımız index.hbs, hakkinda.hbs gibi çıplak (yani body tagı olmayan düz divlerden müteşekkil sayfarımız) gidip hep yukarıdaki kodda {{outlet}} yazan yere kendini yazar.

Bileşenleri komut satırından oluşturma

Yukarıda elle oluştırduğumuz dosyayı komut satırından da oluşturabiliriz. Bu sayede bileşenin dosyası ile birlikte için kabul test kodu da oluşmuş olur.

ember generate component <bilesen_nadi>

Alt bileşen oluturma

Mesela mağaza ürünü gibi bir bileşen oluşturdunuz. Bileşenin altında bir de ürün diye alt bileşen oluşturbilirsiniz. Bu durumda bu bileşen örneğin <Magaza> iken alt bileşen <Magaza::Resim> şeklinde olur.

ember generate component <bilesen_adi>/<alt_bilesen_adi>

Bileşenlere özellik (attribute) atama:

Normal HTML’lerdeki src veya title gibi özellikleri aynen bileşen veya alt bileşenlere aktarmak mümkündür. Bunun için şöyle yaparız:

Mesela mağaza bileşeni için:

<Magaza::Resim    src="https://upload.wikimedia.org/wikipedia/commons/c/cb/Crane_estate_(5).jpg"    alt="A picture of Grand Old Mansion"  />

Bunun bileşen dosyası şöyle olmalıdır:

<div class="image">  <img ...attributes></div>

İkinci satırdaki ...attributes ifadesine dikkat edin. Bu ember.js jargonunda splattributes olarak adlandırılır. Gönderilen ne attribute varsa alır.

Bileşenlere Davranış Atama

Diyelim ki mağaza resimlerimize tıklanınca büyüsün istiyoruz. Bu durumda önce bu bileşenimiz için bir javascript davranış dosyası oluşturtacağız:

İlk adım magaza/resim bileşenenine bir davranış dosyası (component-class) oluşturma:

ember generate component-class magaza/resim

Açıp aradaki kodları ekliyoruz: yeri app/compotnets/magaza/resim.js gibi bir yerde.

import Component from '@glimmer/component';
​export default class MagazaResimComponent extends Component 

{//şuralar bizim eklediğimiz kod  
constructor(...args) 
{    
super(...args);    
this.isLarge = false;  
}   
isLarge = false; //şuraya kadar}

Aslında diyoruz ki bileşemizin bir özelliği var o da .isLarge yani resim şu an küçük mü büyük mü? Bunu bir durum yani state olarak tutuyor.

Sonra template dosyamızı app/components/magaza/resim.hbs

konumundan açalım:

<div class="image">  
<img ...attributes></div>{{#if this.isLarge}}  
<div class="image large">   
 <img ...attributes>    
<small>Kücült</small>  
</div>{{else}}  

<div class="image">    <img ...attributes>    <small>Buyut</small>  </div>{{/if}}

Gördüğünüz gibi template dosyamızın içeriine özel if ve elselerle isLarge parametresine eriştirip onun durumuna göre css sınıfı vererek büyütmek ve küçültmek mümkün. Şu hali ile henüz tam çalışmaz çünkü tıklama davranışı tanımlamadık bunun için şuradan devam edebilirsiniz:

https://guides.emberjs.com/release/tutorial/part-1/interactive-components/

Veriyle çalışmak

Her bir sayfa için ayrıca oluşturulan ve app/routes/ dizininde yer alan dosyalar içerisine konan direkt JSON verileri veya API adreslerinden alınan modeller oradan sayfaya yollanabilir

import Route from '@ember/routing/route';
​export default class IndexRoute extends Route 
{  async model() 
{       let response = await   fetch('/api/rentals.json');         let parsed = await response.json();    
        return parsed;  }}  

Bu şekilde view a yollanan veri view içinden @model denmek suretiyle çağrılır.

Birden fazla satır halinde olan (genelde veriler böyledir) veriler için ise şu yapı kullanılır (.hbs) dosyası içinde:

{{#each @model as |property|}}      
<li><Rental @rental={{property}} /></li>
{{/each}}

Burada @model seri halindedir property nesnesi tekil item halindedir. o da direkt olarak component içine yollanmakta orada alt kırılımları açılmaktadır.

Detaylı bilgi: https://guides.emberjs.com/release/tutorial/part-1/working-with-data/

Hızlı Komutlar

npm install -g ember-cli

ember komutu ile kurulumu kontrol edin.

Yeni proje oluşturma:

ember new <yeniprojeadi>

cd komutu ile klasöre gir

Lokalde çalıştırma:

ember server

Sunucu hot-loading özelliğine sahiptir. Kodu değiştirdiğinizde sayfayı yenilemeye ihtiyaç yoktur.

Test sunucusunu çalıştırma:

ember t -s

Komponent oluşturmua:

ember generate component <bilesen_adi>

İç içe alt bileşen oluşturma (Namespaced compontens)

ember generate component <bilesen_adi>/<alt_bilesen_adi>

Lüzumlu Linkler

Ember Cheatsheet:

https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/

Tüm Ember.js tutoriali (Part 1)

https://guides.emberjs.com/release/tutorial/part-1/recap/

Tüm Ember.js tutoriali (Part 2) https://guides.emberjs.com/release/tutorial/part-1/recap/

Convert news-plase output json to sqlite


News-please is a great crawling tool for gathering data over the web. However, its output is JSON. Although it has a method for saving data to the PostgreSQL database I usually prefer SQLite. Therefore I wrote a script for this purpose:

Here: https://gist.github.com/suatatan/7b8d2cd2f20812cb3caa0c4bf41b8558

YAKE kütüphanesi ile Türkçe Metinlerden Anahtar Terimleri Türetin


Big Data (Büyük Veri) Nedir?. Günümüzün popüler kavramlarından biri… | by Big  Data Turkey | Düşünen Beyinler | Medium

Python ile herhangi bir metin içerisinden anahtar terimler çıkarma ve bunlara ilgililğine görse sayısal değerler vermek isterseniz Rake gibi kütüphaneler vardır ancak bunlar Türkçe dil desteği içeremez.

Türkçede bu işi yapmak için Yake adlı bir kütüphane vardır. Akademik makalesi de şurada:

Bu yazıda elimde bulunan bir haber veriseti içinde her bir haberin anahtar terimleri içindeki en yüksek değerleri başka bir kolona atıp daha sonra arama yapınca sadece en yüksek ilgili ifade işe eşleşme sağladım. Bu sayede içinde aradığım kelime geçen yazı değil, aradığım terimle ilgili olma olasılığı en yüksek olan haber geliyor. Bir nevi lokal google yani.

Hadi bu lezzetli tarifimi vereyim:

Önce Yake kütüphanesini kuralım:

# !pip install yake

Şimdi de Türkçeye göre ayarlama yapalım:

from yake import KeywordExtractor
import pandas as pd
kw_extractor = KeywordExtractor(lan="tr", n=1, top=5)

Verisetimi okuyorum:

df =pd.read_csv("deneme.csv")
text = df.at[22,'headline']
print(text)

Örnek bir haber:

Kuyu çöktü, 2 kişi toprak altında kaldı

Deneme 1,2,3:

keywords = kw_extractor.extract_keywords(text)
keywords
max(keywords)

Bu metin “toprak” ile ilgili (en çok). Elbette kusursuz değil ama istersek tüm anahtar kelimeleri de dizeriz.

(0.6286477325744138, 'toprak')

Şimdi dev verisetimde teker teker deniyorum:

secim = df
#secim.headline

Her bir çıktı anahtar terimin en yüksek değere sahip olanı olasılık rank değeri ile birlikte kolonlara aktardım:

secim['tk_ozet'] = ""
secim['tk_ihtimal'] = None
for index,row in secim.iterrows():
   try:
       haber = row['headline']
       keywords = kw_extractor.extract_keywords(haber)
       olasilik = round(float(max(keywords)[0]),2)
       tekkelime = max(keywords)[1]
       secim.at[index,'tk_ozet'] = tekkelime
       secim.at[index,'tk_ihtimal'] = olasilik
       #print(f"{haber}--> {tekkelime}: {olasilik}")
   except  Exception as ex:
       #print(str(ex))
       pass

Şimdi arama denemesi zamanı:

terim = "çocuk"
secim[secim.tk_ozet.str.contains(terim)][['headline','tk_ihtimal']].sort_values("tk_ihtimal",ascending=False)

​​

.dataframe tbody tr th {
  vertical-align: top;
}

.dataframe thead th {
  text-align: right;
}

</style>​

headlinetk_ihtimal
506Dini nikahlı kocası bıçakladı! 1 çocuk annesi …0.78
915Başakşehir anne çocuk merkezine sahip çıkıyor0.7
781Köy çocuklarının sesi oldular0.63
1204Pandemide çocukların yüzünü güldürdüler0.63
1423Gülabibey’de çocuklar mutlu0.54
1055Aydın Kadın Doğum ve Çocuk Hastalıkları Hastan…0.34
2052Lüleburgaz Belediyesi “Çocuk Hakları” Toplantı…0.25
2143ÇOCUKLARINA KAVUŞTU0.14

</div>

Haberleri “çocuk” terimi ile en ilgili şekilde listeledik. Kusursuz değil ama yakın.

Hangi Korelasyon Türü Ne Zaman Kullanılır?


Ben ezberimde tutamıyorum, tutamayan herkes için buraya not:

Pearson’s r isn’t the only game in town…

NameSymbolCharacteristic of VariablesÖrnek
Pearson’s Product MomentrBoth are continuous (interval or ratio)Boy, Kilo
Boy, Yaş
Rank OrderrBoth are rank (ordinal)
Point-BiserialrpbisOne is continuous (interval or ratio) and one is nominal with two valuesMedeni Durum(Evli,Bekar), Yaş
BiserialrbisBoth are continuous, but one has been artificially broken down into nominal values.
PhifBoth are nominal and each has two values.Medeni Durum (Evli, Bekar)ve Cinsiyet(E,K)
ContingencyCBoth are nominal and each has more than two values.
TetrachoricrtBoth are continuous, but each has been artificially broken down into two nominal values.
EtahBoth are continuous and are used to detect curvilinear relationships.

Sunumlarda kullanılabilecek uygulamalar listesi


Sunum yaparken artık düz powerpoint göstermek sıkıcı gelebiliyor. Sunumlarınızı daha aktif daha katılımcı hale getirmek için bu listeyi hazırladım.

Mentimeter

https://www.mentimeter.com/

Bu uygulama ile sunum anında kullanıcılardan gelen verileri anında görselleştirebilirsiniz.

Monkey Learn Wordcloud

https://monkeylearn.com/word-cloud/

Bu uygulama ile de sunumlarda kullanacağınız kelime bulutları oluşturabilirsiniz. Tek lazım olan uzun ve çoklı metinler.

Python ile Twitter’dan topluca Veri Çekme (API’siz)


Twitter API’si olmadan aşağıdaki kodlar yardımı ile örneğin içeriğinde “umutsuz” ifadesi geçen ve 11 Mart 2020 ile 1 Nisan 2020 arasındaki twitleri çekip excele kaydedebilirsiniz:

import snscrape.modules.twitter as sntwitter
import pandas as pd

# Creating list to append tweet data to
tweets_list2 = []

# Using TwitterSearchScraper to scrape data and append tweets to list
for i,tweet in enumerate(sntwitter.TwitterSearchScraper('umutsuz since:2020-03-1 until:2020-04-11').get_items()):
    print(i)
    if i>5000:
        break
    tweets_list2.append([tweet.date, tweet.id, tweet.content])

# Creating a dataframe from the tweets list above
tweets_df2 = pd.DataFrame(tweets_list2, columns=['Datetime', 'Tweet Id', 'Text' ])
tweets_list2.to_excel("sonuc_umutsuz.xls")

Pardon! Kullandığınız yapay zeka yapay mı gerçek mi ?


Neredeyse kod yazan herkesin yapay zeka kullanıyoruz dediği bir çağdayız. Bu durum organik sertifikası almadığı halde pazarlarda organik elma armut vs. etiketi yapıştıranlarla aynı ticari stratejiye dayanan bir oyun: Satma.

İnsanlar çoğu kez ani gelen bilgilere karşı anlık refleksleri ile olgunun tersini sorgulamadan kabul edebiliyor. Yapılan bir araştırma pazardaki durumun (sebze meyve pazarı) vehametinin bilişim pazarı için de aynı olduğunu gösteriyor. Üstelik Avrupa’da! Yapay zeka kullandıklarını idddia eden firmaların sadece %60’ının gerçekten yapay zeka kullandığı diğerlerinin en basitinden (hani regresyon filan diyelim) yapay zekanın ‘Y’sini bile kullanmadıklarını ortaya çıkarmış.

Türkiye’den ise daha ilginç bir örnek var. Döner kesme makinesinde yapay zeka kullanıldığını iddia eden ve kısa sürede popüler hale gelen şu twit aslında bir kaç cümledir anlatmaya çalıştığımız durumu özetlemiş.

Image for post

Kaldı ki firmalar yapay zekayı kullansa bile akla şu soru geliyor. Yahu yapay zeka kullansak ne olacak? Evet çok haklı bir eleştiri. Yapay zeka her yerde kullanılmak zorunda değil nitekim kabaca şöyle bir ilke kurabiliriz: bir problem yapay zeka olmadan kolayca ve başarılı olarak çözüldülebildiği takdirde yapay zekaya gerek yoktur. Yapay zeka sadece hız, isabetlilik veya başka bir fayda sağlıyorsa işe yarar. Yapay zeka çıkana değin çözülebilen bir çok günlük yaşam problemi böyle çözülmüştür. Örneğin döner kesme makinesi için en azından şimdilik yapay zeka olmadan işlem mümkünse yapay zeka kullanmak fayda yaratmayabilir:) Bu noktada bir bilişimcinin veya bilişim firmasının yapay zeka kullanması onun daha başarılı olduğuna dair bir gönderme yapmaz, yapmamalıdır. Bu bilgelik bize bir problemi yapay zeka ile çözmek istediğimizde de ön plana çıkar. Şu soruyu sormalıyız? Gerçekten gerek var mı? Ya da yolun başlangıcında gerek var mı?

İşte size bir örnek Times’a kapak olan 15 yaşındaki genç kız Gitanjali RAO, siber zorbalığa karşı geliştirdiği bir araç nedeniyle ödül almış. Gerçekten takdire şayan bu hikayeyi okurken bu genç kızın ilk çalışmasının yapay zeka olmadığı ilk aracını hard-coding ile yazdığını ifade etmiş. İyi de yapmış nitekim teknoloji odaklı değil amaç odaklı başlamış çalışmaya daha sonra imkanları gördükçe daha ileri teknolojilere yönelmiş. Yazıda şöyle bir yer var:

Kindly — an app and Chrome extension — was also built by Rao in order to help detect cyberbullying at an early age. Powered by artificial intelligence, this app was developed as Rao started to hard-code in some words that could be considered bullying. Further explaining how it works, she said that her engine then took those words and also identified similar words. The engine can self-learn and is adaptive, that can be invoked on a variety of different platforms.

Peki bu yazıda geçen “hard-coding” ne anlama gelir? Bunu sizler için açıkladık. Niye açıkladık? Hard-coding basit bir kavram gibi görünse de arkasında önemli bir hikaye barındırıyor. Olay bilgisayarın bir şeyleri anlamasını istendiği zaman eskiden yapılan ve yapay zeka sonrasında yeni ortaya çıkan alternatifleri düşünme ile başlıyor. Bu yazıdan sonra yapay zeka’nın yapay mı gerçek mi olduğunu kolayca anlayabileceğiz.

Şimdi diyelim ki içeriğinde hakaret bulunan metinleri yakalamak istediğimizi var sayalım. Amacımız bir metin içinde bizim hakaret kabul ettiğimiz herhangi bir ifade ya da ifadeler yer aldığında bu metni yakalamak, bu ifadelerin yer almadığı bir metni ise masum kabul etmek. Olayı basitçe anlatmak adına şöyle tanımlayalım. Diyelim ki metin içinde sadece “it, köpek, şerefsiz” gibi kelimeleri yakalamak istedik.

Hard-Coding

İşlemi koda düz mantıkla şöyle diyoruz. Python dilinde bir metinde bu ifadeler yer alıyorsa yakalamasını söyleyelim:

def bu_metinde_hakaret_varmi(metin):
metin = "it herif gelip ne dedi"
if "it" in metin or "köpek" in metin or "şerefsiz" in metin:
print("Metin hakaret içeriyor")
else:
print("Metin masum")

Python dilinde yazdığımız bu kodlar o kadar net ki herhalde metinde üç hakaret ifadesi geçtiğinde kodun metnin hakaret içerdiğini anladınız:). Haydi test edelim

Test 1

bu_metinde_hakaret_varmi("şerefsiz insanları tanımam")
bu_metinde_hakaret_varmi("köpek gibi çalışıyorsun")

Sonuçlar şöyle olacaktır:

Metin hakaret içeriyor
Metin hakaret içeriyor

Şu anda her şey yolunda görünüyor değil mi? Başta da demiştik, düz mantıkla evet, yolunda görünüyor. Teorik olarak da her şey kusursuz. Ancak gerçek hayat bir sürü ististna içerdiği gibi burada da epey önemli bir istisna içerir. Şimdi gösterelim.

Test 2

bu_metinde_hakaret_varmi("mahalledeki köpekler belediyece toplandı")
bu_metinde_hakaret_varmi("IT birimi şu anda eğitimde")

Sonuçlar şöyle olacaktır:

Metin hakaret içeriyor
Metin hakaret içeriyor

Evet çok sevdiğimiz hard-coded algoritma bu kez çuvallayacaktır nitekim her iki ifadede de hakaret yoktur. IT birimi ile it aynı anlamda anlaşılıp kod tarafından hakaret olarak işaretlenmiştir. Bu problemi çözmek için için koda “it birimi” ifadesi olduğunda bunun hakaret olmayacağını söyleyebiliriz ancak “mahalledeki köpekler” için durum bu kadar basit değil. İşte tam da burada öyle bir çözüm lazım ki biz ona tek tek ya da kelime bazlı olarak olayı öğretmeyelim, o kendi kendine öğrensin ve karar versin. Makine öğrenmesine hoş geldiğiniz. Artık nerede lazım onu biliyorsunuz.

Yukarıda gösterdiğimiz kodun çalıştır hali

Makine Öğrenmesi

Şimdi keşke şöyle bir liste olsa da onu makineye öğretebilsek dediğinizi duyar gibiyim:

Training Data

Evet bu şekilde (ama bu kadar az satırla değil) ve sadece iki kolonu olan bir tablonuz varsa makineye öğretecek datanız hazır demektir. Makine öğrenmesi literatüründe biz buna “training data” deriz. İlk kolonu “makine oğlum hadi öğren bu da örnek” dediğimiz kolon, ikinci kolon ise etiket yani “bak oğlum bu hakaret ya da değil” dediğimiz kolondur. Datamız hazır peki makineye nasıl öğreteceğiz.

Bunun için bir de makine öğrenme algoritmasına ihtiyacınız olacak, yazının devamında azlarını zikredeceğim bu algoritmalara (bunlar hazır araçlar değildir, kodlanması icap eder) elinizdeki veriyi (diyelim yukarıdaki gibi) öğrettiğinizde elinizde şöyle bir fonksiyon olur:

Classifier.predict("tahmin edilecek metin")

Burada “tahmin edilecek metin” ifadesi içerisinde şöyle bir şey yazdınız diyelim

Classifier.predict("Dün akşam IT departmanı yemekteymiş")

Bu durumda bu cümle yukarıdaki tabloda yer alan cümlelerden hiç biriyle aynı olmadığı halde makine şu sonucu verir:

Metin masum

İyi de nasıl? İşte şu anda makine öğrenme modellerinin arkasındaki matematiğin sınırlarındayız! Kabaca şöyle: Elimizdeki datalardaki cümlelerde “IT departmanı” ifadesi geçen iki cümlede sonuç “masum”. O zaman bu metin de büyük olasılıkla “masum”. Peki algoritma her bir kelimeyi tek tek alıp işaretliyor mu? El-cevap: evet. Algoritmanın metni tanıması için her bir kelime aşağıdaki gibi gösterilebilecek şekilde sayıya dönüştürülüyor:

Sayıya dönüştürülen ifadeler matrisi, nam-ı diğer: document-term-matri

Elbette gri alanlar var. Yani IT departmanında birine köpek dediğinizde algoritmanın kafası karışabilir:) ancak yine de veri seti yeterince zenginse algoritma işini kolayca yapar. İşte bu durumda makine öğrenmesi kullanmış olursunuz.

Turnusol Kağıdı

Literatür bize makine öğrenmesi öncesinde de bilişimle gerçekleştirilen işlerin yapay zeka olarak adlandırılabildiğini söylüyor (tüccarlar düymasın). Başka bir deyimle hard-coding ile geliştirilen araç yapay zeka sayılır. Ancak literatür de gerçek yaşam da hard-coded bir aracın yapay zeka sayılsa bile makine öğrenmesi olmayacağını ifade eder. Makine öğrenmesi bugün günlük yaşamda yapay zeka ile eş anlamlı kullanılmaktadır. Onun “bir tık üstü” olan derin öğrenme de benzer anlamlarda kullanılmaktadır. Elbette iyi geliştirilmiş bir öğrenmiş sistem hard-coded sistemden daha başarılıdır. Arkasında da daha büyük bir efor içerir. Bu nedenle yapay zeka ile bir şeyler yaptığını iddia eden arkadaşlarımıza soracağımız soru yapay zekanız yapay mı? sorusu değil hangi makine öğrenme modelini kullanıyorsunuz sorusudur. Bu soru turnusol kağıdı gibidir. Eğer cevap açıkça NaiveBayes, SVM, DecisionTree, KNN gibi bir algoritma ya da bu algoritmaları çalıştırdığımız Tensorflow, ScikitLearn, Keras, PyTorch gibi bir ifade değilse (elbette daha fazla algoritma ve araç var bunlar bazıları) o araç makine öğrenme modeli kullanmıyordur.

Turnusol.org

Bu örnekleri hard-coding ile makine öğrenmesinin farklarını göstermek için kullanık. Aslında her ikisi de yapay zeka kabul edilmektedir. Ancak günümüzdeki yapay zeka uygulamaları arasında hard-coded araç kalmamış gibidir ya da en azından çok azlık bir kısmı hard-coded olabilir. Bu nedenle günümüzde “YAPAY ZEKA = MAKİNE ÖĞRENMESİ” kabul edilebilir. Yapay zeka ile ayrıştırıcı dil ve yanıltıcı haberle karşı geliştirdiğimiz araçlar için ne kullanıyoruz peki?

Factomatadlı yanıltıcı haberleri tahmin aracımız yukarıdaki tanımlardakinin aynısında olduğu gibi yapay zeka kullanıyor. Öğrenme verilerini teyit.org ve doğruluk payı gibi açık kaynaklardan derliyor. Turnusol kağıdını kullanmak isterseniz cevap: NaiveBayes!

Diğer yandan ayrıştırıcı dil tahmin aracımız ADYA ise “şimdilik” hard-coded. Nitekim elimizde eğitim verisi “henüz” yok. Peki sizin elinizde herhangi bir alanda makinaya öğreteceğiniz bir veri ve geliştirmek istediğiniz bir algoritma ve her şeyden daha önemlisi çözmek istediğiniz gerçek bir yaşam problemi var mı? O zaman Turnusol.org ile irtibata geçin. Birlikte çözelim. Ya da mevcut araçlarımız sizin için bu problemi çözsün.

Dr. Suat ATAN

(Bu yazının aslı turnusol.org’da yayınlanmıştır)

News Please!: Haber analizi yapanlar için ilaç gibi bir Crawler


Kendi küçük crawler’ınızı oluşturmak ister misiniz? Ben haber analitiği ile ilgili çalışmalarımı yaparken eksteriyetle çok miktarda habere ihtiyaç duyuyorum. Şu ana kadar scra.py, newspaper3k gibi bir çok kütüphane kullandım Python’da. R’da ise Rvest. Ancak bu kütüphaneler bir yere kadar işe yarıyor. Çekebildiğim en fazla miktar 50.000 civarında haber idi. Burada suç bu kütüphanelerin değil, daha teknik ayrıntıda.

Yeni keşfettiğim kütüphane ise scraping değil crawling yapıyor ayrıca her çekilen veriyi .hjson formatında kayedediyor. CLI modunda sadece başlangıç sitesi vermek yeterli. O özel yollarla linkleri buluyor.

Kütüphane linki şurada: https://github.com/fhamborg/news-please#run-the-crawler-via-the-cli

Buradan derlenen haberler bilgisayarınıza json formatında ayrıştırılmış olarak (başlık, tarih, fulltext) ve html dosyasının kendisi ile birlikte gelir. Bu dosyaları ise Python Pandas ile birleştirip analiz edebilirsiniz:

Benim kendi lokalimdeki çalışan kodlar şunlar:

path_to_json = '/home/suat/news-please-repo/data/2020/10/15/haberler.com'
json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]
print(json_files)  # for me this prints ['foo.json']
jsons_data = pd.DataFrame(columns=['id', 'baslik','tarih','sayfa_url','tanim','anametin'])

i=0
for index, js in enumerate(json_files):
    with open(os.path.join(path_to_json, js)) as json_file:
        json_text = json.load(json_file)
        # here you need to know the layout of your json and each json has to have
        # the same structure (obviously not the structure I have here)
        anametin = json_text['maintext']
        baslik = json_text['title']
        tarih =  json_text['date_publish']
        sayfa_url = json_text['url']
        tanim = json_text['description']
        #city = json_text['features'][0]['properties']['name']
        #lonlat = json_text['features'][0]['geometry']['coordinates']
        # here I push a list of data into a pandas DataFrame at row given by 'index'
        jsons_data.loc[index] = [i,baslik,tarih,sayfa_url,tanim,anametin]
        i=i+1