import pandas as pd
import re
import syllapy
import textstat
import matplotlib.pyplot as plt
'fivethirtyeight') plt.style.use(
Giriş
Okunabilirlik, bir metni okumanın ve anlamanın ne kadar kolay olduğunu ifade eder. Metinlerin okunabilirliği, bilgi iletişiminde kritik bir rol oynayabilir ve bir metin ne kadar açık ve anlaşılır olursa, o kadar etkili bir iletişim sağlanabilir. Bu bağlamda, Türkiye Cumhuriyet Merkez Bankası’nın (TCMB) faiz oranlarına ilişkin duyuru metinlerinin ve tabi ki diğer metinlerin okunabilirliği üzerine odaklanmak, hem finansal anlamda hem de genel olarak kamuoyuyla iletişim açısından önem taşıyabilir.
Bank of Canada (Kanada Merkez Bankası), Readability and the Bank of Canada başlıklı bir çalışmalarında, banka yayınlarının 2015-2017 yılları için okunabilirliğini incelemiş ve genel olarak banka yayınlarının normalde bankanın kitlelerinin tükettiği haber makaleleri ve diğer içerikler kadar kolay okunmadığını bulmuş. Ancak aynı zamanda bankanın uluslararasında iyi bir konumda yer aldığı sonucuna da ulaşmış.
Kullanılacak Kütüphaneler
Gunning’in Fog İndeksi
İndeks, 1952 yılında Gunning Fog tarafından geliştirilmiştir ve aşağıdaki gibi hesaplanmaktadır.
\(GFI = 0.4[(\frac{Total\ words}{Total\ Sentences}) + 100(\frac{Complex\ words}{Total\ words})]\)
Complex words ile kastedilen üç ve daha fazla heceli kelimelerdir.
İndeksin seviyeleri aşağıdadır.
Veri Setinin İçe Aktarılması ve Bazı Ayarların Yapılması
Okunabilirliğini inceleyeceğimiz metinler burada, cbrt_press_releases.xlsx
isimli excel dosyasında bulunmaktadır. Veri seti, Erdem Başçı ve Yaşar Fatih Karahan arası dönemlerde yayınlanan 148 adet İngilizce duyuru metnini kapsamaktadır. Son veri 2024 yılının Nisan ayına aittir.
= pd.read_excel('cbrt_press_releases.xlsx')
df
'Date'] = pd.to_datetime(df['Date'], dayfirst=True)
df[= df.sort_values(by='Date')
df = df.set_index('Date') df
İndeksin Hesaplanması
def gunning_fog_index(text):
= r'(\b\d+)\.(\d+\b)'
pattern = re.sub(pattern, r'\1,\2', text)
text = text.translate(str.maketrans('', '', '\n\xa0'))
text
= re.split(r'(?<=[.!?])\s+', text)
sentences = len(sentences)
num_sentences
= re.findall(r'\b(?:[a-zA-Z]+(?:-[a-zA-Z]+)?|-)\b', text)
words = len(words)
num_words
= num_words / num_sentences
avg_words_per_sentence
= sum(1 for word in words if syllapy.count(word) >= 3)
num_complex_words
= 0.4 * (avg_words_per_sentence + 100 * (num_complex_words / num_words))
gfi
return round(gfi, 2)
'Gunning_Fog_Index'] = df['Text'].apply(gunning_fog_index) df[
İndeksin Görselleştirilmesi
=(12, 7))
plt.figure(figsize'Gunning_Fog_Index'], c=df['Gunning_Fog_Index'], cmap='coolwarm')
plt.scatter(df.index, df["CBRT's Clarity Rating by Gunning's Fog Index")
plt.title(
plt.text(0.99,
-0.1,
"Based on CBRT's press releases on interest rates.",
='bottom',
verticalalignment='right',
horizontalalignment=plt.gca().transAxes,
transform='gray',
color=10,
fontsize='italic'
fontstyle
)
plt.colorbar() plt.show()
İndeks değeri arttıkça okunabilirliğin zorlaştığını söyleyebiliriz. Tarihsel bazda baktığımızda okunabilirliğin gittikçe zorlaştığını görüyoruz.
= df.groupby('Governor')['Gunning_Fog_Index'].agg(['mean', 'std'])
governor_stats
=(10, 6))
plt.figure(figsize'mean'], governor_stats['std'], color='red', alpha=0.3, s=200)
plt.scatter(governor_stats[
for i, governor in enumerate(governor_stats.index):
'mean'][i], governor_stats['std'][i], governor, fontsize=11)
plt.text(governor_stats[
"Governors' Gunning's Fog Index Rating")
plt.title('Average')
plt.xlabel('Standard Deviation')
plt.ylabel(True)
plt.grid(
plt.text(0.99,
-0.2,
"Based on CBRT's press releases on interest rates.",
='bottom',
verticalalignment='right',
horizontalalignment=plt.gca().transAxes,
transform='gray',
color=10,
fontsize='italic'
fontstyle
) plt.show()
Erdem Başçı ve Murat Çetinkaya dönemlerindeki metinler diğer dönemlere kıyasla daha kolay okunabilir duruyor. Çetinkaya’nın döneminde standart sapma daha düşük olduğu için kolay okunabilirlik Başçı’ya göre daha homojendir. Diğer taraftan, Naci Ağbal ve Yaşar Fatih Karahan dönemlerindeki metinler diğer dönemlere kıyasla daha zor okunabilir duruyor. Karahan’ın döneminde standart sapma daha düşük olduğu için zor okunabilirlik Ağbal’a göre daha homojendir.
textstat
Paketini Neden Kullanmadık?
textstat
paketi yaygın olarak kullanılsa da aşağıdaki görselde görüleceği üzere indeks değerleri arasında ciddi farklılıklar oluşmaktadır.
def textstat_gunning_fog_index(text):
= r'(\b\d+)\.(\d+\b)'
pattern = re.sub(pattern, r'\1,\2', text)
text = text.translate(str.maketrans('', '', '\n\xa0'))
text
= textstat.gunning_fog(text)
gfi
return round(gfi, 2)
'Gunning_Fog_Index_textstat'] = df['Text'].apply(textstat_gunning_fog_index)
df[
=(10, 6))
plt.figure(figsize
plt.scatter('Gunning_Fog_Index'],
df['Gunning_Fog_Index_textstat'],
df[=df['Gunning_Fog_Index'],
c='coolwarm'
cmap
)"Comparison of Gunning's Fog Index Calculation: Manual vs. Using textstat Package", fontsize=14)
plt.title('Manual')
plt.xlabel('textstat Package')
plt.ylabel(
plt.text(0.99,
-0.2,
"Based on CBRT's press releases on interest rates.",
='bottom',
verticalalignment='right',
horizontalalignment=plt.gca().transAxes,
transform='gray',
color=10,
fontsize='italic'
fontstyle
) plt.show()
Teyit etmek için son duyuru metnini (25/04/2024) alalım.
= df.loc['2024-04-25','Text']
text = r'(\b\d+)\.(\d+\b)'
pattern = re.sub(pattern, r'\1,\2', text)
text = text.translate(str.maketrans('', '', '\n\xa0')) text
Benchmark olarak şuradaki web sitesini alabiliriz. İlgili web sitesinin yukarıdaki örnek metin için çıktısı aşağıdaki gibidir.
Manuel hesaplama ile yukarıdaki sonuçları karşılaştıralım.
Cümle sayısı 17.
= re.split(r'(?<=[.!?])\s+', text)
sentences = len(sentences)
num_sentences print(num_sentences)
Kelime sayısı 379. 2 kelime farkı sayılardan geliyor. Sayıları çıkarmıştık.
= re.findall(r'\b(?:[a-zA-Z]+(?:-[a-zA-Z]+)?|-)\b', text)
words = len(words)
num_words print(num_words)
Hece sayısı 750. 3 hecelik fark web sitesi ile kullandığımız syllapy
paketi arasındaki yöntem farklılığından kaynaklanıyor. Örneğin, web sitesinde “ongoing” için hece sayısını 2 verirken, paket ve online ortamdaki kaynaklar 3 veriyor.
= 0
syllable_counter for word in words:
= syllapy.count(word)
word_syllable += word_syllable
syllable_counter print(f"{word}, {word_syllable}")
print(syllable_counter)
İndeks değerini 22.53 buluyoruz. Benchmark aldığımız web sitesi 21.98 buluyor. Pek farklılık yok.
gunning_fog_index(text)
textstat
paketi ise sonucu 15.15 veriyor ki ciddi anlamda sapıyor.
textstat.gunning_fog(text)
Türkçeye Uyarlanan Okunabilirlik Formülleri
Çalışmayı İngilizce metinler üzerinden yapsak da Türkçe metinler üzerinden de okunabilirlik ölçülebilir.
- Ateşman Okunabilirlik Formülü (ülkemizde bu alanda yapılan ilk çalışma)
- Çetinkaya-Uzun Okunabilirlik Formülü
- Bezirci-Yılmaz Okunabilirlik Formülü
- Sönmez Formülü
Gelecek içeriklerde görüşmek dileğiyle.