AWS機器學習初探(1):Comprehend - 天然語言處理服務

 AWS機器學習初探(1):Comprehend - 天然語言處理服務php

 

1. Comprehend 服務簡介

1.1 功能

Amazon Comprehend 服務利用天然語言處理(NLP)來分析文本。其使用很是簡單。html

  • 輸入:任意 UTF-8 格式的文本
  • 輸出:Comprehend 輸出一組實體(Entity)、若干關鍵詞(Key phrase)、哪一種語言(Language)、什麼情緒(Sentiment,包括 positive,negative,neutual,mixed等幾種)和針對每一個單詞的語法分析(Syntax)
  • 形式:支持同步的單文檔返回,異步的多文檔處理和批處理
  • 支持的語言:語言判斷API支持上百種語言,其他API 只支持英語和西班牙語。
  • 是否須要預處理:不須要。AWS 本身會持續訓練處理模型,來不斷提升處理精度,這對用戶來講是透明的。

典型的異步批處理過程:python

  1. 將文檔保存在 AWS S3 中
  2. 開啓一個或者多個 Comprehend job 來處理這些文檔
  3. 監控這些 job 的狀態
  4. 從另外一個 S3 bucket 中獲取分析結果

1.2 示例

該圖中,左側爲一段做爲輸入的文字,右側爲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
        }
    ]
}

2. 一個示例應用場景

2.1 應用場景說明

部署架構圖:網絡

架構說明:架構

  • 在某個 AWS 區域,利用該區域中的 Comprehend API
  • 有一個該區域中的 VPC,它有兩個 Public Subnet,其中一箇中有一個EC2 實例,安裝了 phpmyadmin,用於鏈接和管理私有子網中的 Aurora 實例
  • 有一個私有子網,其中建立了一個 Aurora 實例,它只能在 VPC 範圍內被訪問
  • VPC 中有一個 Lambda 函數。由於該函數須要直接訪問 Aurora 實例,所以它必須在 VPC 之中。
  • 由於 Lambda 函數須要訪問 Comprehen API ,而 AWS 目前未提供內部訪問該 API 的端點,所以須要有一個 NAT 網關。 Lambda 函數經過該網關訪問 Comprehend API。

操做過程:dom

  1. 用戶經過 phpmyadmin 來使用 Aurora 數據庫。數據庫中有一個名爲 ReviewInfo 的表,每行表明一個文本信息,三列分別保存了文本信息的 ReviewID,message,sentiment,分別是記錄的ID,消息內容和情緒。
  2. 每當用戶插入一條消息(圖中的1和2),Lambda 函數會自動被觸發(圖中的3),它調用 Comprehend API(圖中的4),獲取該信息的 sentiment,而後寫回 Aurora 中的該條記錄的 sentiment 字段(圖中的5)。
  3. 用戶從 phpmyadmin 中查詢該條記錄的 sentiment。

2.2 實現

(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()

該函數很是簡單。簡單說明以下:

  1. 經過環境變量傳入 host,user,password,db 等數據庫鏈接信息。
  2. 首選經過 boto3 庫建立一個 comprehend 客戶端
  3. 從傳入的 event 中獲取消息內容
  4. 調用 comprehend 服務的 detect_sentiment 函數,獲取該消息的sentiment
  5. 經過 pymysql 庫連接到數據庫
  6. 更新該消息對應的記錄的 Sentiment 列

(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 字段。 

 

 

參考文檔:

歡迎你們關注個人我的公衆號:

相關文章
相關標籤/搜索