透過 Cloud Natural Language API 進行實體、情緒和語法分析作業

Cloud Natural Language API 可讓您從文字中擷取實體、執行情緒和語法分析,以及將文字分類。

在這個研究室中,我們會瞭解如何使用 Natural Language API 分析實體、情緒和語法。

您將會瞭解的內容

  • 建立 Natural Language API 要求並使用 curl 呼叫 API
  • 使用 Natural Language API 擷取實體並執行文字分析
  • 使用 Natural Language API 對文字執行語言分析
  • 建立其他語言的 Natural Language API 要求

敬請採取行動

  • Google Cloud Platform 專案
  • 瀏覽器,例如 ChromeFirefox

您要如何使用本教學課程?

唯讀閱讀 閱讀內容並完成練習

您對於 Google Cloud Platform 的評價如何?

初級 中級 專業

自行調整環境設定

如果您還沒有 Google 帳戶 (Gmail 或 Google Apps),請先建立帳戶。登入 Google Cloud Platform 主控台 (console.cloud.google.com),然後建立新專案:

2016-02-10 12:45:26.png 的螢幕擷取畫面

提醒您,專案編號是所有 Google Cloud 專案的不重複名稱 (使用上述名稱後就無法使用,敬請見諒!)此程式碼研究室稍後將稱為 PROJECT_ID

接著,您必須在 Cloud Console 中啟用計費功能,才能使用 Google Cloud 資源。

完成這個程式碼研究室的成本應該不會超過新臺幣 $300 元,但如果您決定繼續使用更多資源,或是讓資源繼續運作 (請參閱本文件結尾的「清除設定」一節),就有可能需要更多成本。

新加入 Google Cloud Platform 的使用者可免費試用 $300 美元

按一下畫面左上角的選單圖示。

從下拉式選單中選取 [API 與服務],然後按一下 [資訊主頁]

按一下 [啟用 API 和服務]

然後在搜尋框中搜尋「language」。按一下 [Google Cloud Natural Language API]

按一下 [啟用] 即可啟用 Cloud Natural Language API:

等待幾秒鐘後再啟用。啟用後,您就會看到以下訊息:

Google Cloud Shell 是在 Cloud 中執行的指令列環境。這款以 Debian 為基礎的虛擬機器會載入您需要的所有開發工具 (gcloudbqgit 等),並提供永久的 5GB 主目錄。我們會使用 Cloud Shell 建立傳送至 Natural Language API 的要求。

如要開始使用 Cloud Shell,請按一下標題列右上角的「啟用 Google Cloud Shell」圖示Screen Shot 2015-06-08 at 5.30.32 PM.png

系統會在主控台底部的新頁框中開啟 Cloud Shell 工作階段,並顯示指令列提示。等待 user@project:~$ 出現提示

由於我們會使用 curl 將要求傳送至 Natural Language API,因此必須產生 API 金鑰,以傳入我們的要求網址。如要建立 API 金鑰,請前往 Cloud Console 中的「API 與服務」中的「憑證」區段:

在下拉式選單中選取 [API 金鑰]

接著,請複製您剛剛產生的金鑰。稍後您將需要在這組實驗室中取得這組金鑰。

現在已有 API 金鑰,請將金鑰儲存至環境變數,這樣就不必在每項要求中插入 API 金鑰的值。您可以在 Cloud Shell 中執行這項操作。請務必將 <your_api_key> 替換成您剛剛複製的金鑰。

export API_KEY=<YOUR_API_KEY>

第一個 Natural Language API 方法將會是 analyzeEntities。透過這個方法,API 可以從文字中擷取實體 (例如人物、地點和事件)。為了試用 API 的實體分析,我們採用以下句子:

Joanne Rowling,他以筆名 J. K. Rowling 與 Robert Galbraith 是英國小說家和編劇,她撰寫了《哈利波特》系列影集。

我們會在 request.json 檔案中建構對 Natural Language API 的要求。在您的 Cloud Shell 環境中,使用下列程式碼建立 request.json 檔案。您可以使用其中一個偏好的指令列編輯器 (nano、vim、emacs) 建立檔案,或使用 Cloud Shell 內建的 Orion 編輯器:

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"Joanne Rowling, who writes under the pen names J. K. Rowling and Robert Galbraith, is a British novelist and screenwriter who wrote the Harry Potter fantasy series."
  },
  "encodingType":"UTF8"
}

我們會在要求中告知 Natural Language API 即將傳送的文字。支援的類型值為 PLAIN_TEXTHTML。在內容中,我們會將文字傳送到 Natural Language API 進行分析。Natural Language API 也支援傳送儲存在 Cloud Storage 中的文字,以便進行文字處理。如果需要從 Cloud Storage 傳送檔案,我們會以 gcsContentUri 取代 content,並將文字檔案的值儲存在 Cloud Storage 中。encodingType 會告知 API 在處理文字時該使用哪一種文字編碼。API 會使用這個屬性來計算特定文字出現在文字中的位置。

您現在可以使用以下 curl 指令,將要求主體和先前儲存的 API 金鑰環境變數傳送至 Natural Language API (所有指令均符合一行指令):

curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

回應的開頭應該會如下所示:

{
  "entities": [
     {
      "name": "Robert Galbraith",
      "type": "PERSON",
      "metadata": {
        "mid": "/m/042xh",
        "wikipedia_url": "https://en.wikipedia.org/wiki/J._K._Rowling"
      },
      "salience": 0.7980405,
      "mentions": [
        {
          "text": {
            "content": "Joanne Rowling",
            "beginOffset": 0
          },
          "type": "PROPER"
        },
        {
          "text": {
            "content": "Rowling",
            "beginOffset": 53
          },
          "type": "PROPER"
        },
        {
          "text": {
            "content": "novelist",
            "beginOffset": 96
          },
          "type": "COMMON"
        },
        {
          "text": {
            "content": "Robert Galbraith",
            "beginOffset": 65
          },
          "type": "PROPER"
        }
      ]
    },

    ...
  ]
}

針對回應中的每個實體,我們會取得實體 type、相關維基百科網址 (如果有的話)、salience,以及此實體出現在文字中的索引。[Salience] 是 [0,1] 範圍內的數字,代表實體整體與文字之間的中心性。Natural Language API 也能以不同的方式辨識同一個實體。查看回應中的 mentions 清單:API 能夠知道「Joanne Rowling」、「Rowing」、「novelist」以及「Robert Galbriath」,這兩者都是指向相同的內容。

除了擷取實體外,Natural Language API 也可讓您針對文字區塊執行情緒分析。我們的 JSON 要求將包含與上述要求相同的參數,不過這次我們會改寫文字來表達更強烈的情緒。將 request.json 檔案換成下列內容,歡迎您用下方的文字取代下方的 content

request.json

 {
  "document":{
    "type":"PLAIN_TEXT",
    "content":"Harry Potter is the best book. I think everyone should read it."
  },
  "encodingType": "UTF8"
}

接下來,我們會將要求傳送至 API 的 analyzeSentiment 端點:

curl "https://language.googleapis.com/v1/documents:analyzeSentiment?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

回應應該會如下所示:

{
  "documentSentiment": {
    "magnitude": 0.8,
    "score": 0.4
  },
  "language": "en",
  "sentences": [
    {
      "text": {
        "content": "Harry Potter is the best book.",
        "beginOffset": 0
      },
      "sentiment": {
        "magnitude": 0.7,
        "score": 0.7
      }
    },
    {
      "text": {
        "content": "I think everyone should read it.",
        "beginOffset": 31
      },
      "sentiment": {
        "magnitude": 0.1,
        "score": 0.1
      }
    }
  ]
}

請注意,我們會提供兩種情緒值:整體的情緒與句子的情緒。情緒方法會傳回兩個值:scoremagnitudescore 是介於 -1.0 到 1.0 之間的數字,代表陳述式的正值或負數。magnitude 是介於 0 到 1 之間的數字,代表陳述式中表示的情緒權重,不論正值還是負數皆是如此。長篇幅較長的段落文字如果具有較高的幅度,我們的第一句分是正分(0.7),而第二句分是中性的(0.1)。

除了針對我們傳送給 NL API 的整份文字文件提供情緒詳細資訊,這個 API 也能細分文字中實體的情緒。我們以這個句子做為範例:

我喜歡壽司,但服務非常糟糕

在這種情況下,按照上文所述,取得完整句子的情緒分數可能就不實用。如果是某間餐廳評論,而同一間餐廳有數百則評論,我們想知道他們喜歡和不喜歡的評論中,有哪些不對。幸好,NL API 有一種方法,能讓我們透過文字 (analyzeEntitySentiment) 獲取每個實體的情緒。使用以上句子更新 request.json 以嘗試:

request.json

 {
  "document":{
    "type":"PLAIN_TEXT",
    "content":"I liked the sushi but the service was terrible."
  },
  "encodingType": "UTF8"
}

然後使用下列 curl 指令呼叫 analyzeEntitySentiment 端點:

curl "https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

在回應中,我們會傳回兩個實體物件:一個代表「壽司」,一個則代表「服務」。以下是完整的 JSON 回應:

{
  "entities": [
    {
      "name": "sushi",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.52716845,
      "mentions": [
        {
          "text": {
            "content": "sushi",
            "beginOffset": 12
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.9,
            "score": 0.9
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.9,
        "score": 0.9
      }
    },
    {
      "name": "service",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.47283158,
      "mentions": [
        {
          "text": {
            "content": "service",
            "beginOffset": 26
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.9,
            "score": -0.9
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.9,
        "score": -0.9
      }
    }
  ],
  "language": "en"
}

我們可以看到,“壽司”的得分返回;為 0.9,而“服務”為-0.9。太棒了!您可能也會注意到,每個實體會傳回兩個情緒物件。假如這些字詞提到上述任一字詞,API 會傳回各個提及者的情緒分數和規模,以及該實體的匯總情緒。

查看 Natural Language API 的第三種方法 (語法註解) 後,我們會深入探討文字的文字語言細節。analyzeSyntax 方法可針對文字的語意和語法元素提供完整的詳細資料。針對 API 中每個字詞,「API」會告訴我們詞性的一部分 (名詞、動詞、形容詞等),以及該文字與句子中其他字詞之間的關聯 (它是否為根動詞?修飾符?)。

我們用簡單的句子來試試吧!我們的 JSON 要求類似於上述要求,並新增功能鍵。這樣 API 就會知道要執行語法註解。請將 request.json 換成下列內容:

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content": "Hermione often uses her quick wit, deft recall, and encyclopaedic knowledge to help Harry and Ron."
  },
  "encodingType": "UTF8"
}

然後呼叫 API 的 analyzeSyntax 方法:

curl "https://language.googleapis.com/v1/documents:analyzeSyntax?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

回應應針對語句中的每個符記傳回類似下方的物件。這裡是查看「使用」這個字詞的回應:

{
  "text": {
    "content": "uses",
    "beginOffset": 15
  },
  "partOfSpeech": {
    "tag": "VERB",
    "aspect": "ASPECT_UNKNOWN",
    "case": "CASE_UNKNOWN",
    "form": "FORM_UNKNOWN",
    "gender": "GENDER_UNKNOWN",
    "mood": "INDICATIVE",
    "number": "SINGULAR",
    "person": "THIRD",
    "proper": "PROPER_UNKNOWN",
    "reciprocity": "RECIPROCITY_UNKNOWN",
    "tense": "PRESENT",
    "voice": "VOICE_UNKNOWN"
  },
    "dependencyEdge": {
      "headTokenIndex": 2,
      "label": "ROOT"
    },
    "lemma": "use"
}

我們來細分回應。partOfSpeech 會為每個字提供我們的詳細語言資訊 (其中許多人並不熟悉,因為此字詞並不適用於英文或這個特定字詞)。tag 代表這個詞的一部分,在這個案例中是動詞。我們也會針對時態、多樣性,以及字詞是否為單數或複數,提供詳細說明。lemma 是字詞的標準形式 (例如「使用」)。例如,runrunsrunrun 這兩個字詞都含有 run 的 lemma。lemma 值可用來追蹤特定字詞在一段時間內的一段時間內出現的情況。

dependencyEdge 包含可用來建立文字相依性剖析樹狀結構的資料。這張圖表顯示句子中的字詞彼此之間的關係。上述句子的相依性剖析樹狀結構如下所示:

上述回應中的 headTokenIndex 是符記索引,其中的弧形指向「用」符號。我們可以將句子中的每個符記視為陣列中的一個字詞,而 2 的 headTokenIndex 代表「用」;它代表「經常」一詞,且這個樹狀結構會連結至樹狀結構中。

Natural Language API 也支援英文以外的語言 (完整清單請見此處)。我們來試試下列實體要求,並搭配日文:

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"日本のグーグルのオフィスは、東京の六本木ヒルズにあります"
  },
  "encodingType": "UTF8"
}

請注意,我們並未向 API 說明該文字是什麼語言,所以可以自動偵測。接著,我們會傳送至 analyzeEntities 端點:

curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

以下是我們的回應中前兩個實體:

{
  "entities": [
    {
      "name": "日本",
      "type": "LOCATION",
      "metadata": {
        "mid": "/m/03_3d",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Japan"
      },
      "salience": 0.23854347,
      "mentions": [
        {
          "text": {
            "content": "日本",
            "beginOffset": 0
          },
          "type": "PROPER"
        }
      ]
    },
    {
      "name": "グーグル",
      "type": "ORGANIZATION",
      "metadata": {
        "mid": "/m/045c7b",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Google"
      },
      "salience": 0.21155767,
      "mentions": [
        {
          "text": {
            "content": "グーグル",
            "beginOffset": 9
          },
          "type": "PROPER"
        }
      ]
    },
    ...
  ]
  "language": "ja"
}

這個 API 會將日本擷取為位置,並以 Google 的身分擷取機構,並擷取各地區的維基百科頁面。

您已經學習如何使用 Cloud Natural Language API 擷取實體、分析情緒以及執行語法註解,藉此執行文字分析。

適用範圍

  • 建立 Natural Language API 要求並使用 curl 呼叫 API
  • 使用 Natural Language API 擷取實體並執行文字分析
  • 對文字執行語言分析,以建立相依性剖析樹狀結構
  • 建立日文版 Natural Language API 要求

後續步驟