TfidfVectorizer计算TF-IDF 四、实现

文章目录四、实现(计算TF-IDF) 五、知识点查漏补缺
一、数据集和资料
数据集,提取码:me46
参考博客1:参考博客1
参考博客2:参考博客2
二、流程 从电子邮箱中收集垃圾和非垃圾邮件训练集 。读取全部训练集,删除其中的干扰字符,如例如【】* 。、,等等,然后分词,删除长度为1的单个字 。统计全部训练集中词语的出现次数,截取出现最多的前N个(可以根据实际情况进行调整)根据每个经过第二步预处理后垃圾邮件和非垃圾邮件内容生成特征向量,统计第三步中得到的N个词语在本邮件中出现的频率 。根据第四步中得到的特征向量和已知邮件分类创建并训练朴素叶贝斯模型 。读取测试邮件,参考第二步,对邮件文本进行预处理,提取特征向量 。使用第五步中训练好的模型,根据第六步提取的特征向量对邮件进行分类 。三、实现(自己计算词频) 导包
# -*- coding: utf-8 -*from os import listdirfrom re import sub # 字符串正则过滤from collections import Counter # 单词计数import numpy as npimport warningsfrom jieba import cut # 切词from sklearn.naive_bayes import MultinomialNB# 多项式朴素叶贝斯模型from sklearn.metrics import accuracy_score # 测试
切词
def getWordsFromFile(file_path):"""对文本进行切词:param file_path: txt文本路径:return: 用空格分词的字符串"""words = []with open(file_path, encoding='utf-8') as fp:for line in fp:line = line.strip()# 过滤干扰字符或者无效字符line = sub(r'[.【】0-9、一 。,!~\*]', '', line)# 使用jieb的cut函数进行分词line = cut(line)# 过滤长度为1的词line = filter(lambda word: len(word) > 1, line)words.extend(line)return words
读取数据集
def getWords(file_dir):"""将路径下的所有文件加载:param file_dir: 保存txt文件目录:return: 分词后的文档列表"""words=[]file_list = listdir(file_dir)for file in file_list:file_path = file_dir + '/' + filewords.append(getWordsFromFile(file_path))return words
统计训练集中出现最多的TopN个单词
def getTopNWords(words,topN):"""获取出现次数最多的前topN个单词:param words: 需要统计的序列:param topN: 统计的个数:return: 出现次数最多的前topN个单词"""# 因为需要对所有的文本中的单词计数,需要将allWords中的元素(子列表)合并,这里使用了列表推导式实现freq = Counter([x for l in words for x in l])# freq.most_common(topN) 返回[('blue', 3), ('red', 2)] 我们取每个元素的第一个元素即可return [w[0] for w in freq.most_common(topN)]
生成特征向量
def get_feature(words,topWords):# 获取训练集的特征向量,前600个单词中每个单词在每个邮件中出现的频率"""获取特征向量:param words: 需要获取特征向量的序列:param topWords: topN个单词:return: 特征向量"""features = []for words in words:temp = list(map(lambda x: words.count(x), topWords))features.append(temp)features = np.array(features)return features
函数调用和模型学习

TfidfVectorizer计算TF-IDF  四、实现

文章插图
# 获取训练数据 topN个单词和特征向量train_words_list=getWords('data/train')topWords = getTopNWords(train_words_list,800)train_features=get_feature(train_words_list, topWords)# 获取测试数据 和特征向量test_words_list=getWords('data/test')test_features=get_feature(test_words_list, topWords)# 邮箱标签,1表示垃圾邮件,0表示正常邮件train_labels = np.array([1]*127+[0]*24)test_labels = np.array([1,1,1,1,1,0,0])# 创建叶贝斯模型,使用已有数据进行训练clf = MultinomialNB(fit_prior=False,alpha=0.01).fit(train_features, train_labels)predicted_labels=clf.predict(test_features)# 计算准确率print('训练集精度:',clf.score(train_features, train_labels))# 测试准确率print('预测准确率为:', accuracy_score(test_labels, predicted_labels))