我在Reddit上有(和没有)Fast.ai的10K帖子业力

2020-11-04 00:47:54

回到2006-2007年,我和我的朋友整理了一个电子表格,里面有大约20项高水平的成就,叫做“一切都是一场比赛”。这包括像“在野外拍摄一只活的灰熊”,“以你的名字命名一些东西”,以及“在Reddit上获得10,000(发布)因果报应”这样的目标。尽管我们对这份清单上的内容和成功的标准进行了激烈的讨论,但我们中没有人真正做过任何实质性的事情来实现这些目标。2020年初,我决定解决其中一个长期存在的问题。但我打算用人工智能来做这件事,因为我想看看如何将人工智能应用到更多的问题上。我是Fast.ai的铁杆粉丝,我欣赏它的高级抽象和简单的接口。对于那些想要深入学习的人,我强烈推荐它和相关的课程。这是一篇关于我如何用ast.ai在Reddit上创建了一个机器人来获得因果报应的帖子。

一般来说,Reddit上的内容可以分为两类,你可以称之为原创内容和发现内容。试图自动生成要发布的原创内容将会实现类似imgflip的人工智能模因生成器,并将生成的内容发布到r/memes。虽然生成的模因是比喻的有趣并列,但它们通常不如熟练于观察喜剧艺术的人类用户生成的模因好。试试表情包生成器,你就会明白我的意思了。在某种程度上,我确实尝试过发布其中的一个,只是为了看看它做得有多好。

另一种方法是在网上找到内容并将其发布。我之所以选择这条路线来实现自动化,是因为虽然生成高质量的内容更有趣,但它也更具挑战性和复杂性。在试图赶上内容的“人类质量”方面,计算机并不处于劣势,而是处于优势地位,因为海报的主要区别在于搜索大量内容的能力和速度(谁最先找到并发布一些东西)。特别值得一提的是,我最终查看了基于新闻的subreddits,原因有几个:

不过,为什么要使用人工智能呢?如果我要自动发帖,为什么不创建一个提交所有链接的机器人,然后让大众来整理我的命运呢?总体而言,在Reddit上发垃圾邮件是被鄙视的,尽管我相信禁止是由subreddit版主的自由裁量权决定的。虽然从理论上讲,我可能已经逃脱了惩罚,或者使用了某种通用的速率限制,并抱着最好的希望,但我希望我的机器人更像是社区中一个富有成效的成员,提交深思熟虑的内容,是我自己的延伸,而不是一个垃圾邮件机器人,在被强行移除之前,垃圾邮件机器人会成为它存在的祸根。

我搜索并找到了许多好消息subreddits,但我最初的目标是/r/business和/r/worldnews,有点武断,有些因为我对这些领域似乎很感兴趣。/r/企业拥有相当大的社区(577,000名成员),而新闻子编辑的发帖频率相对较低,因此它似乎是可以接近的第一目标。我会构建一个网络爬虫来观察流行的商业新闻站点的新文章,然后利用基于NLP的文章分类器来确定文章是否有很高的机会获得好评。

要训练对文章进行分类的NLP模型,我需要文章文本及其对应的Reddit分数。不幸的是,官方Reddit API将您可以检索的历史帖子数据的数量限制在1000个项目。幸运的是,还有一种替代方法,您可以使用我不知羞耻地从Water Cooler改编的代码从presShit.io抓取历史POST数据:抓取整个subreddit(/r/2007scape)。脚本的输出文件具有如下所示的各行,每行包含一个POST的JSON对象:

{";作者";:";CALIPHATEMEDIA";,";AUTHER_FLAIR_CSS_CLASS";:NULL,";AUTHER_FLAIR_TEXT";:NULL,";BRAND_SAFE";:TRUE,";CAN_MOD_POST";:FALSE,";CONTET_MODE";:FALSE,";CREATED_UTC";:1514767344,";DOMAIN";:";Caliphateedia.info";,";FULL_LINK";:";https://www.reddit.com/r/business/comments/7nc5yf/south_korea_to_regulate_bitcoin_trading_further/";,";id";:";7nc5yf";,";IS_CROSSPOSTABLE";:FALSE,";IS_REDIT_MEDIA_DOMAIN";:FALSE,";IS_SELF";:FALSE,";IS_VIDEO";:FALSE,";LOCKED";:FALSE,";Num_Comments";:0,";Num_Crosssposts";:0,";Over_18";:FALSE,";Parent_White List_Status";:";All_ADS";,";permalink";:";/r/business/comments/7nc5yf/south_korea_to_regulate_bitcoin_trading_further/";,";钉住";:FALSE,";RETRIED_ON";:1514841750,";SCORE";:1,";SELF";:";";,";扰流器";:FALSE,";粘滞";:FALSE,";SUBREDIT";:";业务";,";subreddit_id";:";T5_2qgzg";,";subreddit_type";:";public";,"

在加载了文章文本之后,我做了一些处理来删除加载不正确的页面,并将页面文本截断到最多10k个字符。

我对/r/业务的NLP模型进行了为期几天的培训,内容涉及2018-01-01至2020年4月中旬期间的大约271k篇文章。我为模型使用了AWD_LSTM(例如language_model_learner(data_lm,awd_lstm,drop_mult=0.3)和text_classfier_learner(data,awd_lstm,drop_mult=0.5)),并根据文章得分使用离散标签:中性(0-10分)、可(10-100)、好(100-500)和好(500+)。这些类有点随意,我针对不同的迭代和子代码对它们进行了更改。我最终在运行时关注的唯一一件事是非中性类分数,因此这可能是一个二进制分类器,或者更好的分类器,它将单个文章视为多个子reddit的候选,而不是针对每个subreddit训练一个单独的模型。关于世界新闻,我的文章数量大约是现在的两倍。在这两种情况下,由于内存的限制,我都训练了100k的文章块,每次都会重新加载现有模型并使用新数据进行调整。

我选择了几个网站(Business Insider、路透社、彭博社、CNN、CNBC、BBC等)。基于/r/business的频繁站点,并将它们放入脚本中,并使用Requests和BeautifulSoup构建了一个爬行器。大约每分钟,我都会爬行站点根目录,寻找新的链接,并使用boilertube处理链接的页面,然后将其传递给NLP模型进行评分。非中性得分大于0.25(我为此特定模型选择的任意阈值)的新页面将被标记,并使用AWS SNS通过电子邮件发送给我。最初,我依赖于过滤这些收到的建议,然后自己使用Reddit应用程序提交文章。

我的网站投票器就像一个个人新闻聚合器,我用它来为要发布的东西生成建议。要将我从这个循环中移除,有几个“最后一英里”的问题需要解决。通过Reddit API编写提交代码非常简单,但我不仅仅提交所有传递给我的文章,我还充当一个质量过滤器,选择不提交看起来不合适的内容。我还为Reddit的帖子收集了一个合适的标题。页面标题通常不适合直接作为帖子标题(例如,包含站点名称之类的冗余内容),需要重新格式化,或者应该从内容中提取标题,例如,通过选择页面上最合适的H1标记。我没有改进模型以更好地对文章进行分类并提高评分机制的准确性,然后编写新的组件来提取标题,而是决定尝试将这些任务封装到一个机械的土耳其任务中,并让人类作为最终的看门人和标题生成器。我可以从这些土耳其人的机械任务中获取结果,并利用这些结果通过Reddit API将文章提交给Reddit。

Mechanical Turk是一项利用人类为您的应用程序完成小任务的服务。它对于增强AI应用程序和通过为它们标记任务来收集数据非常有用。但有效地使用它并不是没有困难的。关于机械土耳其人,需要了解的重要一点是,平台上的许多工人都在(明智地)优化任务完成数量。在使用任务的自定义限定符时,请确保您正在寻找的资格从问题中看不出来。同样,糟糕的命中(人工智能任务)是要求用户阅读一篇文章,如果他们认为该文章属于某个类别,则选中某个复选框。例如,我对/r/WorldNews候选人这样做是为了确保其中不涉及美国新闻,但是我向/r/WorldNews提交的第一个全自动提交是“强生公司停止在美国销售婴儿爽身粉”,由于美国内部新闻在/r/Worldnews上被禁止,因此在获得42个赞成票后被删除。确保您分配的工作至少看起来像是您将查看单个结果(例如,至少使用一次文本输入框)。对你的要求要小心和清楚,减少人为错误的机会。要求用户提供文章标题,而好意会导致一些用户写出糟糕的文章标题,而不是复制文章标题(如果他们想不出一个好的标题)。更好的任务是要求用户识别并复制文章中出现的文章标题,因为这具有更可靠的质量。将机械土耳其人的任务与我的机器人连接起来后,它就能够完全自动运行了。

您可能会注意到,我们每天最多只邮寄几件东西。事实上,我们的机器人可能正在发帖。我们在这里可以采取的一个策略是,随着时间的推移,降低门槛,以鼓励发布更多的内容,因为每个帖子都有相对有限的负面影响(一些负面影响,然后变得默默无闻)和非常高的上行潜力。惠尔

用fast.ai构建一个reddit post bot是一个有趣的项目,然而一点手工工作就击败了我几个月的网络爬行和计算时间。毫无疑问,如果我有足够的时间运行我的post bot,并将其扩展到更多的subreddits,我会很容易地越过10k大关。当然,POST机器人是衡量我努力程度的更好方式,在这个过程中,我了解了在更大的数据集上进行比对、人类标签和培训的斗争。希望作为读者的您能够从我分享的内容中了解到这一点。如果您对如何改进文本分类器或解决此问题有建议,请随时在下面给我留言!