1 背景及目的
本文旨在研究中文微博用户的性别分类问题,即根据微博提供的中文文本信息对注册用户的性别 进行识别。虽然基于微博的性别分类已经有一定研究,但是针对中文的性别分类工作还很缺乏。本文首先 提出分别利用用户名和微博文本构建两个分类器对用户的性别类型进行判别,并对不同的特征(例如:字 特征、词特征等)进行了研究分析;
2 整体的流程
3 准备数据集
第一步是准备数据集,包括加载数据集和执行基本预处理,然后把数据集分为训练集和验证集。
3.1 数据来源
niracler的爬虫(代码)
3.2 数据格式
微博用户名数据
Key | Value |
---|---|
user_id | 用户ID |
nickname | 用户昵称; |
weibo_num | 微博数; |
following | 关注数; |
followers | 粉丝数; |
微博用户关系网络数据
Key | Value |
---|---|
user_id | 用户ID |
follow_id | 他关注的用户ID |
微博内容数据
Key | Value |
---|---|
user_id | 用户ID |
weibo_content | 存储用户的所有微博 |
weibo_place | 存储微博的发布位置 |
publish_time | 存储微博的发布时间 |
up_num | 存储微博获得的点赞数 |
retweet_num | 存储微博获得的转发数 |
comment_num | 存储微博获得的评论数 |
publish_tool | 存储微博的发布工具 |
微博用户基础数据
Key | Value |
---|---|
user_id | 用户ID |
base_info | 用户基础信息 |
other_info | 用户其他信息 |
3.3 数据量
当前用户数:142056
当前用户信息数:68942
当前follow关系数:1114676
当前微博文章数:528558
待爬取用户数:883318
待爬取用户信息数:0
待爬取follow关系数:2234432
待爬取微博文章数:316856
3.4 进行初步的数据预处理
3.5 特征工程
接下来是特征工程,在这一步,原始数据将被转换为特征向量,另外也会根据现有的数据创建新的特征。为了从数据集中选出重要的特征,有以下几种方式:计数向量作为特征, TF-IDF向量作为特征, 单个词语级别TF-IDF, 多个词语级别TF-IDF(N-Gram), 词性级别TF-IDF
3.5.1 计数向量作为特征
计数向量是数据集的矩阵表示,其中每行代表来自语料库的文档,每列表示来自语料库的术语,并且每个单元格表示特定文档中特定术语的频率计数:
3.5.2 TF-IDF介绍
TF-IDF的分数代表了词语在文档和整个语料库中的相对重要性。TF-IDF分数由两部分组成:第一部分是计算标准的词语频率(TF),第二部分是逆文档频率(IDF)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
TF(t)=(该词语在文档出现的次数)/(文档中词语的总数)
IDF(t)= log_e(文档总数/出现该词语的文档总数)
TF-IDF向量可以由不同级别的分词产生(单个词语,词性,多个词(n-grams))
- 词语级别TF-IDF:矩阵代表了每个词语在不同文档中的TF-IDF分数。
- N-gram级别TF-IDF: N-grams是多个词语在一起的组合,这个矩阵代表了N-grams的TF-IDF分数。
- 词性级别TF-IDF:矩阵代表了语料中多个词性的TF-IDF分数。
4 模型训练
最后一步是建模,利用标注数据集训练机器学习模型。
4.1 朴素贝叶斯
利用sklearn框架,在不同的特征下实现朴素贝叶斯模型。朴素贝叶斯是一种基于贝叶斯定理的分类技术,并且假设预测变量是独立的。朴素贝叶斯分类器假设一个类别中的特定特征与其它存在的特征没有任何关系。
4.2 线性分类器(Logistic Regression)
实现一个线性分类器(Logistic Regression):Logistic回归通过使用logistic / sigmoid函数估计概率来度量类别因变量与一个或多个独立变量之间的关系。
4.3 支持向量机模型
支持向量机(SVM)是监督学习算法的一种,它可以用来做分类或回归。该模型提取了分离两个类的最佳超平面或线。
4.4 Bagging Model
实现一个随机森林模型:随机森林是一种集成模型,更准确地说是Bagging model。它是基于树模型家族的一部分
[图片上传失败...(image-afdd34-1561692288187)]
4.5 神经网络
神经网络被设计成与生物神经元和神经系统类似的数学模型,这些模型用于发现被标注数据中存在的复杂模式和关系。一个浅层神经网络主要包含三层神经元-输入层、隐藏层、输出层。
4.5.1 神经网络的结构
Layer (type) Output Shape Param #
dense_1 (Dense) (None, 2500) 12502500
dense_2 (Dense) (None, 1250) 3126250
dense_3 (Dense) (None, 500) 625500
dense_4 (Dense) (None, 100) 50100
dense_5 (Dense) (None, 2) 202
Total params: 16,304,552
Trainable params: 16,304,552
Non-trainable params: 0
4.5.2 神经网络的结果
4.6 各种方法的结果对比
5 待改进的地方
爬虫写的一点都不优雅
跑模型的时间实在太仓促了
应当尝试一下词嵌入模型
没有整理好代码以及PPT,有点乱
没有用上boosting算法
没有用上像是粉丝数这样的数据
中间结果应该存起来
6 参考文章
- 中文微博用户性别分类方法研究
- figure of imshow() is too small
- 手把手教你在Python中实现文本分类(附代码、数据集)
- Scrapy 使用写死的cookie 来爬需要登录的页面
- 新浪微博爬虫,用python爬取新浪微博数据
- 分布式网络数据抓取系统设计与实现
- 使用 Docker Swarm 搭建分布式爬虫集群
- 2019最新AI 自然语言处理之深度机器学习顶级项目实战课程
- scikit-learn SVM.SVC() is extremely slow