项目摘要 — Reddit 上的占星术参与
项目摘要 — Reddit 上的占星术参与
对于这个数据科学课程项目,我的任务是尝试确定如何创建一个能够获得高参与度的帖子 红迪网 .我选择专门看 r/astrology subreddit .这个项目要求我从 Reddit 获取我自己的数据,提取相关数据点,对其进行分析,然后创建和解释模型以支持手头的任务。除非另有说明,否则所有编程参考均指向 Python 和 Python 库。这是一个接一个的播放。
启动
该项目的任务是确定哪些内容应该包含在一个可以获得高参与度的帖子中,“高参与度”帖子被定义为评论数量超过中位数的帖子。在这种情况下,我考虑了所有分析帖子的评论数量的中位数,并且能够创建一个二进制目标类别,涵盖帖子的评论数量是否超过中位数。
源数据
为了进行分析,每个帖子我需要四类数据:
- 帖子标题
- 帖子的评论数
- 帖子在线的时间长度
- 帖子正文的文本
所有这些都可以通过各种方法获得,包括:
- 直接抓取网页HTML
- PRAW:Python Reddit API 包装器
- PMAW:Pushshift Reddit 存档的 API 前端
我首先尝试直接网络抓取。
获取数据
冒险开始。我的任务是从 10,000 个帖子中收集数据。
加载 r/astrology subreddit 给了我一个完整的帖子列表,其中包含我需要的所有内容,包括帖子标题、帖子正文、评论数量和创建日期。我心想,“这有多难?”,然后继续手动刮。我几乎不知道等待的麻烦是什么:
- 动态数据加载:所有的帖子内容数据都是通过异步请求以块的形式动态加载的,所以我不能一次性拉取页面源。相反,我通过 硒 ,它可以模拟手动向下滚动页面长度。我写了一个很好的脚本来处理整个 Selenium 自动化过程,所以我所要做的就是给它一个 URL,Selenium 会打开浏览器,向下滚动,然后获取页面源。简单的! ……或者是吗?
- 数据访问受限:Reddit 不允许无休止地滚动帖子。事实上,一段时间后,我的 Selenium 脚本到达了页面的尽头,页面将不再加载任何内容。这意味着我只能访问大约 1,000 个帖子,大部分只涵盖最近 5 个月的时间跨度。我尝试了多次,每次都碰到滚动墙。我不得不尝试通过使用其他 subreddit 子类别(“top”和“new”——Reddit 默认为“hot”)来获取替代帖子。我可以从每个人那里获得 1,000 个帖子。在过滤掉重复内容后,我可能只有 2,000 多篇帖子。
- 寻找其他数据源:我意识到在 subreddit 中进行术语搜索可能会产生跨越更长时间线的结果以及更多种类的帖子,因此我生成了大量任意单词并编写了一个脚本,使用所有这些自动搜索 subreddit术语并按每个术语的 3 个不同标准进行排序,这导致每个搜索词有 3 个页面抓取,每次搜索的帖子在 0 到 1,000 之间。
- 搜索时缺少帖子正文文本:不幸的是,在搜索 subreddit 时,结果省略了帖子正文,因此我没有从搜索页面源获取数据,而是从搜索页面获取了唯一的帖子 URL,并直接自动访问该页面在搜索过程中找到的每个帖子(过滤掉重复的 URL),最后从帖子页面中获取必要的页面源。
- 使用 API:不幸的是,当我意识到手动抓取有多么费力时,它已经非常接近项目截止日期了。所以我试了一下 PMAW API,因为它允许按日期搜索。但是,它的结果同样没有提供正文,并且在尝试直接链接到帖子 URL 时,大多数帖子已从 Reddit 中删除,因此没有正文可用。
经过这一切,我终于有超过 10,000 个帖子。我认为最后一次刮擦是在项目到期前不到 24 小时完成的。幸运的是,在那之前,我能够在我早期抓取的较小数据样本上完成大部分剩余的工作。
切线——过去重要吗?
许多为 Pushshift API 存档的帖子已从 Reddit 中删除(如帖子中所述:由版主或由海报删除)的发现使我在哲学上切入了历史的意义及其在时代的相关性互联网普及。
显然,Reddit 在 4 年前决定停止允许按日期范围搜索帖子,从而有效地将这些帖子从任何类型的目标访问中删除。正如我在抓取过程中发现的那样,获取旧帖子真的很困难!只有在使用搜索词时,我才能获得一年多前发布的帖子,并且对于较旧的帖子在搜索中出现的频率并没有真正的一致性。
然后我想知道为什么这么多 Pushshift 帖子在尝试直接链接时显示为已删除。这些是合法的删除吗?还是有更多间接原因导致这些帖子被删除?假设没有人关心或注意到旧帖子,Reddit 是否可能试图通过删除旧数据来节省磁盘空间? Reddit 还有其他理由删除旧帖子吗? Reddit 已经在限制对旧帖子的访问:不按日期搜索,不滚动页面上超过 1,000 个帖子,将过滤器限制为“热门”、“新”和“热门”,所有这些都优先考虑最近的帖子……
无论如何,我不会在这里进行严重的咆哮,而是将其留在那里作为思考的食物。我曾经认为从互联网上删除数据真的很难,但事实证明它实际上可能真的很容易。我的一位音乐家客户一时兴起决定从 Spotify 中删除他过去的整个目录,因为正如他所说(我解释说),“过去的音乐不再是我想向世界展示自己的方式”。好吧,我喜欢那种音乐,我想要它回来!那现在不就是一段历史……一个人的表情以有形的形式实现了吗?不应该保留吗?至少为我保留?如果我能回到过去,我会刻录一张 CD,但互联网流媒体如此普遍,我什至找不到音乐下载!叹…
数据清洗与探索
清理 Reddit 数据并不是什么大问题。我写了一个脚本,使用 美丽的汤 Python HTML 解析库,用于从网站中提取我需要的数据(在手动搜索源以获取适当的标签和属性之后)。然后我删除了重复项(通过比较标题和正文)和广告(没有日期字段)。
虽然我在抓取过程中收集了 10,000 多个帖子,但去掉广告和重复帖子使其降至 9,000 左右。那好吧。结果发现,我从 9,000 个帖子中获得的所有结果都与我在倒数第二轮擦伤中建模时从 7,000 个左右获得的结果非常相似。
日期格式为自发布以来经过的时间量,因此我输入了“4 天”和“1 年”之类的条目。我使用蛮力计算将这些转换为硬日期(这并不像我想要的那么完美,但是唉……时间限制)并转换为日期时间对象,以便我以后可以从中获得更多细节。事实证明这并不重要(后来的探索推断出时间与评论数量几乎没有相关性)。
真的没有什么可做的了。大部分数据是来自标题和帖子正文的文本,所以我继续进行最后一步:
造型
我对自然语言处理和数据建模还很陌生,所以我尽可能地在建模过程中感到窒息。我的目标是通过对帖子的评论数量来预测参与度。 “高参与度”帖子的评论数超过中位数,“低参与度”帖子的评论数少于中位数(由整个数据集确定)。
我将标题和正文文本转换为词向量,然后在这些向量上使用各种模型,看看我能在多大程度上预测一篇文章的高于中值的评论。我不会深入研究结果,因为这个极其惊险的故事中最令人兴奋的部分显然是刮痧部分,简直就是情绪的过山车!
我从许多模型(多项朴素贝叶斯、逻辑回归、k 最近邻等)中找到了最好的模型(随机森林),并运行了三个最终的“生产”模型:
- 仅基于标题文本预测评论参与度;
- 仅基于正文预测评论参与度;
- 根据标题文本、正文、标题和正文单词和字符数以及日期特征预测评论参与度。
从每个模型中,我提取了用于最准确预测的单词。这很有启发性,因为模型 1 和 2 的准确度得分较低,但给了我非常有趣、相关且可操作的结果。我有诸如“任何其他人”、“谈话”、“思考”、“解释”、“理解”、“射手座”、“摩羯座”之类的单词(和短语),以及出现在标题和正文单词列表中的其他单词。这些词肯定代表了参与,其中某些词,例如“任何其他人”或“解释”作为行动号召,“射手座”或“摩羯座”表示与特定群体的关系,“思考”或“谈话”表示沟通或参与。像这样的词可能会引起读者的更多参与,这只是常识。
另一方面,模型 3 不仅包含文本,还包含更多特征,其准确率比前两个模型高很多,但提供的可操作性要少得多。诸如数字之类的无意义文本(“00”是最准确的词之一)和诸如“工作”、“事物”、“完整”和“听到”之类的乏味词与该模型的更高准确度相关。尽管该模型可能更准确,但在实践中不太有用,因为它对内容的建议毫无意义,或者似乎过于宽泛且没有重点。
结论
总而言之,我的 Reddit 数据分析项目很有趣,并激发了我将我对占星术的业余迷恋带到了极端狂热的下一个层次。它还教会了我一些关于数据科学的知识,比如:在寻找可行的东西时不要依赖模型分数。但不管怎样,现在这一切都比决定我的命运如何被天体塑造!让学习开始吧!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明