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 字段。
參考文檔:
歡迎你們關注個人我的公衆號: