版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用sk-learn实现一个简单的新闻的分类预测
总结思路:
数据处理
1.采集数据,按照机器学习用的数据的需求然后进行数据清洗合并重构等;
2.准备好停用词语料库;
以上两点是之前已经处理好的数据,这里就不多做介绍了。
构建特征工程
- 构建特征,抽取所有的词作为特征
- 以特征词在新闻中出现的次数为特征值
- 构建特征矩阵和特征向量
- 选择合适的模型进行训练(这里用到了朴素贝叶斯、逻辑回归,基本上效果差不多)
- 模型优化评估
以后就是一般简单的数据建模的流程;数据集大家可以在网上搜得到,停用词也可以自行下载,国内很多语料库。我在这里做的数据集是一些小量测试数据用的。
找不到数据集的留言,看到会给大家分享,以下是原代码以及预测结果。
import os
from collections import Counter
import numpy as np
import pandas as pd
import jieba
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
from sklearn.linear_model import LogisticRegression
import warnings
warnings.filterwarnings('ignore')
def get_stopwords():
"""
读取停用词库,这里只是用了一个停用词库 如果要预测结果更高点的话,可以将多个语料库结合起来使用
:return:
"""
dirpath = r'F:\python_notes01\stopwords'
files = os.listdir(dirpath)
stopwords = []
for f in files:
filepath = os.path.join(dirpath, f)
with open(filepath, 'r', encoding='utf-8') as r:
w = r.read().split()
stopwords += w
return set(stopwords)
def get_words(filepath, stopwords):
"""
构建特征,抽取所有的词作为特征
:return:
"""
datas = np.array(pd.read_csv(filepath, sep='\t'))
Y = datas[:, :1]
X = datas[:, 1:]
words = []
data = []
for i in range(len(X)):
l = []
for j in range(len(X[i])):
l += jieba.lcut(X[i][j])
words += l
data.append(dict(Counter(l)))
words = list(dict(Counter([w for w in words if len(w) > 1 and w not in stopwords]).most_common(1000)).keys())
return data, words, Y
def get_X(data, words):
"""
以特征词在邮件中出现的次数为特征值
:return:
"""
X = np.zeros((len(data), len(words)))
for i, d in enumerate(data):
for j, w in enumerate(words):
try:
X[i][j] = d[w]
except:
pass
return X
def predict_socre(X, Y):
"""
3. 构建特征矩阵和特征向量
:return:
"""
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.2)
gb = GaussianNB()
# gb = MultinomialNB()
# gb = BernoulliNB()
# gb = LogisticRegression()
gb.fit(train_x, train_y)
socre = gb.score(test_x, test_y)
return socre
def predict_type(X, Y, x):
"""
3. 新闻预测
:return:
"""
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.2)
gb = GaussianNB()
# gb = LogisticRegression()
gb.fit(train_x, train_y)
res = gb.predict(x)
return res
if __name__ == '__main__':
filepath = r"F:\python_notes01\XXXXXXXX.txt"
stopwords = get_stopwords()
datas = get_words(filepath, stopwords)
data, words, Y = datas
X = get_X(data, words)
res = predict_socre(X, Y)
print(res)
# 测试一下对以下新闻分类的准确性
x = """
被称作2012年度女性史诗大剧的《风和日丽》将于6月12日起在东方卫视上星播出,风行网也将同步播出该剧。该剧以新中国建立以来数十年的风云变幻为背景,展现了由马伊琍扮演的杨小翼曲折坎坷的寻父之路和她不同寻常的人生经历。《风和日丽》是《心术》之后东方卫视与风行网再次台网融合推出的一部大剧,此前双方在《心术》联合播出取得的收视佳绩和良好口碑有望在新剧中得到延续。!斗绾腿绽觥酚衫畛俊⒙硪连P、尤勇等主演,丁嘉丽、王丽云等老戏骨也将倾情加盟,为该剧增添了几分厚重感和现实感。
剧情讲述了执着倔强的的杨小翼生下来就没见过父亲,从小与母亲相依为命,在对父爱的向往和寻根情结的驱动下,小翼展开了长达半个世纪的寻父之旅。这期间伴随着她坎坷的情感生涯和母亲的前尘往事,演绎了一个将军女儿成长磨砺的人生传奇。此次马伊琍在《风和日丽》扮演的就是一个生活在上世纪六七十年代的女性——杨小翼。戏中她的年龄跨度要从十几岁演到四十几岁的,其间历经坎坷命运,却始终坚强。T诰缰醒钚∫砗屠畛堪缪莸牧跏谰两个有情男女之间也有着许多感人肺腑、悲惨曲折的故事,虽然彼此深深爱着对方但囿于时代、家庭等因素,
两个人一辈子也没能走到一起,上演了一场横跨20多年,剪不断理还乱的悲情苦恋。如此极具内涵的文艺特质也让该剧有着不同于普通的年代剧的特点,相信一定会为观众带来一种不同于以往年代剧的收视体验。!斗绾腿绽觥肥歉据作家艾伟的同名畅销小说改编,该小说曾获2010年“春申原创文学奖”年度优秀小说奖。导演杨文军指出,由于小说本身的题材就决定了这个作品偏小众,它并不缺乏与生俱来的文艺气息,所以自己在将它转化为影像时,为了让更多老百姓能接受,增加了
情感冲击力和人性深处挣扎的东西,“基本上只要把故事讲好就很好看了
"""
new_x = []
new_x.append(dict(Counter(jieba.lcut(x))))
x1 = get_X(new_x, words)
type = predict_type(X, Y, x1)
print('类别:' + type[0])
#运行结果
0.946
类别:娱乐