Google’ın tüm datası elimin altında ama!


Commom Crawl (Bundan böyle CC yazacağım https://commoncrawl.org/ sitesinden yayın yapan) kar amacı gütmeyen bir kuruluştur. Bir nevi Google gibi tüm webi tarar ancak verileri kendine saklamaz. Bunun yerine düzenli olarak yayınlar. Şimdi hemen heyecanlanmayın gidip alayım diye. Devasa büyüklükte verilerdir. Öyle açıp bakamazsınız. Bir takım özel yetenekler gerekir. Bunları bu kısa yazıda anlatmamız mümkün değil. Ama bazı kavramlara kısaca bakalım. Not: Ben kısmen de olsa bu verilere erişebiliyorum 🙂 Parmaklarımdan yıldırımlar çakıyor 🙂

WARC dosyası: Bu dosya tipi webi tarayan uygulamaların bir nevi zip dosyasıdır. Çeşitli konularda taranmış olan web sayfaları paketler halinde bu dosyanın içine konur. Common Crawl sitesinden gidip bu dosyaları indirmelisiniz. Ancak bu dosyalar sadece metaverileri içerir. Web’in büyüklüğünü siz düşünün.

Nereden indirebilirim, nasıl indiririm: https://stackoverflow.com/questions/55762306/download-small-sample-of-aws-common-crawl-to-local-machine-via-http

Aşağıda bir çok ufak bir WARC dosyasını açtım (840 MB). Dikkat edin sadece sayfaların adresleri var. Gidip okuması size ait

WARC dosyalarını nasıl açarım: Maalesef o da ayrı zorluk. WebRecorder Player adlı uygulamayı indirip oraya upload ederek lokalden dosyaya bakabilirsiniz. Programı şuradan indirebilirsiniz: https://github.com/webrecorder/webrecorder-desktop

Diğer yöntem: https://guides.lib.vt.edu/webarchiving/openwarc

Python ile kısmi açma: https://dmorgan.info/posts/common-crawl-python/

Atom ile Javascript Kodlarını IDE içinde çalıştırıp sonucu görmek


Bir kodun nasıl çalıştığını görmek için derlemek veya çalıştırmak gerekir. Javascript için de o sayfayı açmak gerekir. Ancak bir şey olsa ve o satırdaki çalıştırıp kod nasıl işliyor diye bakmak istediğiniz oldu mu? Ama araç yoktu değil mi? Var!

Atom IDE’yi kurun, orada “Hydrogen” adlı eklentiyi kurun. Daha sonra Node.js aracım NPM kurun. Bu kurulumlar sonunda konsoldan şu komutları çalıştırın

npm install -g ijavascript

Sonra

ijsinstall 

Daha sonra javascript dosyanızı açıp Ctrl+F5 diyerek istediğini satırı şöyle çalıştırabilirsiniz:

Ne oluyor?

Aslında Hyrdogen, Python kullananların bildiği bir hızlıca kod çalıştırma, deneme yanılma aracı. Jupyter de aynı işi yapar. Oturup Javascript için de aynısını yapmışlar. Bu yöntem literal programlama olarak biliniyor. Kodlarken ne yaptığınızı bilerek gidiyorsunuz.

İyi kodlamalar

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/

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")