利用一点机器学习来加速你的网站

在生活中,我有 73% 的时间在考虑 web 性能-在低配手机上达到 60 FPS、 有序加载资源、离线缓存任何能缓存的资源。还有一些其他的优化。

最近,我发现自己对 web 性能的定义可能太狭隘了,从用户的角度上来说,这些只是 web 性能中的一些小插曲。

所以我打开了我经常去的网站,尝试了所有的用户可能的操作,并记录操作所花费的时间。(我们需要一些用户操作时光轴工具)

之后,我发现了一个可行的提升性能的方案。

下面的文章内容聚焦在某个具体网站的具体操作步骤。但是我觉得这个解决方案(嗯,没错!就是机器学习)可以应用到很多其他类型的网站上去。

问题,如何才能节约时间

这个网站,用于卖家出售没用的东西,买家通过购买这些东西来淘一些有价值的东西。

当卖家要在网站上出售东西时候,要先选择分类, 再选择对应的模版,然后填写细节信息,预览,最后发布。

然而第一步 — 选择分类 — 就把我带进了一条弯路

首先,一共有674个类别,我根本不知道我你破旧的皮划艇属于哪个类别( Steve Krug 说的好, 不要让用户去思考 )

第二步,即使我知道商品所属的类别 — 子类别 — 子子类别,我也要至少花费12秒的时间。

如果我跟你说,我能把你的页面的加载时间减少12秒,你一定觉得我疯了。那么为什么不在一些别的地方来节约这12秒呢。

正如凯撒大帝所说,时间很宝贵的呢。

我一直认为用户无知是福。我如果把商品的标题、描述、价格放到机器学习的模型里面,系统应该能自动计算出商品所属的分类。

这样子用户选类别的时间就能省下来了。他们就可以开心的把这些时间拿来去 reddit 找 DIY 的双层床了。

机器学习-你不该逃避它,你要去拥抱它

一开始的时候,我对机器学习一点概念都没有。我是在游戏 AI ,以及 Alpha 狗战胜人类顶级围棋棋手之后才有所了解的。

因此我打算开始去了解它,下面的几步一个小时都不需要。

  1. Google 搜索 'machine learning'
  2. 查看大量的关于机器学习的文章
  3. 发现了亚马逊发布的 机器学习 相关的服务
  4. 我开始意识到我不需要知道太多的关于机器学习的东西
  5. 嗯。好开心

(作者注: 因为没有去系统的学习机器学习,所以文章的一些专业术语可能被乱用。。)

一个简单的实现流程

亚马逊发布了他的机器学习文档 。如果你不是对这个文档很感兴趣,打算花5个小时去阅读,那么就来看下我写的一些总结吧。

整理如下:

  • 获取一些 CSV 数据文件,每行都是一个商品项(^_^我的皮划艇),列名是标题、描述、价格、所属分类。
  • 把数据传送到亚马逊的 AWS S3 bucket 里面
  • 用数据去训练机器。这样子,这个小小云机器人就能通过商品的标题,描述和价格去预测他的分类了。
  • 在前端页面上,写一些代码,获取用户输入的 标题/描述/价格,发给这个云机器人,经过计算,就能向预测这个商品所属的分类了。

实战模拟

下面是我写的一个表单,模拟了卖家发布信息的几个关键流程。

下面的结果一定会让你对机器学习保持兴趣。你只要相信我,建议类别是由深度学习模拟预测出来的。

让我们去卖一个冰箱

再来试一下卖个水族馆:

这个云机器人居然能识别出水族馆!

当我看到这个结果的时候,手舞足蹈,是不是棒棒哒?

(我偷偷的告诉你我是怎么实现的:React, Redux, JQuery, Mox, RxJs, BlueBird, Bootstrap,
Sass, Compass, NodeJs, Express, Loadsh。项目是使用 webpack 打包。最后生成的文件在1M左右)

嗯。不 BB 了。开始讲正经事。

一开始为了拿到机器学习用的数据。我也是想破了头。我大概需要10K条数据。后来是在一个当地的交易网站上面发现有这些数据。看了一下 URL 和
DOM 结构之后,我用 Google Scraper 插件提取了一些数据。导出成 CSV
文件。在这些数据上我大概花费了四个小时。将近整个项目时间的一半了。

数据整理好之后,上传到了 Amazon S3 上,配置了一下机器学习的参数,设置了数据模型。整个学习的 CPU 耗时才3分钟。

界面上还有一个实时预测功能,所以我打算用一些参数测试一下。

嗯。还挺好用的。

为了不在浏览器里面暴露出我的 Amazon API ,所以我把 API 放到了 Node 服务器上。

后台代码(Node)

使用方式很简单。接口参数为 modelId, 服务器返回一个 prediction :


  1. const AWS = require('aws-sdk');  
  2. const machineLearning = new AWS.MachineLearning();  
  3. const params = {  
  4. MLModelId: 'some-model-id',  
  5. PredictEndpoint: 'some-endpoint',  
  6. Record: {},  
  7. };  
  8. machineLearning.predict(params, (err, prediction) => { // we have a prediction!}); 

这里参数用大写字母开头,本来打算改掉的。后来想想还是算了。

Record, 是一个JSON对象。属性值是(title, description, price)

我不想只提供一些代码片段。为了帮助大家更好的理解。我把所有的服务端代码都贴上来了。

server.js:


  1. const express = require('express'); 
  2. const bodyParser = require('body-parser'); 
  3. const AWS = require('aws-sdk'); 
  4. const app = express(); 
  5. app.use(express.static('public')); 
  6. app.use(bodyParser.json());  
  7. AWS.config.loadFromPath('./private/aws-credentials.json'); 
  8. const machineLearning = new AWS.MachineLearning();  
  9. app.post('/predict', (req, res) => {  const params = { 
  10.     MLModelId: 'my-model-id', 
  11.     PredictEndpoint: 'https://realtime.machinelearning.us-east-1.amazonaws.com', 
  12.     Record: req.body, 
  13.   };  
  14.   machineLearning.predict(params, (err, data) => {    if (err) { 
  15.       console.log(err); 
  16.     } else { 
  17.       res.json({ category: data.Prediction.predictedLabel }); 
  18.     } 
  19.   }); 
  20. });  
  21. app.listen(8080); 

aws-credentials.json:


  1.   "accessKeyId": "my-access-key-id", 
  2.   "secretAccessKey": "shhh-secret-squirrel",  "region": "us-east-1" 

(在.gitignore 中忽略 /private 文件夹)

上面就是所有的后台代码。

前端代码

表单里面的代码功能比较简单。

  • 监听几个输入框的 blur 事件
  • 读取表单里面的字段值
  • POST 给 API 端
  • 把 API 端返回的 prediction 显示在页面上

  1. (function() { 
  2.   const titleEl = document.getElementById('title-input'); 
  3.   const descriptionEl = document.getElementById('desc-input'); 
  4.   const priceEl = document.getElementById('price-input'); 
  5.   const catSuggestionsEl = document.getElementById('cat-suggestions'); 
  6.   const catSuggestionEl = document.getElementById('suggested-category'); 
  7.    function predictCategory() {     
  8.     const fetchOptions = { 
  9.       method: 'POST', 
  10.       headers: {        'Content-Type': 'application/json', 
  11.       }, 
  12.       body: JSON.stringify({ 
  13.         title: titleEl.value, 
  14.         description: descriptionEl.value, 
  15.         price: priceEl.value, 
  16.       }) 
  17.     };  
  18.     fetch('/predict', fetchOptions) 
  19.       .then(response => response.json()) 
  20.       .then(prediction => { 
  21.         catSuggestionEl.textContent = prediction.category; 
  22.         catSuggestionsEl.style.display = 'block'; 
  23.       }); 
  24.   }  
  25.   document.querySelectorAll('.user-input').forEach(el => { 
  26.     el.addEventListener('blur', predictCategory); 
  27.   }); 
  28. })(); 

上面就是全部的前端代码了。

啊啊啊……云服务还要收费呢

别忙着收起你的帽子,魔术表演怎么可能是免费呢。

我上面用到的 model 数据(10K行/4列)有6.3MB. 云端在等待接受请求的时候,消耗了6.3MB的内存。这些资源的开销是每小时0.0001刀。或者每年8刀。 我在手套上面花的钱都比它多。

每次进行 prediction 的时候,也要0.0001刀。所有就不要随随便便就调用这个 API 了。

虽然目前不仅仅是 Amazon 提供了这个服务,但是我还是没有找到另外两个大厂家的价目表。

Google 有 TensorFlow , 但是我看了一下 入门教程 就跑了。

Microsoft 有 Machine Learning offering , 但是IE6还是让我有点耿耿于怀 (可能不久后,Amazon 和 Microsoft 之间会有一场大战吧)。

一些总结

或许只是我感到有些许惊讶(我还记得当我意识到‘news’是‘new’的复数的时候),我认为这些都十分让人惊讶。它允许像你我这样的普通人(对发展影响的程度较小的人)在机器学习中进行挖掘,可能会促成那些用户很大的改进。

下一步在哪?

上面的例子显然是进行过设计的,并且,我承认,我省略了一些话题。

如果我可以的话,我应该列出所有问题,但要是你自己去做你自己发现问题那也是很有趣的。

因此,去做吧,如果你取得了一些成功,我将乐于在评论中看到它们。

作者:佚名

来源:51CTO

时间: 2024-10-01 10:21:00

利用一点机器学习来加速你的网站的相关文章

利用链接的价值导向来优化网站链接二

大家好,我是木子成舟.前面为大家介绍了自己看完李建忠的文章<链接的力量 建立对链接质量的评价维度>后对于SEO中网站链接的一点感悟--<利用链接的价值导向来优化网站链接>,其中对于<链接的力量>一文中的维度只谈了三个方面:数量.速度和频度(可查看<网站链接优化之链接价值>).今天接着为大家分享剩下的五个维度的链接价值导向. 1.网站链接为获取精准流量服务! 网站链接的发布其作用应该在于其能够引导精准的流量,也就是要求我们将这些链接发布到能够带来直接流量的地方

利用好关键词的相关性不断提升网站的排名

相关性是影响网站排名最重要的因素之一,记得笔者曾写过一篇"影响网站关键词排名重要的五点因素",第一是用户体验,第二就是如何做好网站的相关性.其实相信大家只要对SEO稍微有点了解的朋友都会知道相关性有多么重要.既然这么重要,我们自然就要做好来提升我们网站的关键词排名,其实做好相关性也是在完善用户体验,帮助用户在我们网站上找到更多有用的信息,也是我们增加用户粘性的一个好办法,今天笔者就以自己的博客为例子为大家介绍一下如何利用好关键词的相关性不断提升网站各个关键词的排名的方法. 首先你只能选

struts2漏洞余波未平 加速乐为网站安全护航

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 7月17日,struts2漏洞疯狂来袭,短短两三天时间里,很多知名门户.电商.银行.政府等网站被曝存在该漏洞;经过几天几夜的疯狂攻防战,多数网站已经顺利修复了该漏洞. 此时,一则"苹果开发者网站疑似因struts2漏洞关闭"的消息传出来,随后"淘宝.京东被拖库"的消息开始在微博上流传,有关struts2

利用CentOS系统IPtables防火墙添加360网站卫士节点IP白名单

伴随着百度与加速乐合作的分离,百度也相继推出了自己的加速产品:百度云加速,不过,对于广大的站长们来说,百度云加速免费版本提供的节点太少了,而且在流量.DDoS防御上面做了一定的限制,以下为百度云加速名个套餐价格的对比: 相信,看了以上的数据,免费的百度云加速感觉有一些像鸡肋,相比之下,360网站卫士在这方面可能做得更好一些,360网站卫士是集网站防护.加速.运营为一体的一站式http://www.aliyun.com/zixun/aggregation/13744.html">管理服务平台

揭秘利用QQ群推广淘宝客网站技巧

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 自阿里妈妈推出淘宝客以来,通过建立淘宝客网站赚钱的草根站长越来越多,建立好淘宝客网站之后,最棘手的问题是如何推广? 推广的方式各种各样,有通过关键词排名获取流量推广的,有做搜索引擎竞价推广的,方法林林总总,不一而足.哪些方法适合没有SEO基础而又对推广方法知之甚少的人群呢?我想这个首先应推的是免费的QQ群推广,由于QQ的普及率和覆盖率非常广,

如何利用“我烧网”进行博客网站推广

中介交易 SEO诊断 淘宝客 云主机 技术大厅 "我烧网"作为一个博客阅读社区,能够很好地将各博客内容通过RSS同步聚合,也能在相应文章后面留有原文链接.但是,看看我烧网是的众多广告和由此网给我们带来的流量,作为原创内容的博客们是否就是给它做内容嫁衣的"小裁缝"了呢?草根博客又该如何利用"我烧网"进行博客网站推广呢? "我烧网"对于提升博客网站外链的作用 我烧网号称是一个以内容为核心的垂直化社区,包含热文.推荐.喜欢.订阅.收

本地利用IIS7、XAMPP、Wordpress建设网站教程(图文、文字详细)

本地利用IIS7.XAMPP.Wordpress建设网站教程(图文.文字详细) 1.建站工具:l 下载XAMPP :百度搜索http://rj.baidu.com/soft/detail/12489.html?ald l 下载Wordpress:百度搜索https://cn.wordpress.org/(官网)点击右上角:download wordpress点击下载wordpress-4.9.1-zh_CN.zip(压缩文件)2.本地主机设置: 安装本地服务IIS及ASP 打开"控制面板&quo

利用“特价年货”名义行骗的钓鱼网站日均增加1000余家

新华网北京2月4日专电(记者张辛欣)http://www.aliyun.com/zixun/aggregation/12568.html">360安全中心监测显示,利用"特价年货"名义行骗的钓鱼网站日均增加1000余家,相比1月涨幅超三倍.网络安全专家提醒网民购物莫贪小便宜,尽量选择正规可靠的购物网站置办年货. 钓鱼网站往往以年货低价促销.清仓甩卖等吸引消费者,这些网站的页面也经常套用知名购物网站,如果没有安全软件鉴别提示,普通用户很难分辨真伪. 网络安全专家石晓虹博士

批处理利用HOSTS文件(屏蔽,加速)网站的代码_DOS/BAT

复制代码 代码如下: @echo off&setlocal&cls echo/&echo\&echo=&echo]&echo[&echo+ :start set/p a=选择模式(1:屏蔽网站 2:加速访问 3:删除被屏蔽的网站 4:退出): if not defined a goto start if %a% equ 1 (echo/&goto a) if %a% equ 2 (echo/&goto b) if %a% equ 3