一、简介

 此文是对利用jieba,word2vec,LR进行搜狐新闻文本分类的准确性的提升,数据集和分词过程一样,这里就不在叙述,读者可参考前面的处理过程

 经过jieba分词,产生24000条分词结果(sohu_train.txt有24000行数据,每行对应一个分词结果)

  1. with open('cutWords_list.txt') as file:
  2. cutWords_list = [ k.split() for k in file ]

 1)TfidfVectorizer模型

  调用sklearn.feature_extraction.text库的TfidfVectorizer方法实例化模型对象。TfidfVectorizer方法4个参数含义:

    • 第1个参数是分词结果,数据类型为列表,其中的元素也为列表
    • 第2个关键字参数stop_words是停顿词,数据类型为列表
    • 第3个关键字参数min_df是词频低于此值则忽略,数据类型为int或float
    • 第4个关键字参数max_df是词频高于此值则忽略,数据类型为int或float
  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. tfidf = TfidfVectorizer(cutWords_list, stop_words=stopword_list, min_df=40, max_df=0.3)

 2)特征工程

  1. X = tfidf.fit_transform(train_df['文章'])
  2. print('词表大小', len(tfidf.vocabulary_))
  3. print(X.shape)

  可见每篇文章内容被向量化,维度特征时3946

 3)模型训练

  3.1)LabelEncoder

  1. from sklearn.preprocessing import LabelEncoder
  2. import pandas as pd
  3. train_df = pd.read_csv('sohu_train.txt', sep='\t', header=None)
  4.  
  5. labelEncoder = LabelEncoder()
  6. y = labelEncoder.fit_transform(train_df[0])#一旦给train_df加上columns,就无法使用[0]来获取第一列了
  7. y.shape

  

  3.2)逻辑回归

  1. from sklearn.linear_model import LogisticRegression
  2. from sklearn.model_selection import train_test_split
  3.  
  4. train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2)
  5. logistic_model = LogisticRegression(multi_class = 'multinomial', solver='lbfgs')
  6. logistic_model.fit(train_X, train_y)
  7. logistic_model.score(test_X, test_y)

    其中逻辑回归参数官方文档:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html

  3.3)保存模型

    调用pickle:pip install pickle

    第1个参数是保存的对象,可以为任意数据类型,因为有3个模型需要保存,所以下面代码第1个参数是字典

    第2个参数是保存的文件对象

  1. import pickle
  2. with open('tfidf.model', 'wb') as file:
  3. save = {
  4. 'labelEncoder' : labelEncoder,
  5. 'tfidfVectorizer' : tfidf,
  6. 'logistic_model' : logistic_model
  7. }
  8.  
  9. pickle.dump(save, file)

  3.4)交叉验证

    在进行此步的时候,不需要运行此步之前的所有步骤,即可以重新运行jupyter notebook。然后调用pickle库的load方法加载保存的模型对象,代码如下:

  1. import pickle
  2. with open('tfidf.model', 'rb') as file:
  3. tfidf_model = pickle.load(file)
  4. tfidfVectorizer = tfidf_model['tfidfVectorizer']
  5. labelEncoder = tfidf_model['labelEncoder']
  6. logistic_model = tfidf_model['logistic_model']

    load模型后,重新加载测试集:

  1. import pandas as pd
  2. train_df = pd.read_csv('sohu_train.txt', sep='\t', header=None)
  3. X = tfidfVectorizer.transform(train_df[1])
  4. y = labelEncoder.transform(train_df[0])

    调用sklearn.linear_model库的LogisticRegression方法实例化逻辑回归模型对象。

    调用sklearn.model_selection库的ShuffleSplit方法实例化交叉验证对象。

    调用sklearn.model_selection库的cross_val_score方法获得交叉验证每一次的得分。

    最后打印每一次的得分以及平均分,代码如下:

  1. from sklearn.linear_model import LogisticRegression
  2. from sklearn.model_selection import ShuffleSplit
  3. from sklearn.model_selection import cross_val_score
  4.  
  5. logistic_model = LogisticRegression(multi_class='multinomial', solver='lbfgs')
  6. cv_split = ShuffleSplit(n_splits=5, test_size=0.3)
  7. score_ndarray = cross_val_score(logistic_model, X, y, cv=cv_split)
  8. print(score_ndarray)
  9. print(score_ndarray.mean())

  

 4)模型评估

  绘制混淆矩阵:

  1. from sklearn.model_selection import train_test_split
  2. from sklearn.linear_model import LogisticRegressionCV
  3. from sklearn.metrics import confusion_matrix
  4. import pandas as pd
  5. train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2)
  6. logistic_model = LogisticRegressionCV(multi_class='multinomial', solver='lbfgs')
  7. logistic_model.fit(train_X, train_y)
  8. predict_y = logistic_model.predict(test_X)
  9.  
  10. pd.DataFrame(confusion_matrix(test_y, predict_y),columns=labelEncoder.classes_, index=labelEncoder.classes_)

  绘制precision、recall、f1-score、support报告表:

  1. import numpy as np
  2. from sklearn.metrics import precision_recall_fscore_support
  3.  
  4. def eval_model(y_true, y_pred, labels):
  5. #计算每个分类的Precision, Recall, f1, support
  6. p, r, f1, s = precision_recall_fscore_support( y_true, y_pred)
  7. #计算总体的平均Precision, Recall, f1, support
  8. tot_p = np.average(p, weights=s)
  9. tot_r = np.average(r, weights=s)
  10. tot_f1 = np.average(f1, weights=s)
  11. tot_s = np.sum(s)
  12. res1 = pd.DataFrame({
  13. u'Label': labels,
  14. u'Precision' : p,
  15. u'Recall' : r,
  16. u'F1' : f1,
  17. u'Support' : s
  18. })
  19.  
  20. res2 = pd.DataFrame({
  21. u'Label' : ['总体'],
  22. u'Precision' : [tot_p],
  23. u'Recall': [tot_r],
  24. u'F1' : [tot_f1],
  25. u'Support' : [tot_s]
  26. })
  27.  
  28. res2.index = [999]
  29. res = pd.concat( [res1, res2])
  30. return res[ ['Label', 'Precision', 'Recall', 'F1', 'Support'] ]
  31.  
  32. predict_y = logistic_model.predict(test_X)
  33. eval_model(test_y, predict_y, labelEncoder.classes_)

  

 5)模型测试

  1. import pandas as pd
  2.  
  3. test_df = pd.read_csv('sohu_test.txt', sep='\t', header=None)
  4. test_X = tfidfVectorizer.transform(test_df[1])
  5. test_y = labelEncoder.transform(test_df[0])
  6. predict_y = logistic_model.predict(test_X)
  7.  
  8. eval_model(test_y, predict_y, labelEncoder.classes_)

  

 6)总结

  训练集数据共有24000条,测试集数据共有12000条。经过交叉验证,模型平均得分为0.8711

  模型评估时,使用LogisticRegressionCV模型,得分提高了3%,为0.9076

  最后在测试集上的f1-score指标为0.8990,总体来说这个分类模型较优秀,能够投入实际应用

 7)致谢

  本文参考简书:https://www.jianshu.com/p/96b983784dae

  感谢作者的详细过程,再次感谢!

 8)流程图

基于jieba,TfidfVectorizer,LogisticRegression进行搜狐新闻文本分类的更多相关文章

  1. 利用jieba,word2vec,LR进行搜狐新闻文本分类

    一.简介 1)jieba 中文叫做结巴,是一款中文分词工具,https://github.com/fxsjy/jieba 2)word2vec 单词向量化工具,https://radimrehurek ...

  2. sohu_news搜狐新闻类型分类

    数据获取 数据是从搜狐新闻开放的新闻xml数据,经过一系列的处理之后,生成的一个excel文件 该xml文件的处理有单独的处理过程,就是用pandas处理,该过程在此省略 import numpy a ...

  3. 使用百度NLP接口对搜狐新闻做分类

    一.简介 本文主要是要利用百度提供的NLP接口对搜狐的新闻做分类,百度对NLP接口有提供免费的额度可以拿来练习,主要是利用了NLP里面有个文章分类的功能,可以顺便测试看看百度NLP分类做的准不准.详细 ...

  4. 【NLP】3000篇搜狐新闻语料数据预处理器的python实现

    3000篇搜狐新闻语料数据预处理器的python实现 白宁超 2017年5月5日17:20:04 摘要: 关于自然语言处理模型训练亦或是数据挖掘.文本处理等等,均离不开数据清洗,数据预处理的工作.这里 ...

  5. 利用朴素贝叶斯分类算法对搜狐新闻进行分类(python)

    数据来源  https://www.sogou.com/labs/resource/cs.php介绍:来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL ...

  6. 搜狗输入法弹出搜狐新闻的解决办法(sohunews.exe)

    狗输入法弹出搜狐新闻的解决办法(sohunews.exe) 1.找到搜狗输入法的安装目录(一般是C:\program files\sougou input\版本号\)2.右键点击sohunews.ex ...

  7. 利用搜狐新闻语料库训练100维的word2vec——使用python中的gensim模块

    关于word2vec的原理知识参考文章https://www.cnblogs.com/Micang/p/10235783.html 语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会, ...

  8. 搜狐新闻APP是如何使用HUAWEI DevEco IDE快速集成HUAWEI HiAI Engine

    6月12日,搜狐新闻APP最新版本在华为应用市场正式上线啦! 那么,这一版本的搜狐新闻APP有什么亮点呢? 先抛个图,来直接感受下—— ​ 模糊图片,瞬间清晰! 效果杠杠的吧. 而藏在这项神操作背后的 ...

  9. 世界更清晰,搜狐新闻客户端集成HUAWEI HiAI 亮相荣耀Play发布会!

    ​​6月6日,搭载有“很吓人”技术的荣耀Play正式发布,来自各个领域的大咖纷纷为新机搭载的惊艳技术站台打call,其中,搜狐公司董事局主席兼首席执行官张朝阳揭秘:华为和搜狐新闻客户端在硬件AI方面做 ...

随机推荐

  1. 【算法】串的模式匹配算法(KMP)

    串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在 ...

  2. Spring 使用介绍(九)—— 零配置(二)

    三.Bean定义 1.开启bean定义注解支持 开启注解支持须添加以下配置项: <context:component-scan base-package="cn.matt"/ ...

  3. Nginx+uwsgi部署 Diango(生产环境)

    环境:CentOS6.5 + Nginx1.11.5 + Python3.5.2 1. 安装基础软件包 yum install -y zlib-devel bzip2-devel \ pcre-dev ...

  4. kubernetes增加污点,达到pod是否能在做节点运行

    master node参与工作负载 (只在主节点执行)使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载. 这里搭建的 ...

  5. DRF 序列化组件

    Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...

  6. 查询SQLSERVER中系统所有表

    SQL 查询所有表名: SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' SELECT * FROM INFORMATION_SCHEMA.TABLES 查询表的所 ...

  7. 【CTSC2017】【BZOJ4903】吉夫特 卢卡斯定理 DP

    题目描述 给你一个长度为\(n\)的数列\(a\),求有多少个长度\(\geq 2\)的不上升子序列\(a_{b_1},a_{b_2},\ldots,a_{b_k}\)满足 \[ \prod_{i=2 ...

  8. hdu 6253 (bfs打表)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6253 题意: 马可以往一个方向走两步,然后转个弯走一步,这样算一次动作,求问马n次动作后,能到达多少个点, ...

  9. XML中添加换行符

    网上说的说法大多是 可是我这里cuba框架用这个不是换行,下面这个才行 这也是转义字符, 为什么会是这样的?搞不懂,求大神告知! 另外 表示空格 表示回车

  10. 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)

    [BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...