Kod Kartı: Counter ile Kelime Saymak

Bir önceki kartta kelime sayacını get() ile kurmuştuk: boş sözlük, for döngüsü, sayac.get(k, 0) + 1. Python’un hazır gelen collections modülünde aynı işi tek satırda yapan bir araç var: Counter.

Kod

from collections import Counter
kelimeler = ["python", "veri", "python", "bilim"]
sayac = Counter(kelimeler)
print(sayac) # Counter({'python': 2, 'veri': 1, 'bilim': 1})
print(sayac.most_common(2)) # [('python', 2), ('veri', 1)]
print(sayac["python"]) # 2
print(sayac["java"]) # 0

Counter bir listeyi alıyor ve her elemanın kaç kez geçtiğini tutan bir sözlük döndürüyor. most_common(n) en sık geçen n elemanı büyükten küçüğe veriyor. Eşit sayıları olanlar listede ilk görüldükleri sırayla geliyor; “veri”nin “bilim”den önce gelmesinin sebebi bu.

Son satıra dikkat: Normal bir sözlükte olmayan anahtar KeyError verirdi. Counter ise 0 döndürüyor, çünkü “hiç görülmedi” ile “0 kez görüldü” aynı şey. Bu get(k, 0) ile yaptığımızın hazır hali.

Metinde de çalışır

Counter‘a bir metin verirsen harfleri sayar:

print(Counter("bilgisayar").most_common(2)) # [('i', 2), ('a', 2)]

Birkaç kullanışlı özellik

sayac.update(["veri", "veri"]) # yeni elemanları sayıma ekle
print(sayac) # Counter({'veri': 3, 'python': 2, 'bilim': 1})
print(sum(sayac.values())) # 6 toplam kelime
print(len(sayac)) # 3 farklı kelime
a = Counter(elma=3, muz=1)
b = Counter(elma=1, kiraz=2)
print(a + b) # Counter({'elma': 4, 'kiraz': 2, 'muz': 1})
print(a - b) # Counter({'elma': 2, 'muz': 1})

İki sayacı toplayabilir ya da birinden diğerini çıkarabilirsin. Çıkarmada sıfır ya da eksi kalanlar listeden düşüyor; kirazın sonuçta olmamasının sebebi bu.

Dikkat: saymadan önce temizle

Counter ne verirsen onu sayar. Metni temizlemeden verirsen sonuç yanıltır:

metin = "Python öğrenmek eğlenceli. python ile veri analizi de eğlenceli!"
print(Counter(metin.split()).most_common(2))
# [('Python', 1), ('öğrenmek', 1)] "Python" ile "python" farklı sayıldı
temiz = [k.strip(".,!?").lower() for k in metin.split()]
print(Counter(temiz).most_common(2))
# [('python', 2), ('eğlenceli', 2)]

Büyük-küçük harf ve noktalama yüzünden aynı kelime farklı sayılıyor. Türkçe metinlerde lower() yerine Python Dersi 11’deki tr_lower fonksiyonunu kullanmayı da unutma.

Sözlükleri Python Dersi 8’de, get() kartını Kod Kartı #06’da, metin temizliğini Python Dersi 11’de anlattım.


Hatice Özbolat | Teknoloji ve AI Rehberi sitesinden daha fazla şey keşfedin

Son gönderilerin e-postanıza gönderilmesi için abone olun.

Comments

Bir yanıt yazın