AWS机器学习初探(1):Comprehend - 天然语言处理服务php
Amazon Comprehend 服务利用天然语言处理(NLP)来分析文本。其使用很是简单。html
典型的异步批处理过程:python
该图中,左侧为一段做为输入的文字,右侧为Comprehend API 的输出,分别是实体、关键词、情绪和语言。mysql
在界面上作测试的例子:sql
在 Comprehend 界面上输入美国总统川普最新的一条推特消息,它认为其是负面的:数据库
利用CLI 作测试的例子:json
aws comprehend detect-dominant-language --region us-east-1 --text "hello world" { "Languages": [ { "LanguageCode": "en", "Score": 0.9750663042068481 } ] }
部署架构图:网络
架构说明:架构
操做过程:dom
(1)按照部署图,建立所需的各个AWS 服务实例,包括EC2 实例、NAT 实例、VPC、安装phpmyadmin 等。过程省略。在VPC 中建立一个 Aurora 实例,配置 phpmyadmin 指向该实例。在 VPC 中建立一个 python 2.7 Lambda 函数。函数内容以下:
import pymysql
import json import boto3 import os def lambda_handler(event, context): comprehend = boto3.client(service_name='comprehend') jsonresponse= json.dumps(comprehend.detect_sentiment(Text=event['ReviewText'], LanguageCode='en'), sort_keys=True, indent=4) json_object = json.loads(jsonresponse) sentiment=json_object["Sentiment"] db = pymysql.connect(host=os.environ['host'],user=os.environ['user'],passwd=os.environ['password'],db=os.environ['db'], autocommit=True) add_order = ("UPDATE ReviewInfo SET Sentiment=%s WHERE ReviewId=%s;") db.cursor().execute(add_order, (sentiment,event['ReviewId'])) db.commit() db.close()
该函数很是简单。简单说明以下:
(2)经过 phpmyadmin 在 Aurora 实例中建立一个数据库 comprehend_demo。
(3)在 phpmyadmin 中执行下面的 SQL 语句在该数据库中建立一个数据表 ReviewInfo。它有三个字段。
CREATE TABLE comprehend_demo.ReviewInfo( ReviewId NUMERIC PRIMARY KEY , ReviewText TEXT NOT NULL , sentiment VARCHAR( 30 ) NOT NULL)
(4)在 phpmyadmin 中执行下面的 SQL 语句在数据库comprehend_demo中建立一个名为Aurora_To_Lambda的存储过程。注意需将其中的 COMPREHEND_LAMBDA_ARN 替换为步骤(1)中建立的Lambda 函数的 ARN。该存储过程会调用由 arn 指定的 Lambda 函数,而且传入 ReviewID 和 ReviewText 参数值。
DROP PROCEDURE IF EXISTS comprehend_demo.Aurora_To_Lambda; DELIMITER ;; CREATE PROCEDURE comprehend_demo.Aurora_To_Lambda (IN ReviewId NUMERIC, IN ReviewText TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async('<COMPREHEND_LAMBDA_ARN>', CONCAT('{ "ReviewId" : "', ReviewId, '", "ReviewText" : "', ReviewText,'"}') ); END;; DELIMITER ;
结果:
(5)在 phpmyadmin 中执行下面的 SQL 语句在该数据库中建立一个触发器。每当 ReviewInfo 表中有新行被插入时,该触发器会被调用。它会获取该行的 ReviewID 和 ReviewText 字段,而后调用第(4)步中建立的触发器,触发器会调用 Lambda 函数。
CREATE TRIGGER `TR_Lambda` AFTER INSERT ON `ReviewInfo` FOR EACH ROW BEGIN SELECT NEW.ReviewId , NEW.ReviewText INTO @ReviewId , @ReviewText; CALL comprehend_demo.Aurora_To_Lambda(@ReviewId , @ReviewText); END
(6)由于Aurora 须要调用 Lambda 函数,所以须要配置 Aurora 的 IAM Role,使之具备调用 Lambda 函数的权限。
首先在 IAM 界面上,建立一个 IAM Policy,它包含 InvokeFunction 权限。
再建立一个 IAM Role,包含该 policy。
在 Aurora 界面上,建立一个新的 DB Cluster parameter group:
修改其 aws_default_lambda_role 为前面建立的 IAM role 的 arn,好比:
将 group2 设置为 Aurora 实例的group。此时须要重启实例,使得修改得以生效。
而后在下面界面中设置 Aurora 的 IAM role 为上述 role:
(7)作个简单测试,插入一条数据,若是出现下面的错误,则意味着 Aurora 成功地调用了 Lambda 函数,可是 Lambda 函数没法链接到 Comprhend 服务。此时须要检查从 Lambda 函数通过 NAT 网关访问 Comprehend API 的路径,主要是 VPC 的路由表。
(8)在网络路径确认无误后,若是出现下面的错误,则表示 Lambda 函数还无权调用 Comprehend API。
(9)配置 Lambda 函数调用 Comprehend API 的权限。
首先须要在 IAM 建立一条 policy,它有 Comprhend API 的彻底权限。固然,能够只授予 sentiment API 权限。
而后建立一个 IAM role,关联该 policy。再将该 role 配置给 Lambda 函数,做为其 Execution Role。
(11)到如今为止,整个路径才算所有打通了。当你在 phpmyadmin 中经过 SQL 语句向 ReveiwInfo 表中插入一行时,Lambda 函数会自动在改行内更新 sentiment 字段。
参考文档:
欢迎你们关注个人我的公众号: