/ / Xây dựng bộ phân loại thư rác từ đầu với xử lý ngôn ngữ tự nhiên

Xây dựng bộ phân loại thư rác từ đầu với xử lý ngôn ngữ tự nhiên

Có một bộ lọc thư rác trong hầu hết mọi nền tảng gửi email hoặc nhắn tin. Bộ lọc kiểm tra từng thư hoặc tin nhắn khi nó đến và phân loại nó là thư rác hoặc ham. Hộp thư đến của bạn hiển thị những thứ thuộc ham. Nó từ chối, hoặc hiển thị riêng biệt, các tin nhắn rơi vào thư rác.


Bạn có thể tạo bộ lọc thư rác của riêng mình bằng NLTK, regex và scikit-learning làm thư viện chính. Bạn cũng sẽ cần một tập dữ liệu để đào tạo mô hình của mình.


Hiểu tập dữ liệu của bạn

“Phân loại thư rác cho NLP cơ bản” là bộ dữ liệu Kaggle có sẵn miễn phí. Nó chứa hỗn hợp thư rác và thư thô. Nó có 5.796 hàng và 3 cột.

Tổng quan về tập dữ liệu chứa thư thô

Các LOẠI cột cho biết thư là thư rác hay ham. Số một đại diện cho thư rác trong khi số không đại diện cho ham. Các TIN NHẮN cột chứa thư thô thực tế. Các FILE_NAME danh mục là một định danh tin nhắn duy nhất.

Chuẩn bị môi trường của bạn

Để làm theo, bạn cần có hiểu biết cơ bản về Python và máy học. Bạn cũng sẽ cảm thấy thoải mái khi làm việc với Google Colab hoặc Jupyter Notebook.

Đối với Jupyter Notebook, điều hướng đến thư mục bạn muốn dự án cư trú. Tạo một môi trường ảo mới và chạy Jupyter Notebook từ thư mục này. Google Colab không cần bước này. Tạo sổ ghi chép mới trong Google Colab hoặc Jupyter Notebook.

Chạy lệnh ma thuật sau để cài đặt các thư viện cần thiết.

 !pip install nltk scikit-learn regex numpy pandas 

Bạn sẽ sử dụng:

  • NLTK cho xử lý ngôn ngữ tự nhiên (NLP).
  • scikit-learning để tạo mô hình máy học.
  • regex để làm việc với các biểu thức chính quy.
  • NumPy để làm việc với mảng.
  • Pandas để thao tác tập dữ liệu của bạn.

Nhập thư viện

Nhập các thư viện bạn đã cài đặt trong môi trường của mình. Nhập thư viện regex dưới dạng re và scikit-learning dưới dạng sklearn.

 import pandas as pd
import numpy as np
import nltk
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
import re
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer

Bạn sẽ sử dụng các mô-đun WordNetLemmatizer và từ dừng từ NLTK để xử lý trước các thông báo thô trong tập dữ liệu. Bạn sẽ sử dụng các mô-đun sklearn đã nhập trong quá trình xây dựng mô hình.

Tiền xử lý dữ liệu

Gọi hàm pandas read_csv để tải tập dữ liệu. Đảm bảo rằng bạn lưu trữ tập dữ liệu trong cùng thư mục với dự án của mình. Hiển thị năm hàng đầu tiên của tập dữ liệu để có được hình ảnh trực quan về tập dữ liệu.

 df = pd.read_csv('/content/Spam Email raw text for NLP.csv')
df.head()

Bỏ cột FILE_NAME của tập dữ liệu. Nó không phải là một tính năng hữu ích để phân loại thư rác.

 df.drop('FILE_NAME', axis=1, inplace=True) 

Kiểm tra số lượng thư rác và thư rác trong bộ dữ liệu. Điều này sau đó sẽ giúp bạn xác định cách phân chia dữ liệu để đào tạo và thử nghiệm mô hình.

 df.CATEGORY.value_counts() 

Tải xuống các mật khẩu từ thư viện NLTK. Từ dừng là một tập hợp các từ thường xuất hiện. Quá trình tiền xử lý loại bỏ chúng khỏi thư. Tải các từ dừng tiếng Anh và lưu trữ chúng trong một biến từ dừng.

 nltk.download('stopwords')
stopword = nltk.corpus.stopwords.words('english')

Tải xuống Mạng từ đa ngôn ngữ mở. Nó là một cơ sở dữ liệu từ vựng của các từ tiếng Anh và ý nghĩa ngữ nghĩa của chúng.

 nltk.download('omw-1.4') 

Tải xuống kho ngữ liệu wordnet. Bạn sẽ sử dụng nó để phân loại văn bản. Khởi tạo một đối tượng WordNetLemmatizer(). Bạn sẽ sử dụng đối tượng trong quá trình từ vựng. Lemmatization là một kỹ thuật được sử dụng trong NLP để giảm các dạng phái sinh của từ theo nghĩa từ điển của chúng.

Ví dụ: Rút gọn từ “cats” sẽ cho bạn từ “cat”. Một từ sau khi lemmatization trở thành một bổ đề.

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

Tạo một danh sách trống mà bạn sẽ sử dụng để lưu trữ các thư đã xử lý trước.

 corpus=[] 

Tạo vòng lặp for để xử lý mọi thông báo trong cột TIN NHẮN của tập dữ liệu. Xóa tất cả các ký tự không phải chữ và số. Chuyển đổi tin nhắn thành chữ thường. Tách văn bản thành các từ. Loại bỏ các từ dừng và từ vựng các từ. Chuyển đổi các từ trở lại thành câu. Nối thông báo đã được xử lý trước vào danh sách văn bản.

 for i in range(len(df)):
    
    message = re.sub('[^a-zA-Z0-9]', ' ', df['MESSAGE'][i])

    
    message = message.lower()

    
    message = message.split()

    
    message = [lemmatizer.lemmatize(word) for word in message
             if word not in set(stopwords.words('english'))]

    
    message = ' '.join(message)

    
    corpus.append(message)

Vòng lặp này sẽ mất khoảng năm phút để chạy. Bước bổ sung từ vựng và loại bỏ từ dừng chiếm phần lớn thời gian. Bây giờ bạn đã xử lý trước dữ liệu của mình.

Kỹ thuật tính năng bằng cách sử dụng Mô hình Bag-of-Words so với Kỹ thuật TF-IDF

Kỹ thuật tính năng là quá trình chuyển đổi các tính năng dữ liệu thô thành các tính năng mới phù hợp với các mô hình máy học.

Mô Hình Túi Từ

Mô hình túi từ biểu thị dữ liệu văn bản dưới dạng phân bố tần suất của các từ có trong tài liệu. Đây chỉ đơn giản là số lần xuất hiện của một từ trong tài liệu.

Sử dụng lớp CountVectorizer từ scikit-learning để chuyển đổi dữ liệu văn bản thành các vectơ số. Điều chỉnh kho dữ liệu của các thông báo được xử lý trước và chuyển đổi kho dữ liệu thành một ma trận thưa thớt.

 
cv = CountVectorizer(max_features=2500, ngram_range=(1,3))
X = cv.fit_transform(corpus).toarray()
y = df['CATEGORY']

Chia dữ liệu đã chuyển đổi thành các tập huấn luyện và kiểm tra. Sử dụng 20% ​​dữ liệu để thử nghiệm và 80% để đào tạo.

 x_train, x_test, y_train, y_test = train_test_split(
   X, y, test_size=0.20, random_state=1, stratify=y)

Mô hình túi từ sẽ phân loại chính xác các thông báo trong tập dữ liệu. Nhưng sẽ không hoạt động tốt trong việc phân loại thư của riêng bạn. Nó không tính đến ý nghĩa ngữ nghĩa của các thông điệp. Để chỉ phân loại các thông báo trong tập dữ liệu, hãy sử dụng kỹ thuật này.

Kỹ thuật TF-IDF

Thuật ngữ tần số-nghịch đảo tần suất tài liệu (TF-IDF) hoạt động bằng cách gán trọng số cho các từ trong tài liệu dựa trên tần suất xuất hiện của chúng. TF-IDF đưa ra các từ xuất hiện thường xuyên trong tài liệu nhưng hiếm khi xuất hiện trong trọng số cao hơn của văn bản. Điều này cho phép các thuật toán học máy hiểu rõ hơn ý nghĩa của văn bản.

 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, stratify=y)

Để trích xuất ngữ nghĩa từ thư và phân loại thư của riêng bạn, hãy sử dụng TF-IDF.

Tạo và đào tạo mô hình của bạn

Bắt đầu bằng cách tạo và khởi tạo mô hình Naive Bayes bằng cách sử dụng lớp MultinomialNB học scikit.

 model = MultinomialNB() 

Điều chỉnh dữ liệu huấn luyện, cho phép mô hình huấn luyện trên tập huấn luyện:

 model.fit(x_train, y_train) 

Sau đó đưa ra dự đoán trên tập huấn luyện và kiểm tra bằng phương pháp dự đoán.

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

Những dự đoán này sẽ giúp bạn đánh giá mô hình của mình.

Đánh giá mô hình

Đánh giá hiệu suất của mô hình của bạn bằng cách sử dụng hàm ratings_report từ scikit-learning. Chuyển các dự đoán tập huấn luyện và nhãn tập huấn luyện thực tế làm đầu vào. Làm tương tự cho bộ kiểm tra.

 print(classification_report(train_pred, y_train))
print(classification_report(test_pred, y_test))

Độ chính xác, thu hồi và độ chính xác cho cả hai lớp càng cao thì mô hình càng tốt.

Kết quả phân loại tin nhắn của riêng bạn

Chuyển đổi tin nhắn thành một vectơ bằng kỹ thuật TF-IDF. Sử dụng mô hình để dự đoán xem thư là thư rác hay ham, sau đó hiển thị dự đoán đó trên màn hình.

 print('Predicting...')

message = ["You won 10000 dollars, please provide your account
            details,So that we can transfer the money"]

message_vector = tf.transform(message)
category = model.predict(message_vector)
print("The message is", "spam" if category == 1 else "not spam")

Thay thế tin nhắn bằng của riêng bạn.

Đầu ra như sau:

đầu ra của chương trình phân loại thư rác trong Google Colab

Mô hình có thể phân loại các tin nhắn chưa xem mới là thư rác hoặc ham.

Thách thức đối mặt với việc phân loại thư rác trong các ứng dụng

Thách thức chính đối với phân loại thư rác trong các ứng dụng là phân loại sai thư. Các mô hình học máy không phải lúc nào cũng đúng. Họ có thể phân loại thư rác là giăm bông và ngược lại. Trong trường hợp phân loại ham là thư rác, một chương trình có thể xóa email khỏi hộp thư đến của người dùng, khiến họ bỏ lỡ các thư quan trọng.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *