Gensim - Vektör ve Model

Burada, vektör ve modele odaklanarak Gensim'in temel kavramlarını öğreneceğiz.

Vector nedir?

Ya külliyatımızdaki gizli yapıyı çıkarmak istersek? Bunun için, belgeleri matematiksel olarak işleyebileceğimiz bir şekilde temsil etmemiz gerekiyor. Popüler bir temsil türü, her külliyat belgesini bir özellik vektörü olarak temsil etmektir. Bu nedenle vektörün bir belgenin matematiksel olarak uygun bir temsili olduğunu söyleyebiliriz.

Size bir örnek vermek gerekirse, yukarıda kullandığımız külliyatın tek bir özelliğini QA çifti olarak gösterelim -

Q - Bu kelime kaç kez Hello belgede görünüyor mu?

A - Sıfır (0).

Q - Belgede kaç paragraf var?

A - İki (2)

Soru genellikle tamsayı kimliği ile temsil edilir, bu nedenle bu belgenin temsili (1, 0.0), (2, 2.0) gibi bir dizi çifttir. Bu tür vektör gösterimi, birdensevektör. Nedendenseçünkü yukarıda yazılan tüm sorulara açık bir cevap içermektedir.

Tüm soruları önceden biliyorsanız, temsil (0, 2) gibi basit olabilir. Cevapların bu sekansı (tabii ki sorular önceden biliniyorsa)vector belgemiz için.

Diğer bir popüler temsil türü ise bag-of-word (BoW)model. Bu yaklaşımda, her belge temelde sözlükteki her kelimenin sıklık sayısını içeren bir vektörle temsil edilir.

Size bir örnek vermek gerekirse, ['Merhaba', 'Nasıl', 'siz'] kelimelerini içeren bir sözlüğümüz olduğunu varsayalım. "Nasılsın" dizesini içeren bir belge bu durumda [0, 2, 1, 1] vektörüyle temsil edilir. Burada, vektörün girişleri "Merhaba", "Nasıl", "siz" ve "siz" kelimelerinin geçiş sırasına göre verilmiştir.

Vektör ve Belge

Yukarıdaki vektör açıklamasından, bir belge ile bir vektör arasındaki ayrım neredeyse anlaşılmıştır. Ancak, daha net hale getirmek için,document metin ve vectorbu metnin matematiksel olarak uygun bir temsilidir. Ne yazık ki, bazen birçok insan bu terimleri birbirinin yerine kullanır.

Örneğin, rasgele bir A belgemiz olduğunu varsayalım, "A belgesine karşılık gelen vektör" demek yerine, "A vektörü" veya "A belgesi" derlerdi. Bu büyük bir belirsizliğe yol açar. Burada dikkat edilmesi gereken bir diğer önemli husus, iki farklı belgenin aynı vektör temsiline sahip olabileceğidir.

Korpusu vektör listesine dönüştürme

Korpusu vektörler listesine dönüştürmenin bir uygulama örneğini almadan önce, külliyattaki her kelimeyi benzersiz bir tamsayı kimliği ile ilişkilendirmemiz gerekir. Bunun için yukarıdaki bölümde alınan örneği genişleteceğiz.

Misal

from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

Çıktı

Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)

Bizim külliyatımızda bunun içinde 25 farklı token olduğunu gösteriyor gensim.corpora.Dictionary.

Uygulama Örneği

Sözlüğü, belirteçli belgeleri bu 5 boyutlu vektörlere dönüştürmek için aşağıdaki gibi kullanabiliriz:

pprint.pprint(dictionary.token2id)

Çıktı

{
   'binary': 11,
   'computer': 0,
   'error': 7,
   'generation': 12,
   'graph': 16,
   'intersection': 17,
   'iv': 19,
   'measurement': 8,
   'minors': 20,
   'opinion': 1,
   'ordering': 21,
   'paths': 18,
   'perceived': 9,
   'quasi': 22,
   'random': 13,
   'relation': 10,
   'response': 2,
   'survey': 3,
   'system': 4,
   'time': 5,
   'trees': 14,
   'unordered': 15,
   'user': 6,
   'well': 23,
   'widths': 24
}

Ve benzer şekilde, bir belge için kelime torbası temsilini aşağıdaki gibi oluşturabiliriz -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

Çıktı

[
   [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
   [(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
   [(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
   [(14, 1), (16, 1), (17, 1), (18, 1)],
   [(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]

Model nedir?

Külliyatı vektörleştirdikten sonra, ne olacak? Şimdi, modelleri kullanarak dönüştürebiliriz. Model, bir belge gösterimini diğerine dönüştürmek için kullanılan bir algoritmaya atıfta bulunulabilir.

Tartıştığımız gibi, Gensim'de belgeler vektörler olarak temsil edilmektedir, bu nedenle, iki vektör uzayı arasındaki bir dönüşüm olarak model olsa da yapabiliriz. Modellerin bu tür dönüşümlerin ayrıntılarını öğrendiği bir eğitim aşaması her zaman vardır. Model, eğitim aşamasında eğitim külliyatını okur.

Bir Modeli Başlatma

Başlayalım tf-idfmodel. Bu model, vektörleri BoW (Kelime Torbası) temsilinden başka bir vektör uzayına dönüştürür; burada frekans sayıları, külliyattaki her kelimenin göreli nadirliğine göre ağırlıklandırılır.

Uygulama Örneği

Aşağıdaki örnekte, tf-idfmodel. Onu külliyatımızda eğiteceğiz ve ardından "ağaç grafiğini" dize dönüştüreceğiz.

Misal

from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])

Çıktı

[(3, 0.4869354917707381), (4, 0.8734379353188121)]

Şimdi, modeli oluşturduktan sonra, tüm külliyatı tfidf aracılığıyla dönüştürebilir ve indeksleyebilir ve sorgu belgemizin (sorgu belgesine 'ağaç sistemi' veriyoruz) derlemdeki her bir belgeye benzerliğini sorgulayabiliriz -

Misal

from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))

Çıktı

[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]

Yukarıdaki çıktıdan, belge 4 ve belge 5'in benzerlik puanı yaklaşık% 49'dur.

Dahası, bu çıktıyı daha fazla okunabilirlik için aşağıdaki gibi sıralayabiliriz -

Misal

for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
   print(doc_number, score)

Çıktı

2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0