在家作饭不下馆子能够减小开支已是公开的秘密。但做为一名美食天堂的国民,不下馆子几乎是不可能的。正则表达式
处处都是火锅店、烧烤餐厅或美味披萨店,瞅一眼这些美食,就足以摧毁你们省钱的意志力。算法
若是你即不想让钱包当成受害者,又不想放弃美妙的用餐体验,就得本身“造”钱来支付饭费。编程
来,跟随做者的脚步,让你走上了各类中餐、西餐、中西餐的蹭饭之路。dom
本文做者NBC环球的数据工程师Chris Buetti,2017年毕业于维克森林大学。机器学习
首先咱们的目标是到最棒的餐厅吃到霸王餐。这是个技术活,达成这个目标有两种方法:要么让代码作这件事,要么有大量的空闲时间。编程语言
本文会简要介绍一下使用的技术和编程语言,但不会给出代码或相关内容。会解释怎样使用逻辑回归,随机森林,AWS和自动化脚本,但都不会深刻。本文更多的是理论而非实践。工具
若是你是一个非技术人,这篇文章仍然适合你,只不过要多花费一点时间和精力。文章里的这些方法大部分都很枯燥,这就是为何我要用自动化脚原本实现它们的缘由。学习
走起,我将从结果开始,而后解释我是如何作到的。测试
我作了什么优化
在今天这个数字时代,Instagram用户数是一种财富。像传闻说的那样能够经过大量的粉丝来赚钱,或者对我来讲,用粉丝来支付个人饭费,这就是我所作的。
我建立了Instagram我的首页,展现纽约的轮廓,标志性景点,优雅摩天大楼的图片,等等。这使我在纽约地区积累了超过25,000名粉丝,而且仍在快速增加。
我经过Instagram发消息或电子邮件联系当地的餐馆,用在主页上向粉丝发布评论来换取免费餐或至少是用餐折扣。
几乎全部我联系的餐馆都给了我免费试吃的机会或优惠卡。大多数餐馆都有市场营销预算,因此他们很乐意为我提供免费的用餐体验,以便开展促销活动。有时优惠太多我只好送一些给朋友和家人。
这原本没什么稀奇,关键在于我将整个过程自动化了,个人意思是100%不用手动操做了。我编写的代码能够自动找到图片或视频,制做标题,添加主题标签,标记图片或视频出自哪里,还能过滤垃圾邮件,发帖,关注用户和取消关注,点赞,监控个人收件箱,最重要的是自动向与可能须要促销的餐馆发消息和电子邮件。
自从有了这套代码,我甚至都不须要真正登陆该账户,根本不用花时间在这上面。它本质上是一个机器人,但普通人没法分辨,由于它的行为和人同样。做为它的开发者,我能够坐下来欣赏它(和个人)工做。
我是怎么作到的
我会带你从头到底了解我在这个过程当中所作的每一件事。其中一些事看似常识,但当你用自动化系统来完成这些事的时候,细节就变得很重要。该过程可分为三个阶段:内容共享,黑客式增加以及销售和促销。
内容共享
其实,个人账户所发布的内容都不是我原创的,而是我从新分享其余人的内容,但有注明来源。若是有人说我侵权,要我撤下他们的照片,我会立刻照作。但由于我在分享里带了他们的主页的连接,因此他们历来都只有感激我。
天天屡次发布内容是必须的。这是Instagram算法肯定你的曝光度的主要因素之一(经过“探索页面”)。天天发帖,特别是在天天“高峰时段”发帖,很是单调乏味。大多数人作了几周就会放弃,甚至有时一两天漏发也会致使曝光度降低。所以,将内容收集和分享过程自动化是颇有必要的。
获取图片和视频
我最初考虑用爬虫从Google图片或社交新闻站点Reddit上抓取图片。我遇到的最大的困难之一就是Instagram对所发布图片的大小有特别要求,最好是“方形”图片,也就是宽度等于高度,所以发布非正方形的图片会被拒绝。这使得检索图片变得很是艰巨。
我最终决定直接从其余Instagram帖子中搜索,由于图片大小符合要求,并且还能够准确知道其来源,这一点在自动化脚本里很是有用。
我收集了50个Instagram账户,这些账户发布了许多关于纽约的优质图片。我用开源软件编写了一个爬虫来下载这些账户上传的帖子。除了下载文字内容外,还有图片和一堆元数据,如标题、点赞数和位置等。我将爬虫设置为天天凌晨3点或当个人图片库为空时运行。
这样,我把全部内容都集中存储在一个地方,包含正确格式的各类内容。
自动肯定什么是“好”或“坏”的内容
并不是全部在Instagram上发布的内容都值得从新分享。有不少卖东西的帖子,骂人的贴子,或者有些内容跟我想要的不相关。如下面这两篇帖子为例:
这两个帖子来自同一个纽约的Instagram账户。左边帖子发布的是天然风光,我很乐意把它从新分享在个人主页。右边的广告没有任何上下文,标题分两行,这其实是在给一个纽约的手机应用打广告。
若是我把它放在个人主页上,那会就显得让人困扰,与个人主页显得格格不入。你能够看到点赞数量的差别-8200对1000。我须要脚本可以自动过滤掉右边的帖子,并从新分享左边的帖子。
所以,我不能盲目地从新分享我提取到的全部内容。但我又但愿这是一个自动化过程。因此我须要建立一个算法,能够取其精华去其糟粕。算法的第一部分包括一些hard-coded规则,第二部分是机器学习模型。
算法的第一部分——hard-coded规则
我作的第一件事是根据元数据中的特定规则优化个人inventory。在这个过程当中,我必须保持严谨。若是出现了一个警告,那么图片就废了。
理论上,我能够抓取到不少内容,但若是算法在个人页面上发布了不合适的内容,那么在我发现以前可能已经有不少人看到了。
我接下来要作的是看看评论是否不可用。个人经验是,不可用的评论大多与有争议的帖子有关,并不值得我冒这个风险。
我要作的最后一件事是看图片中是否标记了多我的。不少时候,图片中的一个标签是标记它来自哪里,这其实是有用的。可是若是图片有多个标签,那么就会出现混淆。
根据这些规则,我能够排除大部分垃圾帖子和不受欢迎的帖子。然而,不能仅仅依据是否推销东西来判断一篇帖子是否具备高质量内容。此外,个人hard-coded规则可能仍然会遗漏一些销售类的广告帖子,所以我想在完成第一部分后再过一个二级模型。
第二部分——机器学习模型
通过第一部分算法过滤——hard-coded规则,我发现仍然存在一些垃圾帖子。我不打算人工手动剔除它们,我计划将这个过程彻底自动化。
每一个帖子上都有大量的元数据,包括点赞数,标题,发布时间等等。我最初的目的是尝试预测哪些图片会得到最多的点赞。然而,很明显,网红博主天然会得到更多的点赞,因此这不能做为准确的判断依据。
后来个人想法是让响应变量等同于点赞率(即点赞数/粉丝数),并尝试进行预测。但在观察每张图片及其点赞率后,我认为点赞率和图片质量的相关性不大。我不认为那些点赞率高的照片就是高质量照片。
一些不知名的摄影师发布的图片内容并不必定比网红博主差,即使网红拥有更高点赞率。我决定用分类模型替换回归模型来评价图片内容的质量,判断其是否能够发布——一个简单的是或否问题。
在查看其余元数据以前,我抓取了大量照片并把每张照片手工标记为0(差)或1(好)。这是很是主观的判断,能够说我是根据本身的主观判断制做模型。但我认为个人判断应该和大部分人同样。
我生成了数据集。响应变量为0或1(即差或好),具备许多特征。每篇帖子的元数据能够提供我如下信息:
从这七个解释变量里,我改变了一些我认为有用的特征。例如,我改变了评论的数量和点赞率。我从标题中提取了带“#”号的标签的数量,并将其做为column,并对标题中提到的用户数量进行了相同的操做。
我对其他的标题进行向量化,用于后续的天然语言处理。向量化是删除外围词(如“the”,“and”),并将剩余词转换为能够用于数学分析的数字字段。我获得了如下数据:
我使用了许多分类算法,例如支持向量机(Support Vector Machines)和随机森林树(Random Forests),但最终是采用了简单的逻辑回归算法(Logistic Regression)。
我认为有时候最简单的答案就是正确的答案。不管我采用哪一种方式处理数据,逻辑回归算法在个人测试集上都表现最好。
与其余分类算法不一样,我能够在进行预测时设置阈值的得分(threshold score)。分类算法一般输出二进制类(在个人算法里是0或1),但Logistic Regression实际上会输出0到1之间的小数。
例如,它可能将帖子评为0.83或0.12。人们一般将阈值设置为0.5,并将全部大于0.5的定为1,其他的定为0,但这取决于具体使用的案例。这个过程很关键,因此我将个人阈值设为0.9,并低于该基准的内容视做无用的。
在部署个人模型以后,图片和视频首先通过一套严格的规则清理,而后再通过Logistic Regression筛选出优秀的素材。如今我可以继续为每一个帖子添加说明和打分。
自动化说明和打分
我如今有一个自动收集相关内容并删除垃圾图像的系统——但我尚未完成。
若是你以前用过Instagram,那么你应该知道每一个帖子的图片或视频下方都有文字说明。但由于我实际上看不到这些图片,也没有时间给它们所有加上说明,因此我须要制做一个通用标题。
我作的第一件事是制做最终模板。它看起来像这样:
接着我要将代码填进去。让咱们一个个来看怎么填。
标题
我建立了一个文本文件,其中包含许多预约义的通用标题,能够匹配任何的图片。这些标题能够是关于纽约的名言、通用问题或是简单的赞美,例如:
对于每一个帖子,标题是随机选择的。我有许多备选的标题,根本不用担忧某个标题会频繁出现。对于咱们的例子,咱们能够选择 “Who can name this spot?”。
来源标记
自动标记图片资源的来源可不是件容易的事情。一般状况下,一个Instagram帐号页面上的图片并不表明这帐号拥有图片的版权。这样的帐号可能也是从新分享的内容,会在页面的标题中或图片标签里标记图片来源。
对此,我决定不管如何先标注上图片的第一来源;若是我能够根据其余信息找出到图片的原始出处,那么我就继续在后面添加。经过这种方法,我基本上就能够标志出全部图片素材了。
首先咱们看一下@likenewyorkcity的这个帖子,尽管是这个帐号分享出了这张图片,但图片中的标签和页面标题上@geoffrey.parry才是图片的真正版权拥有者。
理论上我但愿个人代码能够在识别这张图片后得出这样一条输出:
第一步很简单,我只须要直接标注出出现的帐号便可,但第二步就没那么容易了。
我经过REGEX(正则表达式工具)匹配一些相似于“by”或者“photo”的关键词,而后找到紧跟在关键词后的“@”标识,经过这种方法抓取的用户名便被我标注成图片来源的第二部分。
若是标题中没有出现这些关键词,我便检查是否有人为图片打了标签,这些打了标签的帐号便被我“默认”为我该标注出的对象了。尽管这种简单粗暴的方法并非那么完美,但至少比不这么“默认”强上好几倍,不失为一种值得尝试的方法。
我老是能精准地标注出图片的正确来源。实际上,人们还屡次在个人图片下评论道“感谢分享!”(接下来展现出的图片即是一个很好的例子)
标签
Instagram容许用户为图片打上30个主题标签,图片便会在相应的主题下展现。因而我建立了一个包含100多个相关主题的文件:
刚开始我每次都会随机在其中选择30个主题,并且不久后,我能够根据实际结果比较出哪些主题标签会获得更多“赞”。
模板填充
通过以上这三个步骤后,我即可以将采集到的信息填充到最后的模板中,为每个帖子“量身定制”标题。
下面是最终的产出成果:
最后成功以下:
我使用适合纽约市的任何图片的通用标题,标记了图片的Instagram账户和原始来源,添加了三十个主题标签来提高帖子的曝光率。若是你继续查看帖子评论,你甚至还能够看到原始做者向我表示感谢。
发布
如今我有一个集中管理的图片资源库,并可使得每一个帖子自动化生成标题,仅需最后的临门一脚——发布。
我在AWS上启动了一个EC2实例来托管个人代码,之因此选择这种方式是由于它比个人我的计算机更可靠——它始终保持联网状态,并且项目的工做量彻底包含在AWS免费服务的条件限制之下。
我编写了一个Python脚本随机抓取其中一张图片,并在完成抓取和清理过程后自动生成标题。我设置了一个定时任务:天天早上8点,下午2点和晚上7:30调取个人API,完成全部的发布操做。
此时,我已经彻底自动化了内容查找和发布过程,我再也不须要天天都找资源和发帖子运营个人帐号了——程序为我完成了全部事情。
涨粉
仅仅发布是不够的——我须要制定一些方法持续涨粉。因为我不会手动执行任何操做,所以这一步骤我也须要想办法自动化处理。个人想法是经过直接与受众的兴趣用户直接互动以增长帐号的曝光率。
我写的交互脚本从美国东部时间上午10点到下午7点运行,在我看来这段时间是Instagram最活跃的时间范围。在这一天中,个人账户有条不紊地关注,取关,并为相关的用户和照片点赞,以使他们以一样的方式与我互动。
关注(更加数据科学的方式)
若是你是Instagram用户,无论你是否意识获得,我敢确定都被“卷”过这种增粉方法,尤为对于试图增长粉丝的用户来讲很是有用。某天若是你在健身版块中关注一个有趣的Instagram页面,次日你就会被一群健美运动员和健身模特所关注。尽管这种方法看起来很是微不足道,但它确实很是有效。
须要注意的是你不能在Instagram上滥用这个方法关注其余帐号。Instagram的算法有很是严格的限定,若是你在一天内操做过多或关注太多用户,他们会将你中止你的操做甚至封掉你的账号。
此外,你一天在Instagram上最多只能够被7500人关注;并且通过大量的测试,我发现你能够在一天内关注400人,取关400人。毕竟操做条件有限,每一次关注都很是宝贵,不能浪费在不太可能和你互粉的人身上。因而,我决定采集每次操做的元数据,基于此创建一个模型来预测某我的与你互粉的可能性,确保个人每个关注操做都是有意义的。
我花了几分钟手动收集了20多个与我处在版块下的账号。我没有初始数据,所以前几周我为增长个人关注量随机执行这些操做,但更重要的是我须要采集尽量多的元数据,以便我能够创建个人预测模型。
我浏览了20多个相关账户,关注了他们的粉丝,赞他们的照片或评论他们的帖子。在每次关注操做中,我都尽量多地获取用户的元数据造成一个CSV文件,包含他们的关注者和粉丝的比例,他们是公开帐号或私人帐号,或者他们是否有我的资料图片等。
天天,脚本都会自动扫描CSV文件并标记他们的反应,经过0,1,2进行顺序评级。若是两天内用户没有任何回应则标注为0,若是用户回粉但没有在最近的十张图片中发生任何互动行为则标注为1,2则是最理想的结果,表示他们回粉并在最近十个帖子中进行了互动。这样下来,个人数据集看起来即是这个样子的:
在将数据“喂”进ML模型前,我经过探索性数据分析得出如下结论:
虽然点赞党和评论党较关注党回粉个人可能性小,但他们更喜欢与我互动。这说明尽管他们没法直观地带来关注量的增长,但他们能够提高我帐号的质量。
早上关注用户比晚上关注用户的回粉效果好。
公开的帐号较私密帐号更愿与我互粉。
女性较男性更愿意回粉个人帐号。
关注用户数大于粉丝数的用户(关注与粉丝的比例大于1.0)更愿意与我互粉。
从上面的洞察,我优化了最初对搜索用户的方式。我调整了个人设置,只在早上去关注,主要寻找女性用户。如今,我终于可以创建一个机器学习模型,在与用户交互以前,根据用户的元数据预测是否会关注我,这样就不会浪费我天天可以关注的用户额度,去关注一个不会跟我互粉的人。
接下来,我选择使用随机森林算法对后续的结果进行分类。最初,我并无设置结构或结果变量,而是使用了许多不一样的决策树,由于我想获得它们的可视流程图。随机森林是决策树的加强,纠正单个树中存在的不一致性。在对个人训练数据进行建模后,测试数据上的精度一直超过80%,因此这对我来讲是一个很是有效的模型。进一步,将模型应用于抓取的用户的代码,优化了关注算法,个人关注人数开始蹭蹭的往上涨。
取关
两天后,我就不会再继续关注我以前关注的人,两天已经足够让我肯定他们是否会回粉。这样我能关注更多的人、收集更多的数据,并持续涨粉。
为何我要对他们取关呢?有两个缘由:第一,个人关注人数的额度上限为7500人;第二,每一个人确定都但愿提升被关注/关注的比率,这样才能体现本身特别受欢迎,特别吸引人。
这是一项简单的任务,由于你不须要作出任何决定。你某一天关注了400我的,两天后你把这些人取关就好了。
点赞
点赞也能够提升关注人数。可是我没有投入太多的精力去选择一些你们都喜欢而且会去点赞的图片贴在个人帐户中,由于对比以上其余方法,这个效果并不那么明显。因此,我只是提供了一组预约义的主题标签,经过主题关联,用户的连锁点击,收获一些关注者。
自动推销
至此,我有一个特别智能的Instagram机器人。个人NYC主页会寻找与它相关的内容,淘汰不良的潜在帖子,吸引用户群,并全天发帖。此外,从上午7:00 到下午 10:00,它经过分析点赞、关注和不关注的受众人群来修改自身的设置,而且经过一些算法来优化受众人群的定义。最棒的是,它的分析与操做更加人性化,与Instagram真实用户类似。
有一两个月,我能明显看到关注人数的增加。天天个人帐户中都会多100到500名的新关注者,一块儿欣赏我所爱的城市的美丽图像。
我能够开始享受个人生活,认真的工做,和朋友出去吃饭、看电影,并不须要花费时间去手动发帖。当我忙于本身的事时,它能彻底托管个人帐户。
当我拥有了20000个追随者的时候,我决定是时候靠它来蹭吃蹭喝了,因此我须要它自动推销个人产品。
我作了一个通用的消息模板,不管是餐馆、剧院、博物馆仍是商店,这个模板都能适用。下面就是我绞尽脑汁想出来了的:
如今,我只须要记录帐户名称和消息发送时个人关注者数量。
个人目标是找到商业用户并像他们推销个人产品。商业用户资料与普通用户资料略有不一样—商业用户能够在其网页上添加电子邮件、电话号码、地址等其余详细资料。但最重要的是,他们的资料中都有一个类别标签。
上面那张图中是一个商业用户的示例。在左上角的名称下方,显示出它是一个韩国餐厅,同时顶部设有电话呼入、电子邮件和地址等提示信息。
我写了一个Python脚原本查找这类页面而且让个人账户可以自动向它们发送消息。该脚本采用两个参数,一个初始主题标签和一个要在类别标签中查找的字符串。这里,我使用标签“Manhattan”和字符串“restaurant”来举例说明。
这个脚本的做用是去提取主题标签并加载照片,而后遍历这些帖子,直到找到在照片中标记用户的帖子。若是找了到,它会检查其标签,确认它是不是商业用户。
若是是,就查看该用户类别。若是类别包含“餐馆”一词,则会向他们发送个人信息。商业用户通常都会在他们的页面上留下他们的电子邮件,因此能够向他们自动发送电子邮件,在后台跟进个人Instagram消息便可。在搜索过程当中,我能够随时将标签更改成#TimesSquare,也能够将目标字符串更改成“博物馆”等,我想搜索什么都行。
当我登陆进入帐户后,我会看到它自动生成和发送的消息。
若是我去个人Gmail发件箱, 我就会看到如下邮件:
我还有一个脚本, 用来监测个人收件箱中的任何回复,同时提醒我。若是我收到回复邮件,我就会联系个人潜在客户。
以上这些操做,都是脚本自动运行的, 并不须要任何人工操做。
我终于实现了蹭吃蹭喝~
最终效果比我以前想象的还要好,我利用Instagram推广换取了不少餐厅的礼品卡以及免费餐。
借助人工智能、自动化脚本和数据科学的力量,在代码脚本自动运转时,我能够高枕无忧。它是一个特别尽责的推销员,让我可以有本身的时间享受生活。