CodeBlanks Logo Icon CodeBlanks

Veri hazırlama

Dizi verisini tensor'a dönüştürürsün.

Proje: duygu sınıflandırıcı

Bu projede küçük bir transformer encoder'ı NumPy ile adım adım kuracak ve kısa Türkçe cümleleri olumlu/olumsuz diye ayıracaksın. Birinci adım veriyi sayılara çevirmektir:

  1. Sözlük kur: her kelimeye bir kimlik (id) ver; 0 dolgu (<pad>) için ayrılır.
  2. Her cümleyi kimlik listesine çevir.
  3. Hepsini aynı uzunluğa getir (doldur ya da kes).
sozluk = {"<pad>": 0}
for c in metinler:
    for k in c.split():
        sozluk.setdefault(k, len(sozluk))

setdefault, kelime yoksa sıradaki numarayla ekler, varsa dokunmaz.

Dolgu maskesi

Dolgu konumları gerçek kelime değildir; dikkat onlara bakmamalıdır. Bunun için bir boolean dolgu maskesi tutulur:

def kodla(c, n=5):
    ids = [sozluk[k] for k in c.split()][:n]
    return ids + [0] * (n - len(ids))

X = np.array([kodla(c) for c in metinler])   # (5, 5)
pad = X == 0                                   # True = dolgu

Sonraki derste bu maske, dolgu sütunlarının skorunu çok küçük bir sayıya çekerek ağırlıklarını sıfırlayacak.

Uygulama Cümleleri kodla

Verilen sözlükle kodla(c, n=5) fonksiyonunu yaz (kes ve doldur). X matrisini ve pad maskesini oluştur. Sözlük boyutunu, X'i ve her cümledeki gerçek kelime sayısını ((~pad).sum(axis=1)) alt alta yazdır.

Başlangıç kodu

model.py
import numpy as np

metinler = ["film çok iyi", "çok kötü bir film", "iyi", "oyuncular iyi ama senaryo kötü", "kötü"]
sozluk = {"<pad>": 0}
for c in metinler:
    for k in c.split():
        sozluk.setdefault(k, len(sozluk))

# buraya yaz

Örnek çözüm

model.py
import numpy as np

metinler = ["film çok iyi", "çok kötü bir film", "iyi", "oyuncular iyi ama senaryo kötü", "kötü"]
sozluk = {"<pad>": 0}
for c in metinler:
    for k in c.split():
        sozluk.setdefault(k, len(sozluk))

def kodla(c, n=5):
    ids = [sozluk[k] for k in c.split()][:n]
    return ids + [0] * (n - len(ids))

X = np.array([kodla(c) for c in metinler])
pad = X == 0
print(len(sozluk))
print(X)
print((~pad).sum(axis=1))

Beklenen çıktı

9
[[1 2 3 0 0]
 [2 4 5 1 0]
 [3 0 0 0 0]
 [6 3 7 8 4]
 [4 0 0 0 0]]
[3 4 1 5 1]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Neden tüm cümleler aynı uzunluğa getirilir?

  • Doğruluğu artırmak için
  • Sözlüğü küçültmek için
  • Dikkati kapatmak için
  • Yığın hâlinde tek bir dizi (matris) olarak işlemek için Doğru cevap

Açıklama: NumPy dizileri dikdörtgen olmalıdır.

2 Eksik konumları 0 ile doldur.

Soru
return ids + [0] * (n - ____(ids))
Cevap
return ids + [0] * (n - len(ids))

Açıklama: Eklenecek dolgu sayısı n − uzunluktur.

3 Eşleştir.

Kavram Anlamı
sozluk["<pad>"] 0
X.shape (5, 5)
pad Dolgu konumları
setdefault Yoksa ekler

Uzman bölümündeki tüm dersler