当前位置:   article > 正文

基于TF-IDF模型和朴素贝叶斯模型训练分类模型实现垃圾邮件识别_用tf-idf模型提取邮件特征,朴素贝叶斯模型训练分类模型实现垃圾邮件识别并分析模

用tf-idf模型提取邮件特征,朴素贝叶斯模型训练分类模型实现垃圾邮件识别并分析模

文章目录


前言

内容仅供参考,本篇基于python描述文本数据处理相关内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实验目的

  1. 掌握jieba库的使用,学会中文分词、词性标注、特征提取。

  2. 掌握词袋模型特征和TF-IDF模型。

  3. 了解案例:垃圾邮件识别。

二、实验环境

  1.  操作系统:Windows  

  2. 应用软件:anaconda jupyter

三、实验内容与结果 

特征提取:对于文本数据计算机无法直接处理,需要先将其数字化。特征提取的目的是将文本字符串转换为数字特征向量。常用的模型包括:
·词袋模型(Bag of word)
·TF-IDF(term frequency–inverse document frequency)
·词向量模型

(一)词袋模型

例7-3:提取文档集的词袋特征

文档集
句子1:“我是中国人,我爱中国” 
句子2:“我是上海人” 
句子3:“我住在上海松江大学城”

建立词袋模型:分词,构建词典

 

根据词典,构建词袋向量
句子1:[0 2 1 0 0 0 2 1 0 1]  上海0次,中国2次、人1次......

句子2:[1 0 1 0 0 0 1 1 0 0]

句子3:[1 0 0 1 1 1 1 0 1 0]

(二)TF-IDF模型

TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。 

 TF-IDF是一种统计方法,用以评估一字/词对于一个文件集或一个语料库中的某份文件的重要程度。字词的重要性与它在文件中出现的次数成正比升高,但同时会随着它在语料库中出现的频率成反比下降。

   TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

 Scikit-learn中计算TF-IDF 值有两种方法:

一、CountVectorizer类 向量化之后 再调用TfidfTransformer类

二、用TfidfVectorizer完成向量化 与TF-IDF计算

例题一文档集包含以下5条文本

"我是中国人,我爱中国"

"我是上海人"

"我住在上海松江大学城"

"松江大学城有很多大学"

"大学城共有15万余大学生"

提取以上文档集的词袋模型特征(包含字符数为1的词作为特征词)和TF-IDF模型特征

  1. from sklearn.feature_extraction.text import CountVectorizer
  2. import jieba
  3. import warnings
  4. warnings.filterwarnings("ignore")
  5. #给出文档集,放在字符串列表中
  6. corpus = ["我是中国人,我爱中国",
  7. "我是上海人",
  8. "我住在上海松江大学城",
  9. "松江大学城有很多大学",
  10. "大学城共有15万余大学生" ]
  11. split_corpus = [] #初始化存储分词结果的列表
  12. for txt in corpus:
  13. #将jieba分词后的字符串列表拼接为一个字符串,元素之间用" "分割,每个句子分词结果 精确分词
  14. words = " ".join(jieba.lcut(txt)) #用” ”将多个词拼接为一个字符串
  15. split_corpus.append(words) #将分词结果字符串添加到列表中
  16. print(split_corpus)

  1. cv = CountVectorizer(token_pattern=r"(?u)\b\w+\b")#根据输入数据,获取词频矩阵
  2. cv_fit=cv.fit_transform(split_corpus) #生成词袋向量
  3. #即将从数据集中学到的特征应用到数据集中
  4. print(cv.get_feature_names()) #显示特征列表
  5. print(cv_fit.toarray()) #显示特征向量

  1. from sklearn.feature_extraction.text import TfidfTransformer
  2. tfidf_transformer = TfidfTransformer()#将文本词袋特征转化为TF-IDF值
  3. tfidf_fit = tfidf_transformer.fit_transform(cv_fit)
  4. #显示TF-IDF特征向量
  5. print(tfidf_fit.toarray())

例题二:用TF-IDF模型提取邮件特征,朴素贝叶斯模型训练分类模型实现垃圾邮件识别并分析模型性能。 

  1. from sklearn.feature_extraction.text import CountVectorizer
  2. import jieba
  3. from sklearn.naive_bayes import GaussianNB
  4. from sklearn import model_selection #划分测试集训练集
  5. from sklearn import metrics #评估性能
  6. #1、从文件中读出邮件内容,存放在列表中
  7. train_file = open(".\mailcorpus.txt", 'r', encoding = "utf-8")
  8. corpus = train_file.readlines() #列表中的每个元素为一行文本
  9. #2、使用jieba进行中文分词,将每个中文字符串转换为用空格分隔的词。
  10. split_corpus = [] #初始化存储分词结果的列表
  11. for c in corpus:
  12. split_corpus.append(" ".join(jieba.lcut(c)))
  13. #3、使用TF-IDF模型提取邮件特征,得到文本特征向量
  14. from sklearn.feature_extraction.text import TfidfVectorizer
  15. cv = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b") #初始化
  16. X = cv.fit_transform(split_corpus).toarray()
  17. #构造分类标签,垃圾邮件标签为0,正常邮件标签为1
  18. y = [0] * 5000 + [1] * 5000 #列表,10000个元素,前5000为0,后5000为1
  19. #将特征集 分为训练集和测试集
  20. X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.4, random_state = 0)
  21. #4、采用朴素贝叶斯模型训练分类模型
  22. clf = GaussianNB() #模型初始化
  23. clf.fit(X, y) #模型训练

  1. #朴素贝叶斯模型分类性能
  2. y_pred_clf = clf.predict(X_test)
  3. print("clf accuracy:\n",clf.score(X_test, y_test))
  4. print("clf report:\n",metrics.classification_report(y_test, y_pred_clf))
  5. print("clf matrix:\n",metrics.confusion_matrix(y_test, y_pred_clf))

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/365092
推荐阅读
相关标签
  

闽ICP备14008679号