目錄
樸素貝葉斯(垃圾郵件分類)參考案例http://www./article/13777 郵箱訓(xùn)練集可以加我微信:chenyoudea 模塊導(dǎo)入import re import os from jieba import cut from itertools import chain from collections import Counter import numpy as np from sklearn.naive_bayes import MultinomialNB 文本預(yù)處理def get_words(filename): """讀取文本并過濾無效字符和長度為1的詞""" words = [] with open(filename, 'r', encoding='utf-8') as fr: for line in fr: line = line.strip() # 過濾無效字符 line = re.sub(r'[.【】0-9、——。,!~\*]', '', line) # 使用jieba.cut()方法對文本切詞處理 line = cut(line) # 過濾長度為1的詞 line = filter(lambda word: len(word) > 1, line) words.extend(line) return words 遍歷郵件all_words = [] def get_top_words(top_num): """遍歷郵件建立詞庫后返回出現(xiàn)次數(shù)最多的詞""" filename_list = ['郵件_files/{}.txt'.format(i) for i in range(151)] # 遍歷郵件建立詞庫 for filename in filename_list: all_words.append(get_words(filename)) # itertools.chain()把a(bǔ)ll_words內(nèi)的所有列表組合成一個列表 # collections.Counter()統(tǒng)計(jì)詞個數(shù) freq = Counter(chain(*all_words)) return [i[0] for i in freq.most_common(top_num)] top_words = get_top_words(100) # 構(gòu)建詞-個數(shù)映射表 vector = [] for words in all_words: ''' words: ['國際', 'SCI', '期刊', '材料', '結(jié)構(gòu)力學(xué)', '工程', '雜志', '國際', 'SCI', '期刊', '先進(jìn)', '材料科學(xué)', '材料', '工程', '雜志', '國際', 'SCI', '期刊', '圖像處理', '模式識別', '人工智能', '工程', '雜志', '國際', 'SCI', '期刊', '數(shù)據(jù)', '信息', '科學(xué)雜志', '國際', 'SCI', '期刊', '機(jī)器', '學(xué)習(xí)', '神經(jīng)網(wǎng)絡(luò)', '人工智能', '雜志', '國際', 'SCI', '期刊', '能源', '環(huán)境', '生態(tài)', '溫度', '管理', '結(jié)合', '信息學(xué)', '雜志', '期刊', '網(wǎng)址', '論文', '篇幅', '控制', '以上', '英文', '字?jǐn)?shù)', '以上', '文章', '撰寫', '語言', '英語', '論文', '研究', '內(nèi)容', '詳實(shí)', '方法', '正確', '理論性', '實(shí)踐性', '科學(xué)性', '前沿性', '投稿', '初稿', '需要', '排版', '錄用', '提供', '模版', '排版', '寫作', '要求', '正規(guī)', '期刊', '正規(guī)', '操作', '大牛', '出版社', '期刊', '期刊', '質(zhì)量', '放心', '檢索', '穩(wěn)定', '邀請函', '推薦', '身邊', '老師', '朋友', '打擾', '請諒解'] ''' word_map = list(map(lambda word: words.count(word), top_words)) ''' word_map: [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0] ''' vector.append(word_map) 訓(xùn)練模型vector = np.array(vector) # 0-126.txt為垃圾郵件標(biāo)記為1;127-151.txt為普通郵件標(biāo)記為0 labels = np.array([1]*127 + [0]*24) model = MultinomialNB() model.fit(vector, labels) 測試模型def predict(filename): """對未知郵件分類""" # 構(gòu)建未知郵件的詞向量 words = get_words(filename) current_vector = np.array( tuple(map(lambda word: words.count(word), top_words))) # 預(yù)測結(jié)果 result = model.predict(current_vector.reshape(1, -1)) return '**垃圾郵件**' if result == 1 else '普通郵件' print('151.txt分類情況:{}'.format(predict('郵件_files/151.txt'))) print('152.txt分類情況:{}'.format(predict('郵件_files/152.txt'))) print('153.txt分類情況:{}'.format(predict('郵件_files/153.txt'))) print('154.txt分類情況:{}'.format(predict('郵件_files/154.txt'))) print('155.txt分類情況:{}'.format(predict('郵件_files/155.txt'))) |
|