Bag of Words (BoW), Doğal Dil İşleme (NLP) alanında bir tekniktir. Metin verilerini dilbilgisi ve kelime sırasını dikkate almadan, özellikle sayısal değerlere dönüştürerek makine tarafından okunabilir formata getirmek için yaygın olarak kullanılır. BoW’u anlamak, metin verileriyle çalışan herkes için önemlidir. Python, Bag of Words’ü etkili bir şekilde uygulamak için birden fazla araç ve kütüphane sunar.
Bu eğitimde BoW’a derinlemesine bakacak, kavramlarını tanıtacak, kullanım alanlarını ele alacak ve Python’da ayrıntılı bir uygulamasını adım adım göstereceğiz. Eğitimin sonunda Bag of Words modelini gerçek dünya problemlerine uygulayabileceksiniz. NLP’ye yeni başlıyorsanız, daha fazlası için Python ile Doğal Dil İşleme beceri yolumuza göz atın.
Bag of Words nedir?
Bag of Words, metin verilerinden özellikleri çıkarmak için kullanılan bir tekniktir; metin sınıflandırma ve duygu analizi gibi makine öğrenmesi görevlerinde kullanılır. Bu önemlidir çünkü makine öğrenmesi algoritmaları metin verisini doğrudan işleyemez. Metni sayılara dönüştürme süreci, özellik çıkarımı veya özellik kodlama olarak bilinir.
Bir Bag of Words, bir belgedeki kelimelerin görülme sıklığına dayanır. Süreç, metindeki kelime dağarcığını bulmak ve bunların görülme sıklığını ölçmekle başlar. “Çanta” olarak adlandırılır çünkü kelimelerin sırası ve yapısı dikkate alınmaz, yalnızca görülme durumları önemlidir.
Bag of Words modeli, etrafındaki kelimeleri kullanarak bir hedef kelimeyi tahmin eden ve kelimeler arasındaki anlamsal ilişkileri yakalayan yoğun kelime gömme (embedding) lerini öğrenen Sürekli Bag of Words Modeli’nden (CBOW) farklıdır. CBOW, büyük bir derlem üzerinde eğitilmesini gerektirir ve kelime bağlamının önemli olduğu karmaşık NLP uygulamaları için değerli, düşük boyutlu vektörler üretir.
Boyut
BOW
CBOW
Amaç
Her kelimenin görülme sayısını sayar
Bağlama göre hedef kelimeyi tahmin eder
Çıktı Türü
Yüksek boyutlu, seyrek vektör
Düşük boyutlu, yoğun gömme
Bağlamı Dikkate Alır
Hayır (kelime sırasını yok sayar)
Evet (çevredeki kelimeleri kullanır)
Temsil
Seyrek frekans vektörü
Anlamı yakalayan yoğun vektör
Karmaşıklık
Düşük (eğitim gerektirmez)
Yüksek (büyük bir derlemde eğitim gerektirir)
Tipik Uygulamalar
Metin sınıflandırma, duygu analizi
Kelime gömmeleri, bağlam gerektiren NLP görevleri
Neden Bag of Words Kullanılır?
Bag of Words, birçok NLP görevinde kullanışlıdır; kullanımına ilişkin bazı nedenler şunlardır:
Özellik çıkarımı: Yapılandırılmamış metin verilerini, çeşitli makine öğrenmesi algoritmalarına girdi olarak kullanılabilecek yapılandırılmış verilere dönüştürür.
Basitlik ve verimlilik: BoW hesaplaması basit bir şekilde uygulanır ve küçükten orta büyüklüğe metin derlemlerinde iyi çalışır.
Belge benzerliği: Kosinüs benzerliği gibi tekniklerle metin belgeleri arasındaki benzerlik hesaplanabilir.
Metin sınıflandırma: Naive Bayes gibi tekniklerle birleştirildiğinde, BoW spam sınıflandırma ve duygu analizi gibi metin sınıflandırma görevlerinde etkilidir.
Bununla birlikte, semantik, kelime yapısı veya kelime sırasını dikkate almaması gibi dezavantajları da vardır.
Python’da Bag of Words’ün Uygulanma Adımları
Bir bag-of-words modeli oluşturmak için, bir derlemdeki tüm kelimeleri alır ve her kelime için bir sütun oluştururuz. Satırlar cümleleri temsil eder. Belirli bir kelime cümlede varsa 1, yoksa 0 ile temsil edilir. Sütundaki her kelime tek bir özelliği temsil eder.
Sonuçta seyrek bir matris elde ederiz. Seyrek matris, çok sayıda sıfır içeren matristir.
Veri ön işleme
Python’da bir Bag of Words modeli oluşturmak için birkaç ön işleme adımı gerekir. Bu adımlar arasında tokenleştirme ve durak (stop) kelimelerin kaldırılması bulunur.
Tokenleştirme, bir metni genellikle kelimeler olacak şekilde daha küçük birimlere ayırma işlemidir. Tokenleştirmeyi NLTK ile gerçekleştirebilirsiniz.
Durak kelimeler İngilizce’de "the", "that" ve "a" gibi, bir cümlenin kutbuna (polarity) katkı sağlamayan yaygın kelimelerdir.
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# Download stopwords and tokenizer if you haven't already
nltk.download("punkt")
nltk.download("stopwords")# Example sentence
sentence ="This is an example showing how to remove stop words from a sentence."# Tokenize the sentence into words
words = word_tokenize(sentence)# Get the list of stop words in English
stop_words =set(stopwords.words("english"))# Remove stop words from the sentence
filtered_sentence =[word for word in words if word.lower()notin stop_words]# Join the words back into a sentence
filtered_sentence =" ".join(filtered_sentence)print(filtered_sentence)Altyapı:
Çıktı:
example showing remove stop words sentence.Altyapı:
Kelime dağarcığı oluşturma
Kelime dağarcığı (vocabulary), bir metin derleminde bulunan benzersiz kelimelerin bir koleksiyonudur. Bir kelime dağarcığı oluşturmak, derlemdeki tüm benzersiz kelimeleri toplamak ve görülme sayılarını saymayı içerir. Bu kelime dağarcığı, dil modelleme, kelime gömmeleri ve metin sınıflandırma gibi çeşitli NLP görevleri için kullanışlıdır.
Aşağıdaki kod, derlemdeki kelimelerin basit bir frekans dağılımını oluşturur; bu, bir kelime dağarcığı oluşturma veya metin içeriğini anlama gibi temel NLP görevleri için kullanışlıdır:
corpus değişkeni birkaç örnek cümle tutar. Gerçek uygulamalarda bu, daha büyük ve çeşitli metin verilerini içerir.
vocab = defaultdict(int), kelime frekansı sayımını kolaylaştırır; yeni herhangi bir kelimeyi otomatik olarak 0 ile başlatır ve doğrudan artırıma izin verir.
Her cümle, küçük harfe dönüştürülerek ve düzenli ifadeler kullanılarak kelimeler çıkarılarak tokenleştirilir. \b\w+\bdeseni yalnızca alfasayısal karakterlerden oluşan kelimeleri tanımlar; noktalama işaretlerini ve diğer sembolleri yok sayar.
Her kelimenin sayısı vocab sözlüğünde güncellenir.
Kelime dağarcığı, en sık geçen kelimelerin üstte görülebilmesini sağlamak için azalan düzende frekansa göre sıralanır ve referans için görüntülenir.
import re
# Import the regular expressions module to help with text processingfrom collections import(
defaultdict,)# Import defaultdict to easily handle word frequency counting# Sample corpus of text - a small dataset of sentences to analyze
corpus =["Tokenization is the process of breaking text into words.","Vocabulary is the collection of unique words.","The process of tokenizing is essential in NLP.",]# Initialize a defaultdict with integer values to store word frequencies# defaultdict(int) initializes each new key with a default integer value of 0
vocab = defaultdict(int)# Loop through each sentence in the corpus to tokenize and normalizefor sentence in corpus:# Convert the sentence to lowercase to ensure consistency in counting (e.g., 'Tokenization' and 'tokenization' are treated as the same word)# Use regular expressions to find words composed of alphanumeric characters only
words = re.findall(r"\b\w+\b", sentence.lower())# For each word found, increment its count in the vocab dictionaryfor word in words:
vocab[word]+=1# Convert the defaultdict vocab to a regular dictionary for easier handling and sorting# Sort the dictionary by word frequency in descending order and convert it to a new dictionary
sorted_vocab =dict(sorted(vocab.items(), key=lambda x: x[1], reverse=True))# Display the sorted vocabulary with each word and its frequency countprint("Vocabulary with Frequencies:", sorted_vocab)Altyapı:
Büyük derlemler için kelime dağarcığını elle oluşturmak zaman alıcı olabilir. Scikit-learn’ün CountVectorizer’ı bu süreci otomatikleştirir ve ileride göreceğimiz gibi daha esnek metin işleme olanağı sunar.
Python ile Bag of Words Uygulaması (Sıfırdan)
Python’da sıfırdan basit bir Bag of Words uygulamasıyla başlayalım. Bu, perde arkasındaki yapı taşlarını ve çalışma mantığını anlamanıza yardımcı olacaktır.
Manuel uygulama
Adım 1: Metin Verisinin Ön İşlenmesi
Tokenleştirme, küçük harfe dönüştürme ve noktalama işaretlerini kaldırma dahil olmak üzere metni işlemek için basit bir fonksiyon tanımlayarak başlayacağız.
from collections import defaultdict
import string
# Sample text data: sentences
corpus =["Python is amazing and fun.","Python is not just fun but also powerful.","Learning Python is fun!",]# Function to preprocess textdefpreprocess(text):# Convert to lowercase
text = text.lower()# Remove punctuation
text = text.translate(str.maketrans("","", string.punctuation))# Tokenize: split the text into words
tokens = text.split()return tokens
# Apply preprocessing to the sample corpus
processed_corpus =[preprocess(sentence)for sentence in corpus]print(processed_corpus)Altyapı:
Şimdi, tüm belgeleri tarayıp benzersiz kelimelerin tam bir listesini, yani kelime dağarcığımızı oluşturmalıyız.
# Initialize an empty set for the vocabulary
vocabulary =set()# Build the vocabularyfor sentence in processed_corpus:
vocabulary.update(sentence)# Convert to a sorted list
vocabulary =sorted(list(vocabulary))print("Vocabulary:", vocabulary)Altyapı:
Adım 3: Kelime Sıklıklarını Hesaplama ve Vektörleştirme
Şimdi, işlenmiş derlemdeki her belge için kelime dağarcığındaki her kelimenin sıklığını hesaplayacağız.
defcreate_bow_vector(sentence, vocab):
vector =[0]*len(vocab)# Initialize a vector of zerosfor word in sentence:if word in vocab:
idx = vocab.index(word)# Find the index of the word in the vocabulary
vector[idx]+=1# Increment the count at that indexreturn vector
Altyapı:
Bu noktada, derleminizdeki her belge için bir Bag of Words temsili oluşturmuş olacaksınız.
# Create BoW vector for each sentence in the processed corpus
bow_vectors =[create_bow_vector(sentence, vocabulary)for sentence in processed_corpus]print("Bag of Words Vectors:")for vector in bow_vectors:print(vector)Altyapı:
Bag of Words modelini elle kurmak öğrenmek için iyidir; ancak üretim uygulamaları için Scikit-learn gibi verimli ve optimize kütüphaneleri kullanmak isteyeceksiniz.
Tokenleştirme için kullandığımız Python fonksiyonu, sklearn.feature_extraction.text içinden içe aktarılan CountVectorizer’dır. CountVectorizer’ın özelliklerinden biri max_features’tır; bu, bag of words modelinde bulunmasını istediğiniz azami kelime sayısını temsil eder. Bu örnekte None kullanıyoruz; bu da tüm özelliklerin kullanılacağı anlamına gelir.
Bir CountVectorizer örneği oluşturduktan sonra, bag of words modelini oluşturmak için .fit_transform() yöntemini kullanın. Ardından, bag of words modelini bir makine öğrenmesi modeline beslenebilecek numpy dizilerine dönüştürmek için .toarray() kullanın.
Uygulama tamamlandığında CountVectorizer, özellik indekslerinin bir sözlüğünü oluşturmuş olur. Kelime dağarcığındaki bir kelimenin indeks değeri, tüm eğitim derlemi boyunca frekansı ile ilişkilendirilir.
from sklearn.feature_extraction.text import CountVectorizer
# Original corpus
corpus =["Python is amazing and fun.","Python is not just fun but also powerful.","Learning Python is fun!",]# Create a CountVectorizer Object
vectorizer = CountVectorizer()# Fit and transform the corpus
X = vectorizer.fit_transform(corpus)# Print the generated vocabularyprint("Vocabulary:", vectorizer.get_feature_names_out())# Print the Bag-of-Words matrixprint("BoW Representation:")print(X.toarray())Altyapı:
Tüm süreci göstermek için şimdi BoW modelini üç film eleştirisinden oluşan küçük bir metin derlemine uygulayalım.
Bu küçük metin derlemine BoW modelini uygulamak için Scikit-learn’ün CountVectorizer’ını kullanacağız.
İzleyeceğimiz adımlar şunlardır:
CountVectorizer metni tokenleştirir, noktalama işaretlerini kaldırır ve kelimeleri otomatik olarak küçük harfe çevirir.
.fit_transform(corpus), derlemi bir belge-terim matrisine dönüştürür; burada her satır bir belgeyi, her sütun ise kelime dağarcığındaki bir kelimeyi temsil eder.
X_dense, her belgede her kelimenin sıklığını temsil eden yoğun matristir.
from sklearn.feature_extraction.text import CountVectorizer
# Sample corpus of movie reviews
corpus =["I loved the movie, it was fantastic!","The movie was okay, but not great.","I hated the movie, it was terrible.",]# Initialize the CountVectorizer
vectorizer = CountVectorizer()# Fit and transform the corpus to a document-term matrix
X = vectorizer.fit_transform(corpus)# Convert the document-term matrix into a dense format (optional for visualization)
X_dense = X.toarray()# Get the vocabulary (mapping of words to index positions)
vocab = vectorizer.get_feature_names_out()# Print the vocabulary and document-term matrixprint("Vocabulary:", vocab)print("Document-Term Matrix:\n", X_dense)Altyapı:
Çıktı:
Vocabulary:['but''fantastic''great''hated''it''loved''movie''not''okay''terrible''the''was']
Document-Term Matrix:[[010011100011]# First review: "I loved the movie, it was fantastic!"[101010111011]# Second review: "The movie was okay, but not great."[000110100111]]# Third review: "I hated the movie, it was terrible."Altyapı:
Yukarıdaki çıktıyı şu şekilde yorumlayabiliriz:
Derlemdeki her benzersiz kelimeye bir indeks atanır ve kelimeler alfabetik olarak sıralanır. Örneğin, "but" 0. indekste, "fantastic" 1. indekste, "movie" 6. indekste yer alır, vb.
Belge matrisindeki her satır bir film eleştirisini, her sütun ise kelime dağarcığındaki bir kelimeyi ifade eder. Matristeki değerler, ilgili belgede her bir kelimenin sıklığını temsil eder.
Birinci İnceleme: [0 1 0 0 1 1 1 0 0 0 1 1] şu anlama gelir:
"fantastic" kelimesi bir kez geçer (1, indeks 1’de),
"loved" kelimesi bir kez geçer (1, indeks 5’te),
"movie" kelimesi bir kez geçer (1, indeks 6’da),
"it" kelimesi bir kez geçer (1, indeks 4’te),
Ve benzeri.
BoW vektörü şu şekilde yorumlanabilir:
Her belge, kelime sayımlarını temsil eden sayıların bir vektörüdür. Vektörün boyutları, kelime dağarcığının boyutuna eşittir. Bu durumda kelime dağarcığı 12 kelimeden oluşur; dolayısıyla her eleştiri 12 boyutlu bir vektöre dönüştürülür.
Her satırdaki kelimelerin çoğu sıfırdır; çünkü her belge, kelime dağarcığındaki her kelimeyi içermez. Bu nedenle BoW modelleri genellikle seyrektir; yani birçok sıfır içerir.
Bag of Words’ün Avantajları ve Sınırlamaları
Şimdi Bag of Words modelinin bazı avantaj ve sınırlamalarını ele alalım.
Avantajlar
Uygulaması ve yorumlaması basittir: Bag of Words, en doğrudan metin temsil tekniklerinden biridir ve bu da onu yeni başlayanlar için ideal kılar. Basitliği, karmaşık ön işleme veya özelleşmiş modellere gerek olmadan hızlı uygulamaya olanak tanır.
Metin sınıflandırma görevlerinde kullanımı kolaydır: Bag of Words, metin sınıflandırma, duygu analizi ve spam tespiti gibi temel görevler için uygundur. Bu görevler çoğu zaman sofistike dil modelleri gerektirmez; bu nedenle BOW temsili yeterli ve verimlidir.
Sınırlamalar
Kelime dağarcığı boyutu, temsillerin seyreklik düzeyini etkiler: Kelime dağarcığı büyüdükçe temsil daha seyrek ve yüksek boyutlu hale gelir. Bu seyreklik, modellerin etkili şekilde öğrenmesini zorlaştırabilir ve aşırı hesaplama maliyetlerinden kaçınmak için kelime dağarcığı boyutunun dikkatle ayarlanmasını gerektirir.
Hesaplama açısından maliyetli seyrek matrisler üretir: Her belge, potansiyel olarak büyük bir kelime dağarcığındaki her kelimenin sıklığıyla temsil edildiği için, ortaya çıkan matrisler çoğu zaman büyük ölçüde sıfırlardan oluşur; bu da makine öğrenmesi boru hatlarında depolama ve işlemeyi verimsiz kılabilir. Seyrek matrisler önemli miktarda bellek tüketir ve özellikle büyük veri kümelerinde verimli depolama ve hesaplama için sıklıkla özel araç ve kütüphaneler gerektirir.
Anlam ve bağlamı kaybeder: BOW, kelime sırasını ve cümle yapısını göz ardı eder; bu da dilbilgisel ilişkilerin ve anlamın kaybına yol açar. Bu sınırlama, bağlamın, nüansın ve kelime sırasının önemli olduğu çeviri veya karmaşık cümlelerde duygu tespiti gibi görevler için onu daha az uygun kılar.
Bag of Words’te kelime dağarcığının boyutunu azaltmak için şu stratejiler kullanılabilir:
Büyük-küçük harf farkını yok sayma.
Noktalama işaretlerini kaldırma.
Durak kelimeleri (the ve a gibi yaygın kelimeler) kaldırma.
Tüm kelimelerin doğru yazıldığından emin olma.
Kelimeleri kök biçimlerine indirgemek için gövdeleme (stemming) tekniklerini kullanma.
Sonraki Adımlar: Bag of Words’ün Ötesi
Bag of Words modelinin sınırlamalarından biri, tüm kelimeleri eşit şekilde ele almasıdır. Ne yazık ki bu, bazı kelimelerin yalnızca sık göründükleri için gereğinden fazla önem kazanmasına yol açabilir.
TF-IDF (Terim Frekansı - Ters Belge Frekansı) bu soruna bir çözümdür; çünkü kelimelerin ağırlığını tüm belgeler boyunca ne kadar sık göründüklerine göre ayarlar.
TF-IDF: Bag of Words’e Bir Uzantı
Terim Frekansı (TF), bir belgede bir terimin görülme sıklığını temsil eder. Ters Belge Frekansı (IDF), birden çok belgede yaygın olarak geçen kelimelerin etkisini azaltır. TF-IDF puanı bu iki ölçütün çarpımıyla hesaplanır.
200 kelime içeren bir belge düşünün; love kelimesi 5 kez geçiyor olsun. love için TF (5 / 200) = 0,025’tir. Bir milyon belgemiz olduğunu ve love kelimesinin bunların bininde geçtiğini varsayalım; bu durumda ters belge sıklığı (IDF) log(1000000 / 1000) = 3 olarak hesaplanır. TF-IDF ağırlığı bu iki değerin çarpımıdır: 0,025 * 3 = 0,075.
Scikit-learn’de bu, TfidfVectorizer sınıfı kullanılarak nispeten kolayca hesaplanır.
from sklearn.feature_extraction.text import TfidfVectorizer
# Sample corpus
corpus =["Python is amazing and fun.","Python is not just fun but also powerful.","Learning Python is fun!",]# Create the Tf-idf vectorizer
tfidf_vectorizer = TfidfVectorizer()# Fit and transform the corpus
X_tfidf = tfidf_vectorizer.fit_transform(corpus)# Show the Vocabularyprint("Vocabulary:", tfidf_vectorizer.get_feature_names_out())# Show the TF-IDF Matrixprint("TF-IDF Representation:")print(X_tfidf.toarray())Altyapı:
Yukarıda uygulanan TF-IDF matrisi, ham frekanslar yerine ağırlıklı bir ölçüm sağlar.
Bag of Words modelinin, özellikle daha büyük ve karmaşık veri kümeleri için sınırlamaları olsa da, birçok NLP uygulamasında hâlâ temel bir yapı taşıdır. Bunu anlamak, kelime gömmeleri ve Transformerlar gibi daha gelişmiş modelleri keşfederken size yardımcı olacaktır.
Buradan, projelerinizde BoW ile deneyler yapabilirsiniz; örneğin spam tespiti, duygu analizi, belge kümeleme ve daha fazlası.
Bag of Words’ün ötesinde daha fazla iyileştirme isterseniz, Word2Vec ve GloVe gibi yöntemleri veya BERT gibi derin öğrenme modellerini inceleyebilirsiniz.
Son Düşünceler
Bag of Words tekniği, Doğal Dil İşleme’de kullanılan temel bir tekniktir. Yapılandırılmamış metni, makine öğrenmesi algoritmaları tarafından kullanılabilir sayısal özelliklere dönüştürmenin basit ama etkili bir yolunu sunar. Bu eğitimde şunları ele aldık:
Bag of Words (BoW) modeli nedir?
Makine öğrenmesi modelleri kurmada Bag of Words modelinin faydaları.
Bag of Words modelinin Python’da nasıl uygulanacağı.
Bag of Words’ün avantajları ve sınırlamaları.
Bag of Words modelinin arkasındaki teori ve motivasyon.
Geleneksel Bag of Words yaklaşımına bir iyileştirme olarak TF-IDF’in tanıtımı.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Python'da Doğal Dil İşleme (NLP) ile kitaplardan, inceleme sitelerinden ve çevrimiçi makalelerden transkripsiyon yapmayı ve heyecan verici içgörüler elde etmeyi öğrenin.
Bag of Words (BoW), Doğal Dil İşleme (NLP) alanında bir tekniktir. Metin verilerini dilbilgisi ve kelime sırasını dikkate almadan, özellikle sayısal değerlere dönüştürerek makine tarafından okunabilir formata getirmek için yaygın olarak kullanılır. BoW’u anlamak, metin verileriyle çalışan herkes için önemlidir. Python, Bag of Words’ü etkili bir şekilde uygulamak için birden fazla araç ve kütüphane sunar.
Bu eğitimde BoW’a derinlemesine bakacak, kavramlarını tanıtacak, kullanım alanlarını ele alacak ve Python’da ayrıntılı bir uygulamasını adım adım göstereceğiz. Eğitimin sonunda Bag of Words modelini gerçek dünya problemlerine uygulayabileceksiniz. NLP’ye yeni başlıyorsanız, daha fazlası için Python ile Doğal Dil İşleme beceri yolumuza göz atın.
Bag of Words nedir?
Bag of Words, metin verilerinden özellikleri çıkarmak için kullanılan bir tekniktir; metin sınıflandırma ve duygu analizi gibi makine öğrenmesi görevlerinde kullanılır. Bu önemlidir çünkü makine öğrenmesi algoritmaları metin verisini doğrudan işleyemez. Metni sayılara dönüştürme süreci, özellik çıkarımı veya özellik kodlama olarak bilinir.
Bir Bag of Words, bir belgedeki kelimelerin görülme sıklığına dayanır. Süreç, metindeki kelime dağarcığını bulmak ve bunların görülme sıklığını ölçmekle başlar. “Çanta” olarak adlandırılır çünkü kelimelerin sırası ve yapısı dikkate alınmaz, yalnızca görülme durumları önemlidir.
Bag of Words modeli, etrafındaki kelimeleri kullanarak bir hedef kelimeyi tahmin eden ve kelimeler arasındaki anlamsal ilişkileri yakalayan yoğun kelime gömme (embedding) lerini öğrenen Sürekli Bag of Words Modeli’nden (CBOW) farklıdır. CBOW, büyük bir derlem üzerinde eğitilmesini gerektirir ve kelime bağlamının önemli olduğu karmaşık NLP uygulamaları için değerli, düşük boyutlu vektörler üretir.
Boyut
BOW
CBOW
Amaç
Her kelimenin görülme sayısını sayar
Bağlama göre hedef kelimeyi tahmin eder
Çıktı Türü
Yüksek boyutlu, seyrek vektör
Düşük boyutlu, yoğun gömme
Bağlamı Dikkate Alır
Hayır (kelime sırasını yok sayar)
Evet (çevredeki kelimeleri kullanır)
Temsil
Seyrek frekans vektörü
Anlamı yakalayan yoğun vektör
Karmaşıklık
Düşük (eğitim gerektirmez)
Yüksek (büyük bir derlemde eğitim gerektirir)
Tipik Uygulamalar
Metin sınıflandırma, duygu analizi
Kelime gömmeleri, bağlam gerektiren NLP görevleri
Neden Bag of Words Kullanılır?
Bag of Words, birçok NLP görevinde kullanışlıdır; kullanımına ilişkin bazı nedenler şunlardır:
Bununla birlikte, semantik, kelime yapısı veya kelime sırasını dikkate almaması gibi dezavantajları da vardır.
Python’da Bag of Words’ün Uygulanma Adımları
Bir bag-of-words modeli oluşturmak için, bir derlemdeki tüm kelimeleri alır ve her kelime için bir sütun oluştururuz. Satırlar cümleleri temsil eder. Belirli bir kelime cümlede varsa 1, yoksa 0 ile temsil edilir. Sütundaki her kelime tek bir özelliği temsil eder.
Sonuçta seyrek bir matris elde ederiz. Seyrek matris, çok sayıda sıfır içeren matristir.
Veri ön işleme
Python’da bir Bag of Words modeli oluşturmak için birkaç ön işleme adımı gerekir. Bu adımlar arasında tokenleştirme ve durak (stop) kelimelerin kaldırılması bulunur.
Tokenleştirme, bir metni genellikle kelimeler olacak şekilde daha küçük birimlere ayırma işlemidir. Tokenleştirmeyi NLTK ile gerçekleştirebilirsiniz.
Durak kelimeler İngilizce’de "the", "that" ve "a" gibi, bir cümlenin kutbuna (polarity) katkı sağlamayan yaygın kelimelerdir.
Çıktı:
Kelime dağarcığı oluşturma
Kelime dağarcığı (vocabulary), bir metin derleminde bulunan benzersiz kelimelerin bir koleksiyonudur. Bir kelime dağarcığı oluşturmak, derlemdeki tüm benzersiz kelimeleri toplamak ve görülme sayılarını saymayı içerir. Bu kelime dağarcığı, dil modelleme, kelime gömmeleri ve metin sınıflandırma gibi çeşitli NLP görevleri için kullanışlıdır.
Aşağıdaki kod, derlemdeki kelimelerin basit bir frekans dağılımını oluşturur; bu, bir kelime dağarcığı oluşturma veya metin içeriğini anlama gibi temel NLP görevleri için kullanışlıdır:
defaultdict(int), kelime frekansı sayımını kolaylaştırır; yeni herhangi bir kelimeyi otomatik olarak 0 ile başlatır ve doğrudan artırıma izin verir.\b\w+\bdeseni yalnızca alfasayısal karakterlerden oluşan kelimeleri tanımlar; noktalama işaretlerini ve diğer sembolleri yok sayar.Çıktı:
Büyük derlemler için kelime dağarcığını elle oluşturmak zaman alıcı olabilir. Scikit-learn’ün CountVectorizer’ı bu süreci otomatikleştirir ve ileride göreceğimiz gibi daha esnek metin işleme olanağı sunar.
Python ile Bag of Words Uygulaması (Sıfırdan)
Python’da sıfırdan basit bir Bag of Words uygulamasıyla başlayalım. Bu, perde arkasındaki yapı taşlarını ve çalışma mantığını anlamanıza yardımcı olacaktır.
Manuel uygulama
Adım 1: Metin Verisinin Ön İşlenmesi
Tokenleştirme, küçük harfe dönüştürme ve noktalama işaretlerini kaldırma dahil olmak üzere metni işlemek için basit bir fonksiyon tanımlayarak başlayacağız.
Çıktı:
Adım 2: Kelime Dağarcığını Oluşturma
Şimdi, tüm belgeleri tarayıp benzersiz kelimelerin tam bir listesini, yani kelime dağarcığımızı oluşturmalıyız.
Adım 3: Kelime Sıklıklarını Hesaplama ve Vektörleştirme
Şimdi, işlenmiş derlemdeki her belge için kelime dağarcığındaki her kelimenin sıklığını hesaplayacağız.
Bu noktada, derleminizdeki her belge için bir Bag of Words temsili oluşturmuş olacaksınız.
Çıktı:
Scikit-learn’ün CountVectorizer’ını Kullanma
Bag of Words modelini elle kurmak öğrenmek için iyidir; ancak üretim uygulamaları için Scikit-learn gibi verimli ve optimize kütüphaneleri kullanmak isteyeceksiniz.
Tokenleştirme için kullandığımız Python fonksiyonu,
sklearn.feature_extraction.textiçinden içe aktarılan CountVectorizer’dır.CountVectorizer’ın özelliklerinden birimax_features’tır; bu, bag of words modelinde bulunmasını istediğiniz azami kelime sayısını temsil eder. Bu örnekte None kullanıyoruz; bu da tüm özelliklerin kullanılacağı anlamına gelir.Bir
CountVectorizerörneği oluşturduktan sonra, bag of words modelini oluşturmak için.fit_transform() yöntemini kullanın. Ardından, bag of words modelini bir makine öğrenmesi modeline beslenebilecek numpy dizilerine dönüştürmek için.toarray()kullanın.Uygulama tamamlandığında CountVectorizer, özellik indekslerinin bir sözlüğünü oluşturmuş olur. Kelime dağarcığındaki bir kelimenin indeks değeri, tüm eğitim derlemi boyunca frekansı ile ilişkilendirilir.
Çıktı:
Örnek: Bag of Words Uygulaması
Tüm süreci göstermek için şimdi BoW modelini üç film eleştirisinden oluşan küçük bir metin derlemine uygulayalım.
Bu küçük metin derlemine BoW modelini uygulamak için Scikit-learn’ün CountVectorizer’ını kullanacağız.
İzleyeceğimiz adımlar şunlardır:
CountVectorizermetni tokenleştirir, noktalama işaretlerini kaldırır ve kelimeleri otomatik olarak küçük harfe çevirir..fit_transform(corpus), derlemi bir belge-terim matrisine dönüştürür; burada her satır bir belgeyi, her sütun ise kelime dağarcığındaki bir kelimeyi temsil eder.X_dense, her belgede her kelimenin sıklığını temsil eden yoğun matristir.Çıktı:
Yukarıdaki çıktıyı şu şekilde yorumlayabiliriz:
BoW vektörü şu şekilde yorumlanabilir:
Bag of Words’ün Avantajları ve Sınırlamaları
Şimdi Bag of Words modelinin bazı avantaj ve sınırlamalarını ele alalım.
Avantajlar
Sınırlamalar
Bag of Words’te kelime dağarcığının boyutunu azaltmak için şu stratejiler kullanılabilir:
Sonraki Adımlar: Bag of Words’ün Ötesi
Bag of Words modelinin sınırlamalarından biri, tüm kelimeleri eşit şekilde ele almasıdır. Ne yazık ki bu, bazı kelimelerin yalnızca sık göründükleri için gereğinden fazla önem kazanmasına yol açabilir.
TF-IDF (Terim Frekansı - Ters Belge Frekansı) bu soruna bir çözümdür; çünkü kelimelerin ağırlığını tüm belgeler boyunca ne kadar sık göründüklerine göre ayarlar.
TF-IDF: Bag of Words’e Bir Uzantı
Terim Frekansı (TF), bir belgede bir terimin görülme sıklığını temsil eder. Ters Belge Frekansı (IDF), birden çok belgede yaygın olarak geçen kelimelerin etkisini azaltır. TF-IDF puanı bu iki ölçütün çarpımıyla hesaplanır.
200 kelime içeren bir belge düşünün; love kelimesi 5 kez geçiyor olsun. love için TF (5 / 200) = 0,025’tir. Bir milyon belgemiz olduğunu ve love kelimesinin bunların bininde geçtiğini varsayalım; bu durumda ters belge sıklığı (IDF) log(1000000 / 1000) = 3 olarak hesaplanır. TF-IDF ağırlığı bu iki değerin çarpımıdır: 0,025 * 3 = 0,075.
Scikit-learn’de bu, TfidfVectorizer sınıfı kullanılarak nispeten kolayca hesaplanır.
Çıktı:
Yukarıda uygulanan TF-IDF matrisi, ham frekanslar yerine ağırlıklı bir ölçüm sağlar.
Bag of Words modelinin, özellikle daha büyük ve karmaşık veri kümeleri için sınırlamaları olsa da, birçok NLP uygulamasında hâlâ temel bir yapı taşıdır. Bunu anlamak, kelime gömmeleri ve Transformerlar gibi daha gelişmiş modelleri keşfederken size yardımcı olacaktır.
Buradan, projelerinizde BoW ile deneyler yapabilirsiniz; örneğin spam tespiti, duygu analizi, belge kümeleme ve daha fazlası.
Bag of Words’ün ötesinde daha fazla iyileştirme isterseniz, Word2Vec ve GloVe gibi yöntemleri veya BERT gibi derin öğrenme modellerini inceleyebilirsiniz.
Son Düşünceler
Bag of Words tekniği, Doğal Dil İşleme’de kullanılan temel bir tekniktir. Yapılandırılmamış metni, makine öğrenmesi algoritmaları tarafından kullanılabilir sayısal özelliklere dönüştürmenin basit ama etkili bir yolunu sunar. Bu eğitimde şunları ele aldık:
Doğal dil işlemeye derinlemesine dalmak için Python ile Doğal Dil İşleme beceri yolumuza göz atın.