Gensim - वेक्टर और मॉडल
यहाँ, हम Gensim की मुख्य अवधारणाओं के बारे में जानेंगे, जिसमें वेक्टर और मॉडल पर मुख्य ध्यान दिया जाएगा।
वेक्टर क्या है?
क्या होगा यदि हम अपने कॉर्पस में अव्यक्त संरचना का अनुमान लगाना चाहते हैं? इसके लिए, हमें दस्तावेजों का इस तरह से प्रतिनिधित्व करने की आवश्यकता है कि हम उसी गणितीय रूप से हेरफेर कर सकें। एक लोकप्रिय प्रकार का प्रतिनिधित्व सुविधाओं के वेक्टर के रूप में कॉर्पस के प्रत्येक दस्तावेज़ का प्रतिनिधित्व करना है। इसलिए हम कह सकते हैं कि वेक्टर एक दस्तावेज़ का गणितीय सुविधाजनक प्रतिनिधित्व है।
आपको एक उदाहरण देने के लिए, आइए एक उपर्युक्त कॉर्पस के रूप में, क्यूए जोड़ी के रूप में, एक ही विशेषता का प्रतिनिधित्व करें
Q - शब्द कितनी बार करता है Hello दस्तावेज़ में दिखाई देते हैं?
A - शून्य (को ०)।
Q - दस्तावेज़ में कितने पैराग्राफ हैं?
A - दो (2)
प्रश्न आम तौर पर इसकी पूर्णांक आईडी द्वारा दर्शाया जाता है, इसलिए इस दस्तावेज़ का प्रतिनिधित्व जोड़े की एक श्रृंखला है (1, 0.0), (2, 2.0)। इस तरह के वेक्टर प्रतिनिधित्व को एक के रूप में जाना जाता हैdenseवेक्टर। क्योंdense, क्योंकि इसमें ऊपर लिखे गए सभी प्रश्नों का स्पष्ट उत्तर शामिल है।
प्रतिनिधित्व एक सरल (0, 2) की तरह हो सकता है, अगर हम सभी प्रश्नों को पहले से जानते हैं। उत्तर का ऐसा क्रम (यदि प्रश्न पहले से ज्ञात हो)vector हमारे दस्तावेज़ के लिए।
एक और लोकप्रिय प्रकार का प्रतिनिधित्व है bag-of-word (BoW)नमूना। इस दृष्टिकोण में, प्रत्येक दस्तावेज़ मूल रूप से एक वेक्टर द्वारा दर्शाया जाता है जिसमें शब्दकोश में हर शब्द की आवृत्ति गणना होती है।
आपको एक उदाहरण देने के लिए, मान लीजिए कि हमारे पास एक शब्दकोष है जिसमें '' हैलो ',' कैसे ',' हैं ',' आप '] शब्द हैं। स्ट्रिंग से युक्त एक दस्तावेज "आप कैसे हैं" तब वेक्टर [0, 2, 1, 1] द्वारा दर्शाया जाएगा। यहां, वेक्टर की प्रविष्टियां "हैलो", "हाउ", "हैं" और "आप" की घटनाओं के क्रम में हैं।
वेक्टर बनाम दस्तावेज़
वेक्टर की उपरोक्त व्याख्या से, एक दस्तावेज़ और वेक्टर के बीच का अंतर लगभग समझ में आ जाता है। लेकिन, इसे स्पष्ट करने के लिए,document पाठ है और vectorउस पाठ का गणितीय रूप से सुविधाजनक प्रतिनिधित्व है। दुर्भाग्य से, कभी-कभी बहुत से लोग इन शब्दों का परस्पर उपयोग करते हैं।
उदाहरण के लिए, मान लें कि हमारे पास कुछ मनमाना दस्तावेज़ है, तो कहने के बजाय, "वेक्टर जो दस्तावेज़ A के अनुरूप है", वे कहते थे, "वेक्टर A" या "दस्तावेज़ A"। इससे बड़ी अस्पष्टता होती है। यहां एक और महत्वपूर्ण बात ध्यान देने वाली है कि, दो अलग-अलग दस्तावेजों में एक ही वेक्टर प्रतिनिधित्व हो सकता है।
वैक्टर की सूची में कॉर्पस परिवर्तित करना
वैक्टर की सूची में कॉर्पस को परिवर्तित करने का एक कार्यान्वयन उदाहरण लेने से पहले, हमें कॉर्पस में प्रत्येक शब्द को एक अद्वितीय पूर्णांक आईडी के साथ जोड़ना होगा। इसके लिए, हम उपरोक्त अध्याय में दिए गए उदाहरण का विस्तार करेंगे।
उदाहरण
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
उत्पादन
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
यह दर्शाता है कि हमारे कॉर्पस में 25 अलग-अलग टोकन हैं gensim.corpora.Dictionary।
कार्यान्वयन उदाहरण
हम इन 5-डायमेंशनल वैक्टर में टोकन दस्तावेजों को चालू करने के लिए शब्दकोश का उपयोग इस प्रकार कर सकते हैं -
pprint.pprint(dictionary.token2id)
उत्पादन
{
'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
}
और इसी तरह, हम एक दस्तावेज़ के लिए बैग-ऑफ-वर्ड प्रतिनिधित्व बना सकते हैं -
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
उत्पादन
[
[(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)]
]
मॉडल क्या है?
एक बार जब हमने कॉर्पस को सदिश कर दिया है, तो आगे क्या? अब, हम इसे मॉडल का उपयोग करके बदल सकते हैं। मॉडल को एक दस्तावेज़ प्रतिनिधित्व को दूसरे में बदलने के लिए उपयोग किए जाने वाले एल्गोरिदम के लिए भेजा जा सकता है।
जैसा कि हमने चर्चा की है, गेंसिम में दस्तावेजों को वैक्टर के रूप में दर्शाया गया है, इसलिए हम दो वेक्टर रिक्त स्थान के बीच परिवर्तन के रूप में मॉडल कर सकते हैं। हमेशा एक प्रशिक्षण चरण होता है जहां मॉडल ऐसे परिवर्तनों का विवरण सीखते हैं। मॉडल प्रशिक्षण चरण के दौरान प्रशिक्षण कॉर्पस को पढ़ता है।
एक मॉडल की शुरुआत
आइए आरंभ करते हैं tf-idfनमूना। यह मॉडल BoW (शब्दों के थैले) से वैक्टर को एक अन्य वेक्टर स्थान में बदल देता है, जहां आवृत्ति गणना को कॉर्पस में प्रत्येक शब्द की सापेक्ष दुर्लभता के अनुसार भारित किया जाता है।
कार्यान्वयन उदाहरण
निम्नलिखित उदाहरण में, हम इनिशियलाइज़ करने जा रहे हैं tf-idfनमूना। हम इसे अपने कॉर्पस पर प्रशिक्षित करेंगे और फिर स्ट्रिंग "ट्री ग्राफ" को रूपांतरित करेंगे।
उदाहरण
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
उत्पादन
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
अब, एक बार जब हमने मॉडल बना लिया, तो हम पूरे कॉर्पस को tfidf के माध्यम से बदल सकते हैं और इसे अनुक्रमित कर सकते हैं, और हमारे क्वेरी दस्तावेज़ की समानता (हम क्वेरी दस्तावेज़ 'ट्री सिस्टम' दे रहे हैं) को कॉर्पस में प्रत्येक दस्तावेज़ के विरुद्ध बदल सकते हैं -
उदाहरण
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)))
उत्पादन
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
उपरोक्त आउटपुट से, दस्तावेज़ 4 और दस्तावेज़ 5 में लगभग 49% की समानता स्कोर है।
इसके अलावा, हम इस आउटपुट को अधिक पठनीयता के लिए भी सॉर्ट कर सकते हैं -
उदाहरण
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
उत्पादन
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0