--- tags: uvbf, rapport --- ![logo uvbf](https://drive.google.com/uc?export=download&id=1eP-0JTAV3p7a_mhAPHyVdFiB9pPckKr6) # NLP: Modele de detection de messages spams Membres du groupe: - Kabore Abdoul Fataoh - Ouedraogo Alassane Ibrahim - Faridatou Rouamba - Karima ROBGO [Dépot gitlab du projet](https://gitlab.com/abdoulfataoh/uvbf-nlp-spam-detector/-/tree/main) ## Introduction Dans le cadre de notre cursus universitaire à l'Université Virtuelle du Burkina Faso [(UVBF)](https://uv.bf/), nous avons le devoir de travailler sur un projet au choix sur le Traitement automatique du langage naturel [(NLP)](https://fr.wikipedia.org/wiki/Traitement_automatique_des_langues) et le présenter pour en recevoir une note de validation du cours. En ce sens, nous avons opté sur un projet de detection de messages spams. Dans le traitement de ce projet nous allons appliquer toutes nos connaissances en rapport avec le NLP pour qualifier un message en fonction de sa nature spam ou sain(non spam). ## Objectif principale - Définir un model de machine learning capable de determier si un message est un spam ou pas en utilisant les techniques du traitement automatique du langaue naturel ## Exemple de cas d'utilisation ```plantuml left to right direction actor "utilisateur" as user rectangle applications { usecase "application de messagerie(mails)" as email_app usecase "application de chat" as chat_app } usecase "service de detectio de spams" as sd_spam user --> email_app user --> chat_app (sd_spam) .> (email_app) : include (sd_spam) .> (chat_app) : include ``` ## Présentation du jeu de donnees Le jeu de données utilisé dans ce projet, est une collection de 5574 messages ecrits dans la langue anglaise et etiqués selon s'ils sont spams ou sains. Dans ce jeu de donnees nous avons deux attributs: 1. **label**: qui definit la nture de message(spam ou ham) 2. **content**: qui definit le contenu du message | label | content | | -------- | -------- | | ham | Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat... | | ham | Ok lar... Joking wif u oni... | | spam | Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's | | ... | ... | ## Netoyage du jeu de donnés Nous avons definit une fonction **clean_sms** qui permet de: - Supprimer les points de ponctuations - Supprimer les stopwords qui sont des mots qui n'apportent pas de valeur ajouteé a un model de machine learning - Contracter les mots en vue de reduire la taille en utilsant la methode stemming de la bibliotheque nltk ```python=3.9 def clean_sms(text: str): result = remove_punctuations(text) tokens = tokeniser(result) text = stemming(tokens) return text ``` ## feature engineering Nous avons injecté deux nouvelles variables dans notre dataset qui nous aiderons à determinier si un message est un spam ou pas. Ce sont: - La longeur d'un message - Le noombre de caractere de ponctuations dans un message ## Vectorisation Afin de tranmettre les donnees(le dataset netoyé et avec les nouvelles variables) à notre modele de machine learinig, nous devrons proceder à une vectorisation. qui consiste à passer des valeurs textuelles en valeurs numeriques comprehensible par un modele de machine learining. Cette vectorisation s'est faite en utilisant la methode TFIDS. ```python=3.9 vectorisation_full = TfidfVectorizer(analyzer=clean_sms) vect_final = vectorisation_full.fit_transform(data['content']) ``` ## Jeu de données final ![](https://i.imgur.com/aA8SIPf.png) ## Algorithmes et entrainement: Apres avoir comparer les resultats d'un modele base sur le support vector machine(SVM) et le Random forest, nous avons opté pour le modele utilsant le svm car il presentait nettement un score plus eleve par rapport au random forest ```python= from sklearn.metrics import precision_recall_fscore_support as score from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(final_data, data['label'], test_size=0.2) X_train, X_test, Y_train, Y_test = train_test_split(final_data, data['label'], test_size=0.2) alg_svm= svm.SVC(kernel = 'linear') alg_svm.fit(X_train, Y_train) predictions = alg_svm.predict(X_test) precision, recall, fscore, _ = score(Y_test, predictions, pos_label='spam', average='binary') print('Precision: {} / Recall: {} / Accuracy: {}'.format(round(precision, 3), round(recall, 3), round((predictions==Y_test).sum() / len(predictions),3))) ``` ## Resultat ![](https://i.imgur.com/2aj7zVN.png) ## conclusion Nous estimons avoir su mettre en pratiques les acquis du cours et nous sommes fiers d'avoir fait face à d'énormes défis que nous avons relevé pour réussir ce projet. Nous espérons continuer d’apprendre dans cette lance pour devenir des experts en la matière