计算话题的脱欧倾向性

目的

输出选定的 hashtag 集合的倾向性数值 x,范围 0<=x<=1

1 表示完全脱欧倾向,0 表示完全留欧倾向。越靠近 1 代表脱欧倾向越明显,越靠近 0 留欧倾向越明显。靠近 0.5 的可以认为是中立。

1. 抓取原始数据

抓取 2016 年 1 月至 2019 年 5 月的推文数据。刚开始在 #brexit#referendum 的“热门”分类下收集推文,但是发现一个有意思的事情——收集到的有关 #strongerin 的推文都和预计的正好相反,这本来应该是一个强留欧的话题,但混入了大量的脱欧派言论。许多推文甚至说的完全就是脱欧的观点,打了其他许多脱欧的标签,然后加上一个 #strongerin。猜测原因是脱欧派会去干扰其他留欧民众所讨论的话题,这一点未经验证。

最后,按照所需要的 hashtag 来抓取每个月的推文数据,其详细方法见项目下的 collect。(还可以使用推特开发者账户API来获取原始推文,需国外手机号。)

2. 标记数据

构建分类模型首先需要训练数据,需要一些已经标记好“留欧”还是“脱欧”观点的推文。但是,传统的通过人工的方法难以在短时间完成标记。所以在这里,我们用了预定义分类标签的方法。

其中有一些 hashtag 是带有很的强烈情感倾向的,不需要特别判断其他内容就能了解这一段推文的倾向。例如,带有 #voteleave 话题的推文,几乎可以肯定说的是脱欧。

因此,我们将带有以下话题的推文预先打上脱欧的标记:#voteleave,#marchtoleave,#takecontrol,#leaveeu,#standup4brexit,#no2eu,#nodeal。将带有以下话题的推文预先打上留欧的标记:#voteremain,#peoplesvotemarch,#bremain,#remainernow,#abtv,#yeseu,#strongerin。根据我们的验证,这一步中话题的选取是比较关键的,会直接影响最后生成的数值,需要仔细斟酌。最后生成的代表两派的推文数量有所差别,随机选取相等数量的推文作为正负两类的训练数据。

3. 构建分类器模型

利用 SVM 分类模型对抓取到的所有推文进行“脱欧VS留欧”的二分类。

首先需要对原始的推文进行清洗,删去超链接、非英文字符等,然后统一格式化成两个单词中包含一个空格的形式,最后转成英文小写。数据的清洗对于结果也至关重要,可以去除一些无用的语义信息。

利用 TF-IDF 来抽取特征信息,分析器使用“词语”,词的模式 token_pattern 用正则表达式 r'[a-z|\#]\w+\b' 表示,意思是字母或 # 开头的,后跟一个或多个非空字符直到单词边界,最小计数可自行尝试。(亦可使用 doc2vec 等词嵌入的方法进行向量化,但速度稍慢)

最后把向量化标记好的正负两类数据输入到 SVM 分类模型中,学习出一个能够分类脱欧还是留欧倾向推文的分类器。使用线性核,C 惩罚值根据验证集的表现可做调整。最后分类精度在验证集上能够达到 0.95 的准确率。

将收集到的所有推文输入到 SVM 分类器中进行二分类,得分类完成的正反两类推文。

4. 刻画倾向值

朴素贝叶斯 是一种基于概率的模型,能够输出指定条件下是某一分类的概率。用 sklearn 库下的 feature_log_prob_ 来输出指定类的各特征的概率。他的计算是 feature_log_prob_ = ln(某类下某属性中某值出现的次数 + alpha) / (某类下所有特征出现次数之和 + 类的个数 * alpha)),其中 alpha 是拉普拉斯平滑系数。比较两类的每个 hashtag 的特征概率值,可以算出某个特征(hashtag)倾向于某类的特征。

使用多项式贝叶斯,设置参数不学习先验概率,重新用前面分完类的所有数据当成已知标签的数据,构造贝叶斯模型。最后可以生成每一个 hashtag 所对应的倾向性分值。

相关文件

  • is_leave.py:根据预定义的标签生成带标记的训练数据。
  • build.py:训练和构建分类模型,生成 models 文件夹,存放模型。输出验证集精度。
  • classify.py:将 tweets 文件夹中的推文分类,生成 classifier_result 文件夹,存放结果。
  • evaluate.py:利用分类完成的结果,构建贝叶斯,输出每个 hashtag 评价。

参考资料

[1] Lopez J C A D , Collignon-Delmar S , Benoit K , et al. Predicting the Brexit Vote by Tracking and Classifying Public Opinion Using Twitter Data[J]. Statistics, Politics and Policy, 2017, 8(1).