MultinomialNB + TfidfTransformer自然语言处理 新闻分类:附源码
![贝叶斯公式](https://img-blog.csdnimg.cn/61fde6cc37da4c7391bd0a1ae68703bd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARkVORy1I,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
MultinomialNB 参数详解
alpha | 浮点型可选参数,默认为1.0,其实就是添加拉普拉斯平滑,即为上述公式中的λ ,如果这个参数设置为0,就是不添加平滑; |
---|---|
fit_prior | 布尔型可选参数,默认为True。布尔参数fit_prior表示是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率。否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数class_prior,让MultinomialNB自己从训练集样本来计算先验概率。 |
class_prior | 可选参数,默认为None |
1.加载数据集
"""加载数据集 共320个样本"""
text = datasets.load_files("Data/",encoding="utf-8")
data = text.data # 数据 320
target = text.target # 标签名称 320
target_names = text.target_names # 真是标签名称 320
labels = text.filenames # 文件名称列表
2. 数据预处理,去除数据中的换行符、制表符、数字、停用词等
"""数据预处理"""
def data_process(self):
news_list = []
words = []
for news in self.data:
item = self.remove_chars(news) # 去除特殊字符
news_list.append(item)
item = self.splittext(item) # 划词
item = self.split_stopwords(item) # 去除停用词
words.append(item)
return news_list,words # 返回处理后的词和新闻内容
"""分词"""
def splittext(self,text):
split_text = jieba.cut(text,cut_all=False)
split_text = ' '.join(split_text)
return split_text
"""获取停用词"""
def get_stopwords(self):
lists = []
words = open("./stopwords.txt","r", encoding="utf-8")
for line in words:
lists.append(line[:len(line)-1])
return lists
"""去除停用词"""
def split_stopwords(self,data):
word_list = []
for item in data.split(" "):
if item not in self.get_stopwords():
word_list.append(item)
return word_list
"""清除特殊字符"""
def remove_chars(self,data):
rule = re.compile(r"[^\u4e00-\u9fa5]")
file_content = rule.sub(" ", data)
file_content = file_content.replace(" ","")
return file_content
3. 数据特征选择与提取
x_train, x_test, y_train, y_test = train_test_split(news_list,news.target, test_size=0.1) # 划分数据
# 特征选择与提取 提取各种新闻的特征词汇
cv = CountVectorizer()
x_count_train = cv.fit_transform(x_train)
td = TfidfTransformer() # 使用TF-IDF(词频、逆文档频率)应用于稀疏矩阵
train_td = td.fit_transform(x_count_train) # 传入训练数据
4. 构造分类器
"""训练模型或者构造新闻分类器"""
#实例化一个贝叶斯分类器
classifier = MultinomialNB()
#传入数据进行训练`
classifier.fit(train_td, y_train)
5. 通过相应的指标评价构造分类器的好坏
# 对文本数据进行标记并转换为稀疏计数矩阵
x_count_test = cv.transform(x_test) # 使用测试数据进行预测
# 对文本数据进行标记并转换为稀疏矩阵
input_tfidf = td.transform(x_count_test)
"""预测"""
#利用测试机数据进行模型测试
print(classifier.predict(input_tfidf))
print("与真实值的误差", r2_score(y_test,classifier.predict(input_tfidf)))
# 输出
"""
[4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4]
与真实值的误差 -0.26502500235871307
"""
这里由于样本较少和参数优化的原因导致误差值较大,如需测试请收集更多样本进行实验
6. 网格搜索方式设置分类器最优超参数。
"""网格搜索最优超参数"""
classfiter = MultinomialNB() # 分类器
# 网格参数 这里的参数为分类器支持的参数
param_grid = [
{'alpha': [1.0,2.0,3.0,4.0,5.0], 'fit_prior': [False]}
]
# 构造网格搜索分类器
grid_search = GridSearchCV(classfiter,param_grid)
grid_search.fit(train_td,y_train) # 训练模型
best_params = grid_search.best_params_ # 最优参数
best_estimator = grid_search.best_estimator_ # 最优模型
print(best_params)
print(best_estimator)
"""输出
{'alpha': 1.0, 'fit_prior': False}
MultinomialNB(fit_prior=False)
"""
点击下载源码
喜欢请点个赞