קוראים כמוך עוזרים לתמוך ב-MUO. כאשר אתה מבצע רכישה באמצעות קישורים באתר שלנו, אנו עשויים להרוויח עמלת שותף. קרא עוד.

יש מסנן דואר זבל כמעט בכל פלטפורמת אימייל או הודעות. המסנן בוחן כל דואר או הודעה כשהם מגיעים ומסווג אותם כספאם או כ-ham. תיבת הדואר הנכנס שלך מציגה את אלה שנופלים מתחת לשינקין. הוא דוחה, או מציג בנפרד, את ההודעות שנכללות בספאם.

אתה יכול ליצור מסנן דואר זבל משלך באמצעות NLTK, regex ו-skit-learn בתור הספריות הראשיות. תצטרך גם מערך נתונים כדי לאמן את המודל שלך.

הבנת מערך הנתונים שלך

"סיווג דואר זבל עבור NLP בסיסי" זמין באופן חופשי מערך נתונים של Kaggle. הוא מכיל תערובת של הודעות דואר זבל והודעות דואר גולמיות. יש לו 5,796 שורות ו-3 עמודות.

ה קטגוריה העמודה מציינת אם הודעה היא דואר זבל או חזיר. מספר אחד מייצג דואר זבל ואילו אפס מייצג בשר חזיר. ה הוֹדָעָה העמודה מכילה את הדואר הגולמי בפועל. ה שם קובץ הקטגוריה היא מזהה הודעה ייחודי.

הכנת הסביבה שלך

כדי לעקוב אחריך, תצטרך א הבנה בסיסית של Python ולמידת מכונה. אתה צריך גם להיות נוח לעבוד עם גוגל קולאב או מחברת Jupyter.

עבור Jupyter Notebook, נווט אל התיקיה שבה ברצונך שהפרויקט יישאר. צור סביבה וירטואלית חדשה והפעל את Jupyter Notebook מתיקיה זו. Google Colab לא צריך את השלב הזה. צור מחברת חדשה ב-Google Colab או ב-Jupyter Notebook.

instagram viewer

קוד המקור המלא ומערך הנתונים זמינים ב-a מאגר GitHub.

הפעל את פקודת הקסם הבאה כדי להתקין את הספריות הנדרשות.

!pip התקן nltk scikit-למד רגקס numpy pandas

אתה תשתמש ב:

  • NLTK עבור עיבוד שפה טבעית (NLP).
  • scikit-learn ליצור את מודל למידת המכונה.
  • regex לעבודה עם ביטויים רגולריים.
  • NumPy לעבודה עם מערכים.
  • פנדות כדי לתפעל את מערך הנתונים שלך.

ייבוא ​​ספריות

ייבא את הספריות שהתקנת בסביבה שלך. ייבא את ספריית הביטויים הרגולריים בתור re ו-skit-learn בתור sklearn.

יְבוּא פנדות כפי ש pd
יְבוּא רדום כפי ש np
יְבוּא nltk
מ nltk.stem יְבוּא WordNetLemmatizer
מ nltk.corpus יְבוּא מילות עצירה
יְבוּא מִחָדָשׁ
מ sklearn.model_selection יְבוּא רכבת_מבחן_פיצול
מ sklearn.metrics יְבוּא דוח_סיווג
מ sklearn.feature_extraction.text יְבוּא CountVectorizer
מ sklearn.feature_extraction.text יְבוּא TfidfVectorizer

אתה תשתמש במודולים של WordNetLemmatizer ומילות עצור מ-NLTK כדי לעבד מראש את ההודעות הגולמיות במערך הנתונים. אתה תשתמש במודולים מיובאים של sclearn במהלך בניית המודל.

עיבוד מוקדם של הנתונים

קרא לפונקציית pandas read_csv כדי לטעון את מערך הנתונים. ודא שאתה מאחסן את מערך הנתונים באותה ספרייה כמו הפרויקט שלך. הצג את חמש השורות הראשונות של מערך הנתונים כדי לקבל חזותית של מערך הנתונים.

df = pd.read_csv('/content/spam טקסט גולמי בדוא"ל עבור NLP.csv')
df.head()

שחרר את העמודה FILE_NAME של מערך הנתונים. זה לא תכונה שימושית לסיווג דואר זבל.

df.drop('שם קובץ', ציר=1, במקום=נָכוֹן)

בדוק את הספירה של דואר חזיר ודואר זבל במערך הנתונים. זה יעזור לך מאוחר יותר לקבוע כיצד לפצל את הנתונים עבור אימון ובדיקות מודל.

df. CATEGORY.value_counts()

הורד את מילות העצירה של הקורפוס מספריית NLTK. מילות עצור הן קבוצה של מילים הנפוצות. עיבוד מוקדם מסיר אותם מהודעות. טען את מילות התחנה באנגלית ואחסן אותן במשתנה של מילת עצירה.

nltk.download('מילות עצר')
stopword = nltk.corpus.stopwords.words('אנגלית')

הורד את ה- Multilingual WordNet הפתוחה. זהו מסד נתונים מילוני של מילים באנגלית והמשמעויות הסמנטיות שלהן.

nltk.download('omw-1.4')

הורד את קורפוס wordnet. אתה תשתמש בו לסיווג טקסט. הצג אובייקט WordNetLemmatizer()‎. אתה תשתמש באובייקט במהלך הלמטיזציה. Lematization היא טכניקה המשמשת ב-NLP כדי לצמצם צורות גזירות של מילים למשמעותן המילונית.

לדוגמה: צמצום המילה "חתולים" ייתן לך "חתול". מילה לאחר הלמטיזציה הופכת ללמה.

nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()

צור רשימה ריקה שבה תשתמש לאחסון ההודעות שעובדו מראש.

קורפוס=[]

צור לולאת for כדי לעבד כל הודעה בעמודה MESSAGE של מערך הנתונים. הסר את כל התווים שאינם אלפאנומריים. המר את ההודעה לאותיות קטנות. חלקו את הטקסט למילים. הסר את מילות העצירה והצג את המילים. המר את המילים בחזרה למשפטים. הוסף את ההודעה המעובדת מראש לרשימת הקורפוסים.

ל אני ב טווח (len (df)):
# הסרת כל התווים שאינם אלפאנומריים
הודעה = re.sub('[^a-zA-Z0-9]', ' ',df['הוֹדָעָה'][אני])

# המרת ההודעה לאותיות קטנות
message = message.lower()

# פיצול המשפט למילים ללמטיזציה
message = message.split()

# הסרת מילות עצירה ולמאטיזציה
message = [lemmatizer.lemmatize (מילה) ל מִלָה ב הוֹדָעָה
אם מִלָה לֹאב set (stopwords.words('אנגלית'))]

# המרת המילים בחזרה למשפטים
הודעה = ' '.join (הודעה)

# הוספת ההודעה המעובדת מראש לרשימת הקורפוסים
corpus.append (הודעה)

ללופ זה ייקח בערך חמש דקות לרוץ. שלב הלמטיזציה והסרת מילות העצירה לוקח את רוב הזמן. כעת עבדת מראש את הנתונים שלך.

הנדסת תכונות באמצעות מודל שק-אוף-מילים לעומת טכניקת TF-IDF

הנדסת תכונות היא תהליך של המרת תכונות של נתונים גולמיים לתכונות חדשות המותאמות למודלים של למידת מכונה.

דגם תיק של מילים

מודל שק המילים מייצג נתוני טקסט כהתפלגות תדירות של מילים הקיימות במסמך. כך פשוט מספר הפעמים שמילה מופיעה במסמך.

השתמש במחלקה CountVectorizer מ-skit-learn כדי להמיר את נתוני הטקסט לוקטורים מספריים. התאימו לקורפוס של הודעות מעובדות מראש והפכו את הקורפוס למטריצה ​​דלילה.

# קח את 2500 התכונות המובילות 
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['קטגוריה']

פצל את הנתונים שעברו טרנספורמציה למערכות אימון ומבחנים. השתמש בעשרים אחוז מהנתונים לבדיקה ושמונים אחוז לאימון.

x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=1, שכבה=y)

מודל שקית המילים יסווג את ההודעות במערך הנתונים בצורה נכונה. אבל לא יצליח בסיווג ההודעות שלך. זה לא לוקח בחשבון את המשמעות הסמנטית של המסרים. כדי לסווג רק את ההודעות במערך הנתונים, השתמש בטכניקה זו.

טכניקת TF-IDF

המונח תדירות-היפוך מסמך תדירות (TF-IDF) פועל על ידי הקצאת משקלים למילים במסמך על סמך התדירות שבה הן מופיעות. TF-IDF נותן מילים המופיעות בתדירות גבוהה במסמך אך נדירות בקורפוס משקל גבוה יותר. זה מאפשר לאלגוריתמים של למידת מכונה להבין טוב יותר את משמעות הטקסט.

tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (corpus).toarray()

x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=1, שכבה=y)

כדי לחלץ משמעות סמנטית מההודעות ולסווג את ההודעות שלך השתמש ב-TF-IDF.

יצירה והדרכה של המודל שלך

התחל על ידי יצירה ואתחול של מודל Naive Bayes באמצעות מחלקת scikit-learn MultinomialNB.

model = MultinomialNB()

התאם את נתוני האימון, המאפשרים לדגם להתאמן על ערכת האימונים:

model.fit (x_train, y_train)

לאחר מכן בצע תחזיות על מערכי האימון והבדיקות באמצעות שיטת החיזוי.

train_pred = model.predict (x_train)
test_pred = model.predict (x_test)

תחזיות אלו יעזרו לך להעריך את המודל שלך.

הערכת מודל

הערך את הביצועים של המודל שלך באמצעות הפונקציה classification_report מ-skit-learn. העבר את תחזיות ערכת האימון ואת תוויות ערכת האימונים בפועל כקלט. עשה את אותו הדבר עבור ערכת הבדיקה.

הדפס (דוח סיווג (רכבת_קדימה, רכבת y))
הדפס (דוח סיווג (מבחן_קדם, y_מבחן))

ככל שהדיוק, הזכירה והדיוק גבוהים יותר עבור שתי המחלקות, כך הדגם טוב יותר.

תוצאות של סיווג ההודעות שלך

הפוך את ההודעה לוקטור באמצעות טכניקת TF-IDF. השתמש במודל כדי לחזות אם ההודעה היא דואר זבל או חזיר, ולאחר מכן הצג את החיזוי על המסך.

הדפס('מחזה...')

הודעה = ["זכית ב-10000 דולר, אנא ספק את חשבונך
פרטים, כדי שנוכל להעביר את הכסף"]

message_vector = tf.transform (הודעה)
קטגוריה = model.predict (message_vector)
הדפס("ההודעה היא", "ספאם"אם קטגוריה == 1אַחֵר"לא ספאם")

החלף את ההודעה בהודעה שלך.

הפלט הוא כדלקמן:

המודל יכול לסווג הודעות חדשות שלא נראו כדואר זבל או חזיר.

האתגר העומד בפני סיווג דואר זבל ביישומים

האתגר העיקרי העומד בפני סיווג דואר זבל באפליקציות הוא סיווג שגוי של הודעות. מודלים של למידת מכונה לא תמיד נכונים. הם עשויים לסווג דואר זבל כנקניק ולהיפך. במקרה של סיווג בשר חזיר כדואר זבל, תוכנית עשויה להסיר דואר אלקטרוני מתיבת הדואר הנכנס של המשתמש, ולגרום לו לפספס הודעות חשובות.