लगभग हर ईमेल या मैसेजिंग प्लेटफॉर्म में एक स्पैम फिल्टर होता है। फ़िल्टर प्रत्येक मेल या संदेश की जांच करता है क्योंकि यह आता है और इसे स्पैम या हैम के रूप में वर्गीकृत करता है। आपका इनबॉक्स उन्हें प्रदर्शित करता है जो हैम के अंतर्गत आते हैं। यह स्पैम के अंतर्गत आने वाले संदेशों को अलग से अस्वीकार या प्रदर्शित करता है।
आप मुख्य पुस्तकालयों के रूप में NLTK, रेगेक्स, और स्किकिट-लर्न का उपयोग करके अपना स्वयं का स्पैम फ़िल्टर बना सकते हैं। अपने मॉडल को प्रशिक्षित करने के लिए आपको डेटासेट की भी आवश्यकता होगी।
अपने डेटासेट को समझना
"बुनियादी एनएलपी के लिए स्पैम वर्गीकरण" एक स्वतंत्र रूप से उपलब्ध है कागल डेटासेट. इसमें स्पैम और हैम रॉ मेल संदेशों का मिश्रण है। इसमें 5,796 पंक्तियाँ और 3 स्तंभ हैं।
वर्ग कॉलम इंगित करता है कि संदेश स्पैम है या हैम। नंबर एक स्पैम का प्रतिनिधित्व करता है जबकि शून्य हैम का प्रतिनिधित्व करता है। संदेश कॉलम में वास्तविक कच्चा मेल होता है। फ़ाइल का नाम श्रेणी एक अद्वितीय संदेश पहचानकर्ता है।
अपना पर्यावरण तैयार करना
साथ चलने के लिए, आपके पास एक होना चाहिए पायथन की बुनियादी समझ और मशीन लर्निंग। आपको काम करने में भी सहज होना चाहिए गूगल कोलाब या ज्यूपिटर नोटबुक।
ज्यूपिटर नोटबुक के लिए, उस फ़ोल्डर में नेविगेट करें जहां आप प्रोजेक्ट को रखना चाहते हैं। एक नया आभासी वातावरण बनाएँ और इस फ़ोल्डर से ज्यूपिटर नोटबुक चलाएँ। Google Colab को इस चरण की आवश्यकता नहीं है. Google Colab या Jupyter Notebook में एक नई नोटबुक बनाएं।
पूर्ण स्रोत कोड और डेटासेट a में उपलब्ध हैं गिटहब रिपॉजिटरी.
आवश्यक पुस्तकालयों को स्थापित करने के लिए निम्न मैजिक कमांड चलाएँ।
!pip nltk scikit स्थापित करें-regex numpy pandas सीखें
आप प्रयोग करेंगे:
- के लिए एनएलटीके प्राकृतिक भाषा प्रसंस्करण (एनएलपी)।
- scikit-मशीन लर्निंग मॉडल बनाना सीखें।
- रेगुलर एक्सप्रेशन के साथ काम करने के लिए रेगेक्स।
- सरणियों के साथ काम करने के लिए NumPy।
- पांडा आपके डेटासेट में हेरफेर करने के लिए।
पुस्तकालय आयात करें
आपके द्वारा अपने वातावरण में स्थापित पुस्तकालयों को आयात करें। रेगेक्स लाइब्रेरी को री के रूप में आयात करें और स्किकिट-लर्न को स्केलेर के रूप में आयात करें।
आयात पांडा जैसा पी.डी.
आयात Numpy जैसा एनपी
आयात nltk
से nltk.stem आयात WordNetLemmatizer
से nltk.corpus आयात स्टॉपवर्ड
आयात दोबारा
से sklearn.model_selection आयात ट्रेन_टेस्ट_स्प्लिट
से sklearn.metrics आयात वर्गीकरण_रिपोर्ट
से sklearn.feature_extraction.text आयात काउंटवेक्टर
से sklearn.feature_extraction.text आयात tfidfवेक्टराइज़र
आप डेटासेट में कच्चे संदेशों को प्रीप्रोसेस करने के लिए NLTK से WordNetLemmatizer और स्टॉपवर्ड्स मॉड्यूल का उपयोग करेंगे। आप मॉडल निर्माण के दौरान आयातित स्केलेरन मॉड्यूल का उपयोग करेंगे।
डेटा को प्रीप्रोसेस करना
डेटासेट लोड करने के लिए पांडा read_csv फ़ंक्शन को कॉल करें। सुनिश्चित करें कि आप डेटासेट को अपनी परियोजना के समान निर्देशिका में संग्रहीत करते हैं। डेटासेट का विज़ुअल प्राप्त करने के लिए डेटासेट की पहली पाँच पंक्तियाँ प्रदर्शित करें।
डीएफ = पीडी.read_csv ('/ सामग्री/स्पैम ईमेल NLP.csv के लिए कच्चा पाठ')
df.सिर ()
डेटासेट का FILE_NAME स्तंभ छोड़ें. यह स्पैम वर्गीकरण के लिए उपयोगी सुविधा नहीं है।
df.ड्रॉप ('फ़ाइल का नाम', अक्ष =1, जगह =सत्य)
डेटासेट में हैम और स्पैम मेल की संख्या की जाँच करें। यह बाद में आपको यह निर्धारित करने में मदद करेगा कि मॉडल प्रशिक्षण और परीक्षण के लिए डेटा को कैसे विभाजित किया जाए।
df. CATEGORY.value_counts ()
एनएलटीके लाइब्रेरी से कॉर्पस स्टॉपवर्ड्स डाउनलोड करें। स्टॉपवर्ड आमतौर पर आने वाले शब्दों का एक समूह है। प्रीप्रोसेसिंग उन्हें संदेशों से हटा देता है। अंग्रेजी स्टॉपवर्ड लोड करें और उन्हें स्टॉपवर्ड वैरिएबल में स्टोर करें।
एनएलटीके.डाउनलोड ('स्टॉपवर्ड्स')
स्टॉपवर्ड = nltk.corpus.stopwords.words ('अंग्रेज़ी')
खुला बहुभाषी वर्डनेट डाउनलोड करें। यह अंग्रेजी शब्दों और उनके शब्दार्थ अर्थों का एक शाब्दिक डेटाबेस है।
एनएलटीके.डाउनलोड ('ओमव-1.4')
वर्डनेट कॉर्पस डाउनलोड करें। आप इसका उपयोग टेक्स्ट वर्गीकरण के लिए करेंगे। WordNetLemmatizer() ऑब्जेक्ट को इंस्टेंट करें। आप लेमैटाइजेशन के दौरान वस्तु का उपयोग करेंगे। Lemmatization एक तकनीक है जिसका उपयोग NLP में शब्दों के व्युत्पन्न रूपों को उनके शब्दकोश अर्थ में कम करने के लिए किया जाता है।
उदाहरण के लिए: "बिल्लियाँ" शब्द को कम करने से आपको "बिल्ली" मिलेगी। लेमैटाइजेशन के बाद एक शब्द लेम्मा बन जाता है।
एनएलटीके.डाउनलोड ('वर्डनेट')
लेम्मटाइज़र = WordNetLemmatizer ()
एक खाली सूची बनाएं जिसका उपयोग आप प्रीप्रोसेस्ड संदेशों को स्टोर करने के लिए करेंगे।
कोष = []
डेटासेट के संदेश कॉलम में प्रत्येक संदेश को संसाधित करने के लिए लूप के लिए बनाएं। सभी गैर-अल्फ़ान्यूमेरिक वर्णों को हटा दें। संदेश को लोअरकेस में बदलें। पाठ को शब्दों में विभाजित करें। स्टॉपवर्ड्स को हटा दें और शब्दों को लेमैटाइज़ करें। शब्दों को वापस वाक्यों में बदलें। पूर्वसंसाधित संदेश को कॉर्पस सूची में जोड़ें।
के लिए मैं में रेंज (लेन (डीएफ)):
# सभी गैर-अल्फ़ान्यूमेरिक वर्णों को हटाना
संदेश = पुनः। उप ('[^ए-जेडए-जेड0-9]', ' ', डीएफ ['संदेश'][मैं])# संदेश को लोअरकेस में कनवर्ट करना
संदेश = संदेश। कम ()# lemmatization के लिए वाक्य को शब्दों में विभाजित करना
संदेश = संदेश। विभाजन ()# स्टॉपवर्ड्स और लेम्मैटाइजिंग को हटाना
संदेश = [लेम्मटाइज़र.लेममैटाइज़ (शब्द) के लिए शब्द में संदेश
अगर शब्द नहींमें सेट (स्टॉपवर्ड्स.वर्ड्स ('अंग्रेज़ी'))]# शब्दों को वापस वाक्यों में बदलना
संदेश = ' '.जॉइन (संदेश)
# कॉर्पस सूची में प्रीप्रोसेस्ड संदेश जोड़ना
कॉर्पस.एपेंड (संदेश)
इस लूप को चलने में करीब पांच मिनट का समय लगेगा। लेमैटाइज़िंग और स्टॉपवर्ड्स को हटाने के चरण में अधिकांश समय लगता है। अब आपने अपने डेटा को प्रीप्रोसेस कर लिया है।
बैग-ऑफ़-वर्ड्स मॉडल बनाम TF-IDF तकनीक का उपयोग करके फ़ीचर इंजीनियरिंग
फीचर इंजीनियरिंग कच्चे डेटा सुविधाओं को मशीन लर्निंग मॉडल के अनुकूल नई सुविधाओं में परिवर्तित करने की प्रक्रिया है।
बैग-ऑफ-वर्ड्स मॉडल
बैग-ऑफ-वर्ड्स मॉडल दस्तावेज़ में मौजूद शब्दों के आवृत्ति वितरण के रूप में टेक्स्ट डेटा का प्रतिनिधित्व करता है। यह बस इतना है कि किसी दस्तावेज़ में कोई शब्द कितनी बार आता है।
पाठ डेटा को संख्यात्मक वैक्टर में बदलने के लिए स्किकिट-लर्न से काउंटवेक्टराइज़र वर्ग का उपयोग करें। पूर्व-संसाधित संदेशों के कॉर्पस को फ़िट करें और कॉर्पस को विरल मैट्रिक्स में रूपांतरित करें।
# शीर्ष 2500 सुविधाओं को लें
cv = काउंटवेक्टराइज़र (max_features =2500, ngram_range=(1,3))
एक्स = cv.fit_transform (कॉर्पस) .toarray ()
वाई = डीएफ ['वर्ग']
रूपांतरित डेटा को प्रशिक्षण और परीक्षण सेट में विभाजित करें। परीक्षण के लिए बीस प्रतिशत डेटा और प्रशिक्षण के लिए अस्सी प्रतिशत का उपयोग करें।
x_train, x_test, y_train, y_test = train_test_split (
एक्स, वाई, test_size =0.20, रैंडम_स्टेट =1, स्तरीकरण = y)
बैग-ऑफ-वर्ड्स मॉडल डेटासेट में संदेशों को सही ढंग से वर्गीकृत करेगा। लेकिन अपने संदेशों को वर्गीकृत करने में अच्छा प्रदर्शन नहीं करेंगे। यह संदेशों के शब्दार्थ अर्थ को ध्यान में नहीं रखता है। डेटासेट में संदेशों को केवल वर्गीकृत करने के लिए, इस तकनीक का उपयोग करें।
टीएफ-आईडीएफ तकनीक
टर्म फ़्रीक्वेंसी-इनवर्स डॉक्यूमेंट फ़्रीक्वेंसी (TF-IDF) एक दस्तावेज़ में शब्दों को वेटेज देकर काम करता है कि वे कितनी बार दिखाई देते हैं। TF-IDF ऐसे शब्द देता है जो एक दस्तावेज़ में अक्सर दिखाई देते हैं लेकिन कॉर्पस उच्च वजन में दुर्लभ होते हैं। यह मशीन लर्निंग एल्गोरिदम को पाठ के अर्थ को बेहतर ढंग से समझने की अनुमति देता है।
tf = TfidfVectorizer (ngram_range=(1,3), मैक्स_फीचर्स =2500)
एक्स = tf.fit_transform (कॉर्पस) .toarray ()
x_train, x_test, y_train, y_test = train_test_split (
एक्स, वाई, test_size =0.20, रैंडम_स्टेट =1, स्तरीकरण = y)
संदेशों से सिमेंटिक अर्थ निकालने और अपने स्वयं के संदेशों को वर्गीकृत करने के लिए TF-IDF का उपयोग करें।
अपना मॉडल बनाना और प्रशिक्षण देना
स्किकिट-लर्न मल्टीनोमियलएनबी क्लास का उपयोग करके एक Naive Bayes मॉडल बनाकर और आरंभ करके प्रारंभ करें।
मॉडल = मल्टीनोमियल एनबी ()
प्रशिक्षण डेटा को फ़िट करें, मॉडल को प्रशिक्षण सेट पर प्रशिक्षित करने की अनुमति दें:
मॉडल.फिट (x_train, y_train)
फिर भविष्यवाणी पद्धति का उपयोग करके प्रशिक्षण और परीक्षण सेट पर भविष्यवाणियां करें।
train_pred = model.predict (x_train)
test_pred = model.predict (x_test)
ये भविष्यवाणियां आपको अपने मॉडल का मूल्यांकन करने में मदद करेंगी।
मॉडल मूल्यांकन
स्किकिट-लर्न के वर्गीकरण_रिपोर्ट फ़ंक्शन का उपयोग करके अपने मॉडल के प्रदर्शन का मूल्यांकन करें। प्रशिक्षण सेट भविष्यवाणियों और वास्तविक प्रशिक्षण सेट लेबल को इनपुट के रूप में पास करें। टेस्ट सेट के लिए भी ऐसा ही करें।
प्रिंट (classification_report (train_pred, y_train))
प्रिंट (classification_report (test_pred, y_test))
दोनों वर्गों के लिए उच्च परिशुद्धता, रिकॉल और सटीकता मॉडल बेहतर है।
अपने स्वयं के संदेशों को वर्गीकृत करने के परिणाम
TF-IDF तकनीक का उपयोग करके संदेश को वेक्टर में बदलें। संदेश के स्पैम या हैम होने का अनुमान लगाने के लिए मॉडल का उपयोग करें, फिर उस पूर्वानुमान को स्क्रीन पर प्रदर्शित करें।
प्रिंट ('भविष्यवाणी...')
संदेश = ["आपने 10000 डॉलर जीते हैं, कृपया अपना खाता प्रदान करें
विवरण, ताकि हम धन हस्तांतरित कर सकें"]
message_vector = tf.transform (संदेश)
श्रेणी = मॉडल। भविष्यवाणी (message_vector)
प्रिंट ("संदेश है", "अवांछित ईमेल"अगर श्रेणी == 1अन्य"स्पैम नहीं")
संदेश को अपने से बदलें।
आउटपुट इस प्रकार है:
मॉडल नए अनदेखे संदेशों को स्पैम या हैम के रूप में वर्गीकृत कर सकता है।
अनुप्रयोगों में स्पैम वर्गीकरण का सामना करने वाली चुनौती
अनुप्रयोगों में स्पैम वर्गीकरण का सामना करने वाली मुख्य चुनौती संदेशों का गलत वर्गीकरण है। मशीन लर्निंग मॉडल हमेशा सही नहीं होते हैं। वे स्पैम को हैम और इसके विपरीत वर्गीकृत कर सकते हैं। हैम को स्पैम के रूप में वर्गीकृत करने के मामले में, एक प्रोग्राम उपयोगकर्ता के इनबॉक्स से ईमेल को हटा सकता है, जिससे वे महत्वपूर्ण संदेश खो सकते हैं।