Sklearn模块
- 无监督:cluster(聚类)、decomposition(因子分解)、mixture(高斯混合模型)、neural_network(无监督的神经网络)、covariance(协方差估计)
- 有监督:tree(决策树)、svm(支持向量机)、neighbors(近邻算法)、linear_model(广义线性模型)、neural_network(神经网络)、kernel_ridge(岭回归)、naive_bayes(朴素贝叶斯)
- 数据转换:feature_extraction(特征提取)、feature_selection(特征选择)、preprocessing(预处理)
文本数据处理
- 识别垃圾邮件时,先对邮件的文本信息进行清洗、特征提取后,再用 SVM 等对其进行训练分类
- 词袋(bag of words)模型将每条文本看成一个袋子,里面装着词,分析时用袋里的词代表整篇文本
- 为每条文本生成词袋,需用 sklearn 提供的 feature_extraction.text 模块的 CountVectorizer 类
- TF-IDF 模型表示词频-逆文档频率,计算特征时可用 CountVectorizer 类向量化后再调用 TfidTransformer 类,也可以直接调用TfidTransformer 类。
词袋模型
# 导入 CountVectorizer 类用于提取文本特征、jieba 库用于文本剪切
from sklearn. feature_extraction. text import CountVectorizer
import jieba
# 文本定义、剪切
# lcut 得到逗号剪切的句子,join 得到空格剪切的句子,append 得到空格剪切的文章
article = [ '我是中国人,我爱中国',
'我是上海人',
'我住在上海松江大学城',
'松江大学城有很多大学',
'大学城共有15万余大学生' ]
article_space_cut = []
for sentence in article:
sentence_comma_cut = jieba. lcut (sentence)
sentence_space_cut = ' '. join (sentence_comma_cut)
article_space_cut. append (sentence_space_cut)
print (article_space_cut)
# 生成词袋
# 初始化(token_pattern 显示字符数为1的词),转为数字,特征词语,特征向量
cidai = CountVectorizer (token_pattern = r"(?u)\b\w+\b")
cidai_fit = cidai. fit_transform (article_space_cut)
print (cidai. get_feature_names())
print (cidai_fit. toarray())
TF-IDF 模型
# 导入 TfidfVectorizer 类用于提取文本特征
from sklearn. feature_extraction. text import TfidfVectorizer
# 生成 TF-IDF 特征
tf = TfidfVectorizer (token_pattern = r"(?u)\b\w+\b")
tf_fit = tf. fit_transform (article_space_cut)
print (tf_fit.toarray())
垃圾邮件识别(TF-IDF 提取特征、SVM 分类)
#导入 TfidfVectorizer 类用于提取文本特征、jieba 库用于文本剪切
import jieba
from sklearn. feature_extraction. text import TfidfVecto
# 文本导入、剪切
# lcut 得到逗号剪切的句子,join 得到空格剪切的句子,append 得到空格剪切的文章
article = open ('mailcorpus.txt', 'r', encoding = 'utf-8')
line = article. readlines()
article_space_cut = []
for sentence in line:
sentence_comma_cut = jieba.lcut (sentence)
sentence_space_cut = ' '.join (sentence_comma_cut)
article_space_cut. append (sentence_space_cut)
article_space_cut [0:5]
# 生成 TF-IDF 特征
tf = TfidfVectorizer (token_pattern = r"(?u)\b\w+\b")
tf_fit = tf. fit_transform (article_space_cut)
print (tf_fit. toarray())
# 数据准备,导入 GaussianNB 类用于朴素贝叶斯模型训练分类
from sklearn. naive_bayes import GaussianNB
beiyesi = GaussianNB()
y = [0]*5000 + [1]*5000
x = tf_fit. toarray()
# 划分测试集,导入 model_selection 模块
from sklearn import model_selection
x_train, x_test, y_train, y_test = model_selection. train_test_split (x,y,
test_size = 0.4, random_state = 0)
beiyesi. fit (x_train, y_train)
# 测试集上性能评估,导入 metrics 模块
from sklearn import metrics
y_test_pred = beiyesi. predict (x_test)
score = beiyesi. score (x_test,y_test)
print ('准确度为:', score)
report = metrics. classification_report (y_test, y_test_pred)
matrix = metrics. confusion_matrix (y_test, y_test_pred)
print ('分类报告为:', report)
print ('模糊矩阵为:', matrix)
感想
- 词袋和 TF-IDF 原理不同,从语言角度,词袋是从词语的字面理解出发,TF-IDF 则是从文章的阅读理解出发