Gensim - TF-IDF Matrisi Oluşturma
Burada Gensim yardımıyla Terim Frekans-Ters Belge Frekans (TF-IDF) Matrisi oluşturmayı öğreneceğiz.
TF-IDF nedir?
Aynı zamanda bir kelime torbası modeli olan Terim Frekansı-Ters Doküman Frekansı modelidir. Düzenli külliyattan farklıdır çünkü belirteçlere ağırlık verir, yani belgeler arasında sıklıkla görünen sözcükler. Başlatma sırasında, bu tf-idf modeli algoritması, tamsayı değerlerine sahip bir eğitim külliyatını bekler (Kelime Çantası modeli gibi).
Daha sonra dönüşüm anında bir vektör gösterimi alır ve başka bir vektör gösterimi döndürür. Çıktı vektörü aynı boyutluluğa sahip olacak ancak nadir özelliklerin değeri (eğitim sırasında) artacaktır. Temel olarak tam sayı değerli vektörleri gerçek değerli vektörlere dönüştürür.
Nasıl Hesaplanır?
TF-IDF modeli, iki basit adımı takip ederek tfidf'yi hesaplar -
Adım 1: Yerel ve genel bileşeni çarpma
Bu ilk adımda, model TF (Terim Frekansı) gibi yerel bir bileşeni IDF (Ters Belge Frekansı) gibi global bir bileşenle çarpacaktır.
Adım 2: Sonucu Normalleştirin
Çarpma ile yapıldığında, bir sonraki adımda TFIDF modeli sonucu birim uzunluğa göre normalleştirecektir.
Yukarıdaki iki adımın bir sonucu olarak, belgeler arasında sıkça meydana gelen sözcüklerin ağırlığı düşecektir.
TF-IDF Ağırlıkları nasıl alınır?
Burada, TF-IDF ağırlıklarını nasıl elde edebileceğimizi görmek için bir örnek uygulayacağız. Temel olarak, TF-IDF ağırlıklarını elde etmek için önce külliyatın eğitimini vermemiz ve sonra bu külliyatı tfidf modelinde uygulamamız gerekir.
Corpus'u eğitin
Yukarıda belirtildiği gibi, TF-IDF'yi almak için önce külliyatımızı eğitmemiz gerekir. Öncelikle, gerekli tüm paketleri aşağıdaki gibi içe aktarmamız gerekiyor -
import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
Şimdi cümleleri içeren listeyi sağlayın. Listemizde üç cümle var -
doc_list = [
"Hello, how are you?", "How do you do?",
"Hey what are you doing? yes you What are you doing?"
]
Ardından, cümleleri aşağıdaki gibi belirtiniz:
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
Bir nesne oluştur corpora.Dictionary() aşağıdaki gibi -
dictionary = corpora.Dictionary()
Şimdi bu belirtilmiş cümleleri dictionary.doc2bow() aşağıdaki gibi nesne -
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
Daha sonra, belgelerimizde kimlikleri ve frekanslarını alacağız.
for doc in BoW_corpus:
print([[dictionary[id], freq] for id, freq in doc])
Çıktı
[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]
Bu şekilde, külliyatımızı (Kelime Çantası külliyatını) eğitmiş olduk.
Daha sonra, bu eğitimli derlemi tfidf modeli içinde uygulamalıyız. models.TfidfModel().
Önce numpay paketini içe aktarın -
import numpy as np
Şimdi eğitilmiş külliyatımızı (BoW_corpus) köşeli parantezler içinde uygulayarak models.TfidfModel()
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
Daha sonra, tfidf modellenmiş derlememizde kimlikler kelimesini ve frekanslarını alacağız -
for doc in tfidf[BoW_corpus]:
print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])
Çıktı
[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]
[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]
[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]
Yukarıdaki çıktılardan dökümanlarımızdaki kelimelerin frekanslarındaki farklılığı görüyoruz.
Eksiksiz Uygulama Örneği
import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
"Hello, how are you?", "How do you do?",
"Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])
Sözcük Ağırlığı Farkı
Yukarıda tartışıldığı gibi, belgede daha sık yer alacak sözcükler daha küçük ağırlıkları alacaktır. Yukarıdaki iki çıktıdan kelimelerin ağırlıklarındaki farkı anlayalım. Kelime‘are’iki belgede oluşur ve ağırlıklandırılmıştır. Benzer şekilde, kelime‘you’ tüm belgelerde görünür ve tamamen kaldırılır.