NLP (Doğal Dil İşleme), insan dilini anlamak, üretmek, çevirmek ve yorumlamak için bilgisayar sistemleri ve yapay zeka algoritmaları kullanarak doğal dil verilerini işleyen bir bilgisayar bilimi dalıdır. NLP, birçok farklı teknoloji ve uygulamayı içerir, örneğin: metin sınıflandırma, kelime ve cümle öğrenme, duygu analizi, konuşma tanıma, çeviri ve daha pek çok şey. NLP, doğal dilin zenginliği ve çeşitliliği nedeniyle oldukça karmaşık bir alandır ve araştırmacılar tarafından halen geliştirilmekte olan birçok zorluğu bulunmaktadır. Bu yazıda python programlama dili kullanılarak NLP üzerine bir çalışma anlatacağım.

nlp
NLP

NLP Veri Ön İşleme ve Görselleştirme

  • Öncelikle kullanacağımız kütüphaneleri (nltk, pandas, matplotlib, textblob, wordcloud) içeri atalım ve metin verilerinin analiz edilmesi ve görselleştirilmesi için gerekli araçları yükleyelim.

from warnings import filterwarnings
import matplotlib.pyplot as plt
import nltk
import pandas as pd
from textblob import Word, TextBlob
from wordcloud import WordCloud

warnings modülünden filterwarnings fonksiyonu, olası hata, uyarı mesajlarını filtrelemek için kullanılır.

matplotlib.pyplot modülünden plt kısaltması (aliası), grafiklerin oluşturulması yani veri görselleştirme için kullanılır.

nltk modülü, doğal dil işleme (natural language processing) için kullanılan bir kütüphanedir. Bu kütüphaneden “corpus” alt kütüphanesi içindeki “stopwords” fonksiyonu import edilir. Bu, İngilizce’deki yaygın kelimeleri (common words) içeren bir liste sağlar ve genellikle metin ön işleme (text preprocessing) sırasında kullanılır.

Pandas” kütüphanesi, veri manipülasyonu (data manipulation) ve analizi için kullanılan bir kütüphanedir. Bu kütüphaneden “pd” adlı bir kısaltma (alias) import edilir.

TextBlob kütüphanesi, NLP ile ilgili işlemler için kullanılır. Bu örnekte, Word modülü ile birlikte kullanılarak, metin veri kümesindeki kelimelerin köklerini çıkarmak için kullanılır.

wordcloud modülü, metin verilerinin görselleştirilmesi için kullanılan bir kütüphanedir ve kelime bulutları oluşturmak için kullanılır.

  • Daha sonra veri setimizi okutup, inceleyelim.
filterwarnings('ignore')
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 200)
pd.set_option('display.float_format', lambda x: '%.2f' % x)

df = pd.read_csv("/Users/Asli1/datasets/wiki_data.csv")
df.head()

Bu işlem, öncelikle warnings kütüphanesinden filterwarnings fonksiyonunu çağırarak uyarı mesajlarının gösterilmesini engeller. Ardından pandas kütüphanesindeki set_option fonksiyonu ile veri çerçevesinin sütunlarının tamamını göstermek için display.max_columns özelliği tanımlanır, display.width özelliği ile sütun genişliği belirlenir ve display.float_format özelliği ile virgülden sonra iki basamak gösterilmesi sağlanır. Daha sonra, /Users/Asli1/datasets/wiki_data.csv yolundaki (tabi ki siz buraya bir CSV dosyasını read_csv fonksiyonu ile okuyarak bir veri çerçevesi olarak df değişkenine atanır. head fonksiyonu, veri çerçevesinin ilk beş satırını ekrana yazdırır.

Çıktı;

NLP

  • Sırada metin temizleme var. NLP (Doğal Dil İşleme) uygulamalarında sıkça kullanılan bir fonksiyon yazalım.
def clean_text(dataframe, column="text"):
    # Harf dönüşümü
    dataframe[column] = dataframe[column].str.lower()
    # Noktalama işaretleri
    dataframe[column] = dataframe[column].str.replace("[^\w\s]", "")
    # Numerik ifadeler
    dataframe[column] = dataframe[column].str.replace("\d", "")
    dataframe["text"] = dataframe["text"].str.replace("\s+", " ", regex=True)
    return dataframe

Bu işlem bir metin temizleme fonksiyonudur. Fonksiyon, verilen bir pandas DataFrame’deki belirtilen sütundaki metin verilerini temizler. Temizleme işlemleri şunları içerir:

  1. Tüm harflerin küçük harfe dönüştürülmesi.
  2. Noktalama işaretlerinin kaldırılması.
  3. Numerik ifadelerin kaldırılması.
  4. Birden fazla boşluğun tek bir boşlukla değiştirilmesi.
  • Yazdığımız fonksiyonu veri seti içerisindeki tüm metinlere uygulayalım.
df = clean_text(df)
df.head()

Çıktı;

 

  • Metin içerisinden öz nitelik çıkarırken önemli olmayan kelimeleri çıkaracak fonksiyonu yazalım.
def remove_stopwords(dataframe):
    stopwords = nltk.corpus.stopwords.words("english")
    dataframe["text"] = dataframe["text"].apply(lambda x: " ".join(x for x in x.split() if x not in stopwords))
    return dataframe

Bu işlem verilen DataFrame’deki metin sütunundaki stop words olarak adlandırılan yaygın ve anlamsız kelimeleri kaldırmaya yarayan bir fonksiyondur. Bu fonksiyon, öncelikle “ingilizce” dilindeki stop words listesini yükler ve ardından DataFrame’deki metin sütunundaki her bir kelime için, eğer o kelime stop words listesinde yer almıyorsa, o kelimeyi korur ve tüm diğer kelimeleri listeden çıkarır. Sonuç olarak, DataFrame’deki metin sütunundaki her bir gözlem, stop words’lerden arındırılmış bir şekilde güncellenmiş olur.

  • Yazdığımız fonksiyonu veri seti içerisindeki tüm metinlere uygulayalım.
df = remove_stopwords(df)
df.head()

Çıktı;

  • Şimdi de metinde az geçen kelimeleri bulup onları metinden çıkaralım.
temp_df = pd.Series(" ".join(df["text"]).split()).value_counts()
drops = temp_df[temp_df <= 2000]
df["text"] = df["text"].apply(lambda x: " ".join(x for x in x.split() if x not in drops))
df.head()

Bu işlem, veri setindeki sık kullanılan kelime öbeklerini (burada 2000’den az tekrarlanan kelimeler) kaldırmak için bir yöntemdir. İlk olarak, veri setindeki tüm kelime öbekleri sayılarak, sık kullanılanlar belirlenir. Daha sonra, bu sık kullanılan kelime öbekleri, her satırdaki kelimelerden çıkarılır. Bu işlem, veri setindeki gürültüyü azaltır ve daha önemli bilgilerin ortaya çıkmasına yardımcı olur.

Çıktı;

  • Metinleri tokenize edip sonuçlara bakalım.
df["text"].apply(lambda x: TextBlob(x).words).head()

Bu işlem, df veri çerçevesindeki “text” sütunundaki her bir kelimeyi TextBlob kütüphanesi kullanarak ayırmak için bir lambda fonksiyonu kullanır. TextBlob kelime dizilerini “kelime” nesneleri olarak temsil eder, bu nedenle bu işlem, her bir kelimeyi ayrı bir nesne olarak temsil eden bir liste döndürür.

Çıktı;

  • Lemmatization işlemi yapalım. ( Lemmatization, bir kelimenin kökünü bulmak için kullanılan bir doğal dil işleme tekniğidir. )
df['text'] = df['text'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))

Çıktı;

  • Veriyi görselleştirerek metindeki terimlerin frekanslarına bakalım.
tf = df["text"].apply(lambda x: pd.value_counts(x.split(" "))).sum(axis=0).reset_index()
tf.columns = ["words", "tf"]
tf.sort_values("tf", ascending=False)

Bu işlem, veri kümesindeki tüm belgelerin içinde geçen kelime frekanslarını hesaplar. İlk olarak, her belgenin metni, boşluklarla ayrılmış kelimelere ayrılır. Ardından, her kelimenin frekansı hesaplanır ve tüm belgelerin içinde geçen toplam kelime frekansları hesaplanarak bir veri çerçevesi oluşturulur. Son olarak, kelime frekanslarına göre sıralama yapılır ve en yüksek frekanslı kelimeler en üstte yer alır.

Çıktı;

.

Terimlerin frekanslarına bir de bar grafiği üzerinden bakalım.

tf[tf["tf"] > 7000].plot.bar(x="words", y="tf")
plt.show()
Frekansların Bar Grafiği ile Gösterimi
  • Kelimeleri WordCloud ile görselleştirelim.
text = " ".join(i for i in df["text"])
worldcloud = WordCloud(background_color="white").generate(text)
plt.figure()
plt.imshow(worldcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
WordCloud

Bu yazıda, bir metin veri setinde bazı ön işleme işlemleri yaparak, verinin daha iyi anlaşılmasını sağladık. İlk önce, metnin uygun olmayan şeyleri (büyük küçük harf dönüşümü, numerik ifadeleri çıkarma, vb.) düzenledik. Daha sonra, metinde önemli olmayan kelimeleri (stopwords) çıkartmak için stopword listesi kullandık. Ardından, metinde az geçen kelimeleri belirlenen bir sınır ile filtreledik ve metinden çıkardık. Sonra metinleri tokenize ettik ve lemmatization işlemi uyguladık. Daha sonra, her kelimenin frekansını hesapladık ve belirlenen sınırın üzerindeki kelimelerin bar grafiğini oluşturduk. Ayrıca, kelime bulutu (wordcloud) ile kelimelerin görselleştirilmesini sağladık. İyi Çalışmalar!


 

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir