Doğal Dil İşleme ile Özet Çıkarma

Uzun zaman ardından bulduğum ilk fırsatta kendimce önemli türkçe kaynak olarak da az rastladığım NLP(doğal dil işleme) kullanarak bir metin üzerinden özet çıkarma işlemini anlatacağım. Tabi burdaki kasıtım genel örneklerde olduğu gibi değil Türkçe bir metin üzerinden örnek yapabilmektir. Kullanacağım örnek Yargıtay Emsak karar arama sayfasında herkese açık olarak elde edilmiştir. Link bilgisi (https://karararama.yargitay.gov.tr/YargitayBilgiBankasiIstemciWeb/)

Buarada daha çok uygulamalı örnek üzerinde durup anlatacağım. RNN ve NLP kütüphanelerini birlikte kullanılarak elde edilmiştir.

O’REILIY ‘in scikit-learn,keras ve tensorflow ile uygulamalı makine ögrenmesi kitabında doğal dil işleme ile paragrafıdan başlayalım.

“Alan Turing 1950’de meşhur Turing Testini hayal ettiğinde amacı bir makinenin insan zekasını yakalama kabiliyetini ölçmekti. Resimlerdeki kedileri tanımak, santranç oynamak, müzik bestelemek veya labirentten çıkmayı başarmak gibi pek çok şeyi deneyebilirdi ama o ilginç bir şekilde dil ile ilgili bir görev seçti. Daha özel olarak, karşısındakini onun insan olduğunu düşünerek aldatabilen bir sohbet robotu icat etti. Bu deneyin kendisine has zayıflıkları vardı. Gömülü kodlar kümesi şüphelenmeyen veya saf insanları aldatabilirdi ancak insan zekasının pek çok özelliği tamamen ihmal edilmişti.(Örneğin, yüz ifadeleri gibi sözsüz iletişim yorumlama kabiliyeti veya ele alınacak olan bir görevi ögrenme gibi). Ancak test, dilde uzmanlaşmanın tartışılabilir bir biçimde Homo Sapiens’in en büyük bilişsel yeteneği olduğunun altını çiziyordu. Doğal dili okuyabilen ve yazabilen bir makine inşa edebilir miydik?”

Alıntı yaptığımız paragrafa istinaden örnek çalışmamız makineye bir örnek metin vererek bizim belirttiğimiz uzunlukda metni anlayarak kendi cümleleriyle bir özet metin yazdırmaya çalışmak üzerine kurğulanmıştır. Öyle ise adım adım ilerleyelim.

Gerekli kütüphaneleri ekleyerek devam edelim.

import tensorflow as tf
from tensorflow import keras
import numpy as np

Eğitim Veri seti oluşturulması. Yukarıda da bahsettiğim gibi Yargıtay Emsal Kararlarından elde edilmiştir. Dataset oluşturulmuş olup oluşturulan datasetler de enumaret ile bölünerek gösterilmiştir.

np.random.seed(42)
tf.random.set_seed(42)

n_steps = 5
dataset = tf.data.Dataset.from_tensor_slices(tf.range(15))
dataset = dataset.window(n_steps, shift=2, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(n_steps))
dataset = dataset.shuffle(10).map(lambda window: (window[:-1], window[1:]))
dataset = dataset.batch(3).prefetch(1)
for index, (X_batch, Y_batch) in enumerate(dataset):
print(“_” * 20, “Batch”, index, “\nX_batch”)
print(X_batch.numpy())
print(“=” * 5, “\nY_batch”)
print(Y_batch.numpy())

sample_file =’deneme.txt’

with open(sample_file) as f:
data=f.read()

“print(data[:520])

Davacı vekili, davalı … tarafından kaleme alınan ve diğer davalı Taraf Gazetesi’nin 19/07/2009 günlü nüshasında yayınlanan “Devletin Demir Baş Bürokratı” başlıklı yazının ağır isnat ve suçlamalar içerdiğini, kullanılan kelimelerin ve gerçekle ilgisi olmayan iddiaların kişilik haklarına saldırı mahiyetinde olduğunu, davalı … aleyhine aynı yazı nedeni ile kamu görevlisine hakaret suçundan Kadıköy 2. Asliye Ceza Mahkemesinin 2009/1443 dosyası ile dava açıldığını ileri sürerek manevi tazminat isteminde bulunmuştur.

” “.join(sorted(set(data.lower())))

‘\n ” \’ ( ) , – . / 0 1 2 3 4 5 6 7 8 9 : ; ? a b c d e f g h i j k l m n o p r s t u v y z â ç ö ü ğ ı ş ̇ – ’ “ ” …’

tokenizer = keras.preprocessing.text.Tokenizer(char_level=True)
tokenizer.fit_on_texts(data)

“tokenizer.texts_to_sequences([“Davacı”])

[[9, 2, 18, 2, 25, 8]]

“tokenizer.sequences_to_texts([[9, 2, 18, 2, 25, 8]])

[‘d a v a c ı’]

Birbirinden farklı karakter sayısı
max_id=len(tokenizer.word_index)
print(max_id)

59

Toplam karakter sayısı
dataset_size=tokenizer.document_count
print(dataset_size)

55678

Metinin tamamını kodlama normalde 1 den başlıyor 0 dan başlaması için bir çıkartılır. Ve eğitim veri seti %90 olacak şekliyle ayrılır.
[encoded]=np.array(tokenizer.texts_to_sequences([data]))-1
train_size=dataset_size * 90//100
dataset=tf.data.Dataset.from_tensor_slices(encoded[:train_size])

n_steps=100 #Toplamda 100 karakter yazılması için belirtilen sayı istege bağlı artırılabilir.
window_lenght=n_steps+1 # hedef girdinin 1 karakter ileri kaydırma hali
dataset=dataset.window(window_lenght,shift=1,drop_remainder=True)

“dataset=dataset.flat_map(lambda window:window.batch(window_lenght))

np.random.seed(42)
tf.random.set_seed(42)

batch_size=32
dataset=dataset.shuffle(10000).batch(batch_size)
dataset=dataset.map(lambda window:(window[:, :-1],window[:, 1:]))

dataset=dataset.map(lambda X_batch,Y_batch:(tf.one_hot(X_batch,depth=max_id),Y_batch))

dataset=dataset.prefetch(1)

for X_batch,Y_batch in dataset.take(1):
print(X_batch.shape,Y_batch.shape)

output:(32, 100, 59) (32, 100)

Model Oluşturma

model=keras.models.Sequential([
keras.layers.GRU(128,return_sequences=True,input_shape=[None,max_id],
dropout=0.2),
keras.layers.GRU(128,return_sequences=True,dropout=0.2),
keras.layers.TimeDistributed(keras.layers.Dense(max_id,
activation=”softmax”))

])
model.compile(loss=”sparse_categorical_crossentropy”,optimizer=”adam”)
history=model.fit(dataset,epochs=20)

output:

Epoch 20/20
1563/1563 [==============================] – 13s 8ms/step – loss: 0.6816

def preprocess(texts):
X = np.array(tokenizer.texts_to_sequences(texts)) – 1
return tf.one_hot(X, max_id)

Bir sonraki karakteri tahmin için kullanılır

X_new = preprocess([“Yargıtay Mahkemes”])
Y_pred = np.argmax(model(X_new), axis=-1)
tokenizer.sequences_to_texts(Y_pred + 1)[0][-1]

output: ‘i’

tf.random.set_seed(42)

tf.random.categorical([[np.log(0.5), np.log(0.4), np.log(0.1)]], num_samples=40).numpy()

array([[0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
2, 0, 0, 1, 1, 1, 0, 0, 1, 2, 0, 0, 1, 1, 0, 0, 0, 0]])

def next_char(text, temperature=1):
X_new = preprocess([text])
y_proba = model(X_new)[0, -1:, :]
rescaled_logits = tf.math.log(y_proba) / temperature
char_id = tf.random.categorical(rescaled_logits, num_samples=1) + 1
return tokenizer.sequences_to_texts(char_id.numpy())[0]

100 karakter barındıran bir metin yazılması için kullanılır.

def complete_text(text, n_chars=100, temperature=1):
for _ in range(n_chars):
text += next_char(text, temperature)
return text

tf.random.set_seed(42)

print(complete_text(“k”, temperature=0.2))

output:

karar verildiği görülmüştür.
adil yargılanma hakkının muhtevası, savunma ve müdafii yardımından yarar

Faydalı olması dileğiyle…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir