MultinomialNB + TfidfTransformer自然语言处理 新闻分类:附源码
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
target = text.target
target_names = text.target_names
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()
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)
"""
点击下载源码 喜欢请点个赞
|