樸素貝葉斯--新浪新聞分類例項
對於英文的語句可以通過非字母和非數字進行切分,但是漢語中的一句話該如何進行切分呢?我們可以直接使用第三方分片語件,即jieba來實現分詞。
安裝
pip install jieba
切分中文語句
import os
import jieba
def TextProcessing(folder_path):
folder_list = os.listdir(folder_path) #檢視folder_path下的檔案
data_list = [] #訓練集
class_list = []
#遍歷每個子資料夾
for folder in folder_list:
new_folder_path = os.path.join(folder_path, folder) #根據子資料夾,生成新的路徑
files = os.listdir(new_folder_path) #存放子資料夾下的txt檔案的列表
j = 1
#遍歷每個txt檔案
for file in files:
if j > 100: #每類txt樣本數最多100個
break
with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f: #開啟txt檔案
raw = f.read()
word_cut = jieba.cut(raw, cut_all = False) #精簡模式,返回一個可迭代的generator
word_list = list(word_cut) #generator轉換為list
data_list.append(word_list)
class_list.append(folder)
j += 1
print(data_list)
print(class_list)
if __name__ == '__main__':
#文字預處理
folder_path = './SogouC/Sample' #訓練集存放地址
TextProcessing(folder_path)
執行結果:
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\mlj\AppData\Local\Temp\jieba.cache
Loading model cost 0.824 seconds.
Prefix dict has been built succesfully.
[['\u3000', '\u3000', '本報記者', '陳雪頻', '實習', '記者', '唐翔', '發自', '上海', '\n', '\u3000', '\u3000', '一家', '剛剛', '成立', '兩年', '的', '網路', '支付', '公司',
',', '它', '的', '目標', '是', '成為', '市值', '100', '億美元', '的', '上市公司', '。', '\n', '\u3000', '\u3000', '這家', '公司', '叫做', '快', '錢', ',', '說', '這句', '話', '的',
'是', '快', '錢', '的', 'CEO', '關國光', '。', '他', '之前', '曾任', '網易', '的', '高階', '副總裁', ',', '負責', '過', '網易', '的', '上市', '工作', '。', '對於', '為什麼', '選擇',
'第三方', '支付', '作為', '創業', '方向', ',', '他', '曾經', '對', '媒體', '這樣', '說', ':', '“', '我能', '看到', '這個', '衚衕', '對面', '是', '什麼', ',', '別人', '只能', '看到',
'這個', '衚衕', '。', '”', '自信', '與', '狂妄', '只有', '一步之遙', '—', '—', '這', '幾乎', '是', '所有', '創業者', '的', '共同', '特徵', ',', '是', '自信', '還是', '狂妄', '也許',
'需要', '留待', '時間', '來', '考證', '。', '\n', '\u3000', '\u3000', '對於', '市值', '100', '億美元', '的', '上市公司', ',', '他', '是', '這樣', '算', '這筆', '賬', '的', ',', '“',
'百度', '上市', '時', '廣告', '客戶', '數量', '只有', '4', '萬', ',', '而且', '它', '所', '做', '的', '只是', '把', '客戶', '吸引', '過來', ',', '就', '可以', '支撐', '起', '現有', '的',
'龐大', '市值', ';', '而', '我們', '幾年', '後', '的', '客戶', '數量', '是', '幾千萬', ',', '而且', '這些', '客戶', '都', '是', '能', '直接', '帶來', '利潤', '的', ',', '說', '市值', '100', '億美元', '一點', '都', '不', '誇張', '。', '”', '\n', '\u3000', '\u3000', '這家', '公司', '2005', '年', '年底', '註冊', '使用者', '達到', '400', '萬', ',', '計劃', '今年', '注
冊', '使用者', '突破', '1000', '萬', ',', '號稱', '是', '國內', '最大', '的', '第三方', '網路', '支付', '平臺', '。', '“', '在', '美國', '跟', '支付', '相關', '的', '收入', '已經', '超
過', '了', '所有', '商業銀行', '本身', '利差', '收入', '的', '總和', ',', '我', '所查', '到', '的', '資料', '是', '3000', '億美元', ',', '其中', '超過', '70', '%', '是', '個人',
...
...
...
...
'獲得', '軍隊', '指揮官', '的', '同情', ',', '他們', '認為', ',', '低腰褲', '嚴重威脅', '著', '以軍', '的', '紀律', '基礎', '。', '\n', '\u3000', '\u3000', '以軍', '要求', '女
兵', '們', '把', '那些', '改過', '的', '低腰褲', '交到', '軍需', '商店', ',', '以', '換回', '符合規定', '的', '軍褲', '。', '此外', ',', '目前', '已經', '約', '有', '120', '名', '女
兵', '因', '穿著', '違規', '低腰褲', '而', '被', '關禁閉', '。', '\u3000']]
['C000008', 'C000008', 'C000008', 'C000008', 'C000008', 'C000008', 'C000008', 'C000008', 'C000008', 'C000008', 'C000010', 'C000010', 'C000010',
'C000010', 'C000010', 'C000010', 'C000010', 'C000010', 'C000010', 'C000010', 'C000013', 'C000013', 'C000013', 'C000013', 'C000013', 'C000013',
'C000013', 'C000013', 'C000013', 'C000013', 'C000014', 'C000014', 'C000014', 'C000014', 'C000014', 'C000014', 'C000014', 'C000014', 'C000014',
'C000014', 'C000016', 'C000016', 'C000016', 'C000016', 'C000016', 'C000016', 'C000016', 'C000016', 'C000016', 'C000016', 'C000020', 'C000020',
'C000020', 'C000020', 'C000020', 'C000020', 'C000020', 'C000020', 'C000020', 'C000020', 'C000022', 'C000022', 'C000022', 'C000022', 'C000022',
'C000022', 'C000022', 'C000022', 'C000022', 'C000022', 'C000023', 'C000023', 'C000023', 'C000023', 'C000023', 'C000023', 'C000023', 'C000023',
'C000023', 'C000023', 'C000024', 'C000024', 'C000024', 'C000024', 'C000024', 'C000024', 'C000024', 'C000024', 'C000024', 'C000024']
文字特徵選擇
將所有文字分成訓練集和測試集,並對訓練集中的所有單詞進行詞頻統計,並按降序排序。也就是將出現次數多的詞語在前,出現次數少的詞語在後進行排序。
import os
import random
import jieba
"""
函式說明:中文文字處理
Parameters:
folder_path - 文字存放的路徑
test_size - 測試集佔比,預設佔所有資料集的百分之20
Returns:
all_words_list - 按詞頻降序排序的訓練集列表
train_data_list - 訓練集列表
test_data_list - 測試集列表
train_class_list - 訓練集標籤列表
test_class_list - 測試集標籤列表
"""
def TextProcessing(folder_path, test_size = 0.2):
folder_list = os.listdir(folder_path) #檢視folder_path下的檔案
data_list = [] #資料集資料
class_list = [] #資料集類別
#遍歷每個子資料夾
for folder in folder_list:
new_folder_path = os.path.join(folder_path, folder) #根據子資料夾,生成新的路徑
files = os.listdir(new_folder_path) #存放子資料夾下的txt檔案的列表
j = 1
#遍歷每個txt檔案
for file in files:
if j > 100: #每類txt樣本數最多100個
break
with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f: #開啟txt檔案
raw = f.read()
word_cut = jieba.cut(raw, cut_all = False) #精簡模式,返回一個可迭代的generator
word_list = list(word_cut) #generator轉換為list
data_list.append(word_list) #新增資料集資料
class_list.append(folder) #新增資料集類別
j += 1
data_class_list = list(zip(data_list, class_list)) #zip壓縮合並,將資料與標籤對應壓縮
random.shuffle(data_class_list) #將data_class_list亂序
index = int(len(data_class_list) * test_size) + 1 #訓練集和測試集切分的索引值
train_list = data_class_list[index:] #訓練集
test_list = data_class_list[:index] #測試集
train_data_list, train_class_list = zip(*train_list) #訓練集解壓縮
test_data_list, test_class_list = zip(*test_list) #測試集解壓縮
all_words_dict = {} #統計訓練集詞頻
for word_list in train_data_list:
for word in word_list:
if word in all_words_dict.keys():
all_words_dict[word] += 1
else:
all_words_dict[word] = 1
#根據鍵的值倒序排序
all_words_tuple_list = sorted(all_words_dict.items(), key = lambda f:f[1], reverse = True)
all_words_list, all_words_nums = zip(*all_words_tuple_list) #解壓縮
all_words_list = list(all_words_list) #轉換成列表
return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list
if __name__ == '__main__':
#文字預處理
folder_path = './SogouC/Sample' #訓練集存放地址
all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)
print(all_words_list)
執行結果:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\mlj\AppData\Local\Temp\jieba.cache
Loading model cost 0.746 seconds.
Prefix dict has been built succesfully.
[',', '的', '\u3000', '。', '\n', ';', '&', 'nbsp', ' ', '、', '在', '了', '是', '“', '”', '和', ':', '也', '我', '有', '就', '對', '上', '為', '這', '將', '—', '他', '公司', '中', '而', '月', '不', 、'要', '都', '年', '你', '與', '一個', '(', ')', '中國', '自己', '可以', '考生', '日', ';', '從', '導彈', '等', '大陸', '到', '人', '3', '.', '(', ')', '火炮', '臺軍', '個', '時', '進行',
'會', '時間', '多', '認為', '北京', '1', '但', '5', '市場', '以', '志願', '一種', '0', '說', '讓', '新', '各種', '解放軍', '沒有', '旅遊', '能', '企業', '後', '已經', '遊客', '美國',
'大', '[', ']', '把', '並', '被', '%', '來', '還', '更', '作戰', '地', '用', '《', '》', '2', '做', '成為', '藥', '複習', '很', '仿製', ',', '這樣', '下', '4', '學校', '大家', '9', '很多', '選擇',
'-', '主要', '如果', '最', '分析', '目前', '小', '工作', '問題', '一定', '10', '6', '前', '可', '遠端', '又', '我們', '品牌', '這些', '射程', '可能', '去', '給', '通過', '時候', '看', '考
試', '基礎', '使', '億美元', '上海', '?', '2', '詞彙', '輔導班', '家', '該', '專業', '完全', '文章', '部分', '部署', '需要', '就是', '能力', '因為', '快', '0', '他們', '黃金週',
'好', '畢業生', '五一', '增長', '錢', '填報', '16', '著', '8', '一', '一些', '2005', '技術', '學習', '支付', '.', '/', 'VS', '袁', '比', '其中', '重要', '專家', '由', '那些', '但是',
'過', '她', '7', '由於', '接待', '這個', '計劃', '表示', '它', '其', '所以', '銀行', '陣地', '期間', '比較', '萬人次', '收入', '向', '資料', '60', '影響', '分', '使用者', '坦克', '設
計', '為了', '出', '電話', '於', '只有', '其他', '2006', '管理', '得', '產品', '所', '要求', '銷售', '1', '根據', '訓練', '擁有', '今年', '表現', '相對', '老師', '必須', '對於',
'或', '新浪', '當', '開始', '同時', '作為', '提高', '則', '閱讀', '講', '使用', '00', '網路', '軍事', '發現', '不是', '據', '來源', '卻', '發展', '30', '專案', '重點', '寫作', '一旦',
...
...
...
'成就', '由衷', '地替', '感到高興', '焦點', '個股', '002024', '該股', '開盤', '其後', '獲利盤', '壓下', '買盤', '下該', '股', '封於', '可見', '拉昇', '盤面', '層面', '小幅',
'探低', '回升', '上揚', '翻紅', '之強', '瞠目結舌', '繁榮', '需謹慎', '必竟', '上攻', '消耗', '動能', '退溫', '外擴散', '活跌', '有色金屬', '地產股', '向外', '軍工', '航天
航空', '規避', '技術性', '回撥', '追高']
一個簡單的規則可以這樣制定:首先去掉高頻詞,至於去掉多少個高頻詞,我們可以通過觀察去掉高頻詞個數和最終檢測準確率的關係來確定。除此之外,去除數字,不把數字作為分類特徵。同時,去除一些特定的詞語,比如:”的”,”一”,”在”,”不”,”當然”,”怎麼”這類的對新聞分類無影響的介詞、代詞、連詞。怎麼去除這些詞呢?可以使用已經整理好的stopwords_cn.txt文字。下
載地址:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Naive Bayes/stopwords_cn.txt
我們可以根據這個文件,將這些單詞去除,不作為分類的特徵。我們先去除前100個高頻詞彙,然後編寫程式碼如下:
import os
import random
import jieba
"""
函式說明:中文文字處理
Parameters:
folder_path - 文字存放的路徑
test_size - 測試集佔比,預設佔所有資料集的百分之20
Returns:
all_words_list - 按詞頻降序排序的訓練集列表
train_data_list - 訓練集列表
test_data_list - 測試集列表
train_class_list - 訓練集標籤列表
test_class_list - 測試集標籤列表
"""
def TextProcessing(folder_path, test_size = 0.2):
folder_list = os.listdir(folder_path) #檢視folder_path下的檔案
data_list = [] #資料集資料
class_list = [] #資料集類別
#遍歷每個子資料夾
for folder in folder_list:
new_folder_path = os.path.join(folder_path, folder) #根據子資料夾,生成新的路徑
files = os.listdir(new_folder_path) #存放子資料夾下的txt檔案的列表
j = 1
#遍歷每個txt檔案
for file in files:
if j > 100: #每類txt樣本數最多100個
break
with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f: #開啟txt檔案
raw = f.read()
word_cut = jieba.cut(raw, cut_all = False) #精簡模式,返回一個可迭代的generator
word_list = list(word_cut) #generator轉換為list
data_list.append(word_list) #新增資料集資料
class_list.append(folder) #新增資料集類別
j += 1
data_class_list = list(zip(data_list, class_list)) #zip壓縮合並,將資料與標籤對應壓縮
random.shuffle(data_class_list) #將data_class_list亂序
index = int(len(data_class_list) * test_size) + 1 #訓練集和測試集切分的索引值
train_list = data_class_list[index:] #訓練集
test_list = data_class_list[:index] #測試集
train_data_list, train_class_list = zip(*train_list) #訓練集解壓縮
test_data_list, test_class_list = zip(*test_list) #測試集解壓縮
all_words_dict = {} #統計訓練集詞頻
for word_list in train_data_list:
for word in word_list:
if word in all_words_dict.keys():
all_words_dict[word] += 1
else:
all_words_dict[word] = 1
#根據鍵的值倒序排序
all_words_tuple_list = sorted(all_words_dict.items(), key = lambda f:f[1], reverse = True)
all_words_list, all_words_nums = zip(*all_words_tuple_list) #解壓縮
all_words_list = list(all_words_list) #轉換成列表
return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list
"""
函式說明:讀取檔案裡的內容,並去重
Parameters:
words_file - 檔案路徑
Returns:
words_set - 讀取的內容的set集合
"""
def MakeWordsSet(words_file):
words_set = set() #建立set集合
with open(words_file, 'r', encoding = 'utf-8') as f: #開啟檔案
for line in f.readlines(): #一行一行讀取
word = line.strip() #去回車
if len(word) > 0: #有文字,則新增到words_set中
words_set.add(word)
return words_set #返回處理結果
"""
函式說明:文字特徵選取
Parameters:
all_words_list - 訓練集所有文字列表
deleteN - 刪除詞頻最高的deleteN個詞
stopwords_set - 指定的結束語
Returns:
feature_words - 特徵集
"""
def words_dict(all_words_list, deleteN, stopwords_set = set()):
feature_words = [] #特徵列表
n = 1
for t in range(deleteN, len(all_words_list), 1):
if n > 1000: #feature_words的維度為1000
break
#如果這個詞不是數字,並且不是指定的結束語,並且單詞長度大於1小於5,那麼這個詞就可以作為特徵詞
if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
feature_words.append(all_words_list[t])
n += 1
return feature_words
if __name__ == '__main__':
#文字預處理
folder_path = './SogouC/Sample' #訓練集存放地址
all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)
#生成stopwords_set
stopwords_file = './stopwords_cn.txt'
stopwords_set = MakeWordsSet(stopwords_file)
feature_words = words_dict(all_words_list, 100, stopwords_set)
print(feature_words)
執行結果:
['黃金週', '目前', '企業', '支付', '增長', '仿製', '複習', '主要', '成為', '五一', '工作', '發展', '學校', '比賽', '遠端', '可能', '很多', '分析', '通過', '射程', '接待', '技
術', '完全', '作戰', '萬人次', '記者', '時候', '基礎', '億美元', '建設', '選擇', '部署', '輔導班', '期間', '電話', '問題', '表示', '上海', '專業', '能力', '畢業生', '今年',
'重要', '收入', '比較', '填報', '達到', '訓練', '使用', '一定', '部隊', 'VS', '開始', '擁有', '表現', '情況', '幾乎', '現在', '軍事', '銷售', '使用者', '專案', '人數', '發現', '需
要', '資料', '相對', '服務', '科學', '提高', '希望', '坦克', '最大', '陣地', '文章', '管理', '影響', '專家', '學習', '參加', '活動', '日本', '提供', '網路', '這是', '來源', '實
驗室', '重點', '東莞', '英語', '印度', '考古', '一次', '裝備', '專利', '一直', '人才', 'MBA', '考試', '計劃', '招聘', '大批', '公里', '一家', '要求', '數字', '阿里', '耿大勇',
'島嶼', '詞彙', '最後', '去年', '相關', '孩子', '不用', '協議', '不同', '徹底', '不能', '機會', '壓制', '遊戲', '睡眠', '沿海', '角度', '摧毀', '顯示', '產品', '不會', '臺灣',
'設計', '知道', '新型', '非常', '行業', '出現', '準備', '系統', '一批', '全軍', '數學', '閱讀', '全國', '國家', '瞭解', '大學生', '方式', '數獨', '置於', '距離', '挑釁', '兩個',
'告訴', '看到', '左右', '進入', '考慮', '必須', '注意', '作用', '歷史', '大學', '國內', '排名', '醫院', '納斯', '我國', '自尋死路', '世界領先', '型號', '開戰', '金貴', '海量',
'之內', '費多', '力氣', '廉價', '發展觀', '景區', '全面', '目標', '部分', '完成', '藥廠', '預期', '經濟', '戰場', '平臺', '地方', '老師', '瀋陽市', '介紹', '廣東', '這種', '牛
奶', '包括', '決定', '手機', '此前', '是否', '知識', '連續', '增加', '方面', '我軍', '錄取', '止痛藥', '東引島', '軍隊', '明顯', '特別', '景點', '最佳', '大量', '第一次', '獲
得', '應該', '基本', '網上', '不斷', '知識點', '建議', '旅行社', '南京', '這家', '越來越', '複試', '分期付款', '考研', '語法', '香港', '數量', '推出', '成功', '概念', '理由',
'事情', '正在', '結果', '交易', '代表', '未來', '藥物', '之後', '價值', '願意', '容易', '條件', '理解', '吸引', '超過', '世界', '對手', '設立', '訊息', '營養', '鎮痛藥', '武器',
'遼寧隊', '本場', '同比', '消費', '特點', '相簿', '第一', '幫助', '領導', '上市', '研究', '組織', '得到', '掌握', '全球', '社會', '支援', '學員', '實現', '利用', '文化', '萬元',
'業務', '著名', '知名', '詹姆斯', '能夠', '利苑', '埃及', '院校', '王治郅', '回家', '億元', '休閒', '思路', '不要', '根本', '整個', '上午', '一年', '釋出', '穩定', '最近', '數
據', '內容', '指揮', '資訊化', '功能', '電子', '各型', '水平', '過程', '其實', '應用', '報導', '更加', '不少', '喜歡', '客場', '簡歷', '教育', '患者', '電腦', '免息', '句子',
'昨天', '市民', '有限公司', '一位', '這次', '感覺', '再次', '一下', '過年', '感到', '發生', '當時', '具有', '國際', '一場', '指出', '調查', '賠償', '之間', '製藥', '領域', '原
因', '醫療', '職業', '銀行', '關注', '參與', '往往', '平時', '每個', '經驗', '我省', '關國光', '之前', '結束', '伯德', '姚明', '過去', '提前', '補充', '今天', '分公司', '面試',
'治療', '公佈', '疼痛', '備考', '方向', '振保', '三個', '取得', '努力', '一起', '預計', '加強', '資訊', '實施', '傳統', '找到', '解題', '公式', '一般', '形成', '韓國', '元老',
'運動', '生活', '工程', '口技', '主場', '最好', '酒家', '食物', '標題', '翻譯', '下載', '網站', '女士', '去年同期', '泰國', '失眠', '密碼', '批次', '本科', '火力', '評選', '遺
址', '晉升', '開通', '起來', '小時', '同事', '同學', '集團', '每股', '價格', '戰爭', '歐洲', '環境', '培訓', '文物', '醫藥', '統計', '主動', '發出', '壓力', '這一', '狀態', '戰
鬥', '官兵', '綜合', '進攻', '中心', '培養', '促進', '題型', '關係', '以下', '每天', '求職', '標準', '跨國公司', '第三方', '客戶', '面對', '保證', '合作', '三分', '勝利', '第
二', '教材', '堅持', '很快', '很大', '十分', '法國', '規則', '總部', '俄羅斯', '廣播', '吸收', '家長', '補報', '升旗', '新浪', '聽課', '寫作', '關鍵字', '美國線上', '東部',
'內容摘要', '電視', '負責人', '時代', '鄉村', '出遊', '出境遊', '下降', '回到', '實力', '意味著', '變得', '一樣', '充足', '城市', '發揮', '優勢', '基地', '模擬', '銷售額',
'共同', '先後', '平均', '力量', '敏華', '留下', '充分', '聯絡', '突出', '方法', '參看', '矩陣', '同期', '提升', '旅遊者', '負責', '瀋陽', '圍棋', '首次', '產生', '職位', '上年',
'規模', '學生', '第三', '剛剛', '網上支付', '因素', '效果', '創造', '米勒', '罰球', '採取', 'NBA', '困難', '月份', '巨大', '埃弗頓', '俱樂部', '研究所', '騙局', '有點', '舉
辦', '旅遊業', '萬人', '人體', '可選報', '阿片類', '吸菸', '戒菸', 'gt', '國防', '遼足', '馬林', '唐堯東', '初盤', '場位', '需求', '各地', '地區', '相比', '集中', '聯想', '最
高', '提出', '一頁', '相當', '迅速', '幾天', '簡單', '年前', '機票', '感受', '避免', '真正', '簽訂', '年度', '雙方', '高階', '生產', '競爭', '練習', '主題', '展開', '經常', '開
展', '商業', '購買', '空間', '更是', '泰華', '快速', '幾年', '階段', '有望', '收益', '經理', '年代', '戰略', '增強', '正式', '經營', '直接', '宣佈', '這部分', '比例', '尤其',
'相互', '關鍵', '固定', '幾個', '概率', '性質', '考題', '有效', '投訴', '進一步', '團隊', '兩年', '之一', '舉行', '迎來', '經典', '不足', '從事', '優秀', '突破', '工具', '安全
性', '運用', '預測', '攻擊', '連隊', '荷蘭', '足彩', '聯賽', '佛羅倫薩', '切沃', '表明', '廣州', '單位', '必要', '半導體', '搜尋', '身高', '生長', '國旗', '短程', '戰術導彈',
'點穴', '改革', '海上', '業績', '安妮', '呼叫', '汪力', '費用', '女兵', '家教', '精讀', '本書', '高清晰', '成立', '紅玫瑰', '白玫瑰', '指導', '語言', '重新', '變成', '積極',
'操作', '持續', '春節', 'www', '真的', '汽車', '下來', '七天', '表演', '兄弟', '批准', '戰術', '報告', '程度', '一半', '繼續', '類似', '導致', '生物製藥', '生物', '製劑', '增
幅', '市營率', '分鐘', '地位', '推薦', '擔任', '本報', '來到', '學院', '各級', '精神', '結合', '理論', '學科', '資源', '注重', '查詢', '責任', '總結', '每年', '相當於', '說明',
'線性代數', '自然', '事件', '好好', '函式', '考前', '輔導書', '最終', '機制', '門票', '帶來', '商機', '陳祖德', '即將', '本報記者']
我們已經濾除了那些沒有用的片語,這個feature_words就是我們最終選出的用於新聞分類的特徵。隨後,我們就可以根據feature_words,將文字向量化,然後用於訓練樸素貝葉斯分類器。
分類器的測試
# -*- coding: UTF-8 -*-
from sklearn.naive_bayes import MultinomialNB
import matplotlib.pyplot as plt
import os
import random
import jieba
"""
函式說明:中文文字處理
Parameters:
folder_path - 文字存放的路徑
test_size - 測試集佔比,預設佔所有資料集的百分之20
Returns:
all_words_list - 按詞頻降序排序的訓練集列表
train_data_list - 訓練集列表
test_data_list - 測試集列表
train_class_list - 訓練集標籤列表
test_class_list - 測試集標籤列表
Author:
Jack Cui
Blog:
http://blog.csdn.net/c406495762
Modify:
2017-08-22
"""
def TextProcessing(folder_path, test_size = 0.2):
folder_list = os.listdir(folder_path) #檢視folder_path下的檔案
data_list = [] #資料集資料
class_list = [] #資料集類別
#遍歷每個子資料夾
for folder in folder_list:
new_folder_path = os.path.join(folder_path, folder) #根據子資料夾,生成新的路徑
files = os.listdir(new_folder_path) #存放子資料夾下的txt檔案的列表
j = 1
#遍歷每個txt檔案
for file in files:
if j > 100: #每類txt樣本數最多100個
break
with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f: #開啟txt檔案
raw = f.read()
word_cut = jieba.cut(raw, cut_all = False) #精簡模式,返回一個可迭代的generator
word_list = list(word_cut) #generator轉換為list
data_list.append(word_list) #新增資料集資料
class_list.append(folder) #新增資料集類別
j += 1
data_class_list = list(zip(data_list, class_list)) #zip壓縮合並,將資料與標籤對應壓縮
random.shuffle(data_class_list) #將data_class_list亂序
index = int(len(data_class_list) * test_size) + 1 #訓練集和測試集切分的索引值
train_list = data_class_list[index:] #訓練集
test_list = data_class_list[:index] #測試集
train_data_list, train_class_list = zip(*train_list) #訓練集解壓縮
test_data_list, test_class_list = zip(*test_list) #測試集解壓縮
all_words_dict = {} #統計訓練集詞頻
for word_list in train_data_list:
for word in word_list:
if word in all_words_dict.keys():
all_words_dict[word] += 1
else:
all_words_dict[word] = 1
#根據鍵的值倒序排序
all_words_tuple_list = sorted(all_words_dict.items(), key = lambda f:f[1], reverse = True)
all_words_list, all_words_nums = zip(*all_words_tuple_list) #解壓縮
all_words_list = list(all_words_list) #轉換成列表
return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list
"""
函式說明:讀取檔案裡的內容,並去重
Parameters:
words_file - 檔案路徑
Returns:
words_set - 讀取的內容的set集合
Author:
Jack Cui
Blog:
http://blog.csdn.net/c406495762
Modify:
2017-08-22
"""
def MakeWordsSet(words_file):
words_set = set() #建立set集合
with open(words_file, 'r', encoding = 'utf-8') as f: #開啟檔案
for line in f.readlines(): #一行一行讀取
word = line.strip() #去回車
if len(word) > 0: #有文字,則新增到words_set中
words_set.add(word)
return words_set #返回處理結果
"""
函式說明:根據feature_words將文字向量化
Parameters:
train_data_list - 訓練集
test_data_list - 測試集
feature_words - 特徵集
Returns:
train_feature_list - 訓練集向量化列表
test_feature_list - 測試集向量化列表
Author:
Jack Cui
Blog:
http://blog.csdn.net/c406495762
Modify:
2017-08-22
"""
def TextFeatures(train_data_list, test_data_list, feature_words):
def text_features(text, feature_words): #出現在特徵集中,則置1
text_words = set(text)
features = [1 if word in text_words else 0 for word in feature_words]
return features
train_feature_list = [text_features(text, feature_words) for text in train_data_list]
test_feature_list = [text_features(text, feature_words) for text in test_data_list]
return train_feature_list, test_feature_list #返回結果
"""
函式說明:文字特徵選取
Parameters:
all_words_list - 訓練集所有文字列表
deleteN - 刪除詞頻最高的deleteN個詞
stopwords_set - 指定的結束語
Returns:
feature_words - 特徵集
Author:
Jack Cui
Blog:
http://blog.csdn.net/c406495762
Modify:
2017-08-22
"""
def words_dict(all_words_list, deleteN, stopwords_set = set()):
feature_words = [] #特徵列表
n = 1
for t in range(deleteN, len(all_words_list), 1):
if n > 1000: #feature_words的維度為1000
break
#如果這個詞不是數字,並且不是指定的結束語,並且單詞長度大於1小於5,那麼這個詞就可以作為特徵詞
if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
feature_words.append(all_words_list[t])
n += 1
return feature_words
"""
函式說明:新聞分類器
Parameters:
train_feature_list - 訓練集向量化的特徵文字
test_feature_list - 測試集向量化的特徵文字
train_class_list - 訓練集分類標籤
test_class_list - 測試集分類標籤
Returns:
test_accuracy - 分類器精度
Author:
Jack Cui
Blog:
http://blog.csdn.net/c406495762
Modify:
2017-08-22
"""
def TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list):
classifier = MultinomialNB().fit(train_feature_list, train_class_list)
test_accuracy = classifier.score(test_feature_list, test_class_list)
return test_accuracy
if __name__ == '__main__':
#文字預處理
folder_path = './SogouC/Sample' #訓練集存放地址
all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)
# 生成stopwords_set
stopwords_file = './stopwords_cn.txt'
stopwords_set = MakeWordsSet(stopwords_file)
test_accuracy_list = []
deleteNs = range(0, 1000, 20) #0 20 40 60 ... 980
for deleteN in deleteNs:
feature_words = words_dict(all_words_list, deleteN, stopwords_set)
train_feature_list, test_feature_list = TextFeatures(train_data_list, test_data_list, feature_words)
test_accuracy = TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list)
test_accuracy_list.append(test_accuracy)
# ave = lambda c: sum(c) / len(c)
# print(ave(test_accuracy_list))
plt.figure()
plt.plot(deleteNs, test_accuracy_list)
plt.title('Relationship of deleteNs and test_accuracy')
plt.xlabel('deleteNs')
plt.ylabel('test_accuracy')
plt.show()
執行結果:
相關文章
- 樸素貝葉斯分類
- 樸素貝葉斯和半樸素貝葉斯(AODE)分類器Python實現Python
- 樸素貝葉斯/SVM文字分類文字分類
- 分類演算法-樸素貝葉斯演算法
- 樸素貝葉斯實現文件分類
- Sklearn中的樸素貝葉斯分類器`
- 樸素貝葉斯分類流程圖介紹流程圖
- HanLP-樸素貝葉斯分類預測缺陷HanLP
- 機器學習之樸素貝葉斯分類機器學習
- [譯] Sklearn 中的樸素貝葉斯分類器
- 樸素貝葉斯模型模型
- (實戰)樸素貝葉斯實現垃圾分類_201121
- 樸素貝葉斯分類-實戰篇-如何進行文字分類文字分類
- ML-樸素貝葉斯
- 詳解樸素貝葉斯的來源,原理以及例項解析
- 樸素貝葉斯入門例項之就是這麼簡單
- 簡單易懂的樸素貝葉斯分類演算法演算法
- 概率分類之樸素貝葉斯分類(垃圾郵件分類python實現)Python
- 使用貝葉斯進行新聞分類
- 樸素貝葉斯與Laplace平滑
- 樸素貝葉斯演算法演算法
- 樸素貝葉斯—印第安人
- 有監督學習——支援向量機、樸素貝葉斯分類
- 第7章 基於樸素貝葉斯的垃圾郵件分類
- 機器學習經典演算法之樸素貝葉斯分類機器學習演算法
- 監督學習之樸素貝葉斯
- 04_樸素貝葉斯演算法演算法
- 高階人工智慧系列(一)——貝葉斯網路、機率推理和樸素貝葉斯網路分類器人工智慧
- 樸素貝葉斯分類和預測演算法的原理及實現演算法
- 使用樸素貝葉斯過濾垃圾郵件
- Python實現 利用樸素貝葉斯模型(NBC)進行問句意圖分類Python模型
- 機器學習Sklearn系列:(四)樸素貝葉斯機器學習
- 【機器學習基礎】樸素貝葉斯對B站彈幕分類(是否永久封禁)機器學習
- 樸素貝葉斯演算法的實現與推理演算法
- ML-樸素貝葉斯-先驗分佈/後驗分佈/似然估計
- 《統計學習方法》——樸素貝葉斯程式碼實現
- 【火爐煉AI】機器學習010-用樸素貝葉斯分類器解決多分類問題AI機器學習
- 100天搞定機器學習|Day15 樸素貝葉斯機器學習