AWS SDK for Python (Boto3)で Amazon Comprehend Syntax APIを使って構文解析をする

2018.09.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日Amazon Comprehend が構文解析をサポートされたと発表がありましたので、Python(Boto3)でAmazon Comprehend Syntax APIを使って構文解析をしてみました。

環境

$ pip list | grep boto3
boto3 1.9.2

サンプルコード

import boto3
import json

# Comprehend constant
REGION = 'us-west-2'


# Function for detecting Syntax
def detect_dominant_language(text, language_code):
    comprehend = boto3.client('comprehend', region_name=REGION)
    response = comprehend.detect_syntax(Text=text, LanguageCode=language_code)
    return response


def main():
    # text
    text = "Amazon Comprehend is a natural language processing (NLP) service that uses machine learning to find insights and relationships in text."

    # language code
    language_code = 'en'

    # detecting syntax
    result = detect_dominant_language(text, language_code)
    print(json.dumps(result, sort_keys=True, indent=4))


if __name__ == '__main__':
    main()

実行結果

{
"ResponseMetadata": {
"HTTPHeaders": {
"connection": "keep-alive",
"content-length": "2758",
"content-type": "application/x-amz-json-1.1",
"date": "Sat, 15 Sep 2018 15:39:54 GMT",
"x-amzn-requestid": "97a57618-b8fd-11e8-8d50-5551f060be2f"
},
"HTTPStatusCode": 200,
"RequestId": "97a57618-b8fd-11e8-8d50-5551f060be2f",
"RetryAttempts": 0
},
"SyntaxTokens": [
{
"BeginOffset": 0,
"EndOffset": 6,
"PartOfSpeech": {
"Score": 0.9970498085021973,
"Tag": "PROPN"
},
"Text": "Amazon",
"TokenId": 1
},
{
"BeginOffset": 7,
"EndOffset": 17,
"PartOfSpeech": {
"Score": 0.9976467490196228,
"Tag": "PROPN"
},
"Text": "Comprehend",
"TokenId": 2
},
{
"BeginOffset": 18,
"EndOffset": 20,
"PartOfSpeech": {
"Score": 0.9982584118843079,
"Tag": "VERB"
},
"Text": "is",
"TokenId": 3
},
{
"BeginOffset": 21,
"EndOffset": 22,
"PartOfSpeech": {
"Score": 0.9999969005584717,
"Tag": "DET"
},
"Text": "a",
"TokenId": 4
},
{
"BeginOffset": 23,
"EndOffset": 30,
"PartOfSpeech": {
"Score": 0.9993355870246887,
"Tag": "ADJ"
},
"Text": "natural",
"TokenId": 5
},
{
"BeginOffset": 31,
"EndOffset": 39,
"PartOfSpeech": {
"Score": 0.996455729007721,
"Tag": "NOUN"
},
"Text": "language",
"TokenId": 6
},
{
"BeginOffset": 40,
"EndOffset": 50,
"PartOfSpeech": {
"Score": 0.9889174699783325,
"Tag": "NOUN"
},
"Text": "processing",
"TokenId": 7
},
{
"BeginOffset": 51,
"EndOffset": 52,
"PartOfSpeech": {
"Score": 0.9999988079071045,
"Tag": "PUNCT"
},
"Text": "(",
"TokenId": 8
},
{
"BeginOffset": 52,
"EndOffset": 55,
"PartOfSpeech": {
"Score": 0.9151285290718079,
"Tag": "PROPN"
},
"Text": "NLP",
"TokenId": 9
},
{
"BeginOffset": 55,
"EndOffset": 56,
"PartOfSpeech": {
"Score": 0.9999597072601318,
"Tag": "PUNCT"
},
"Text": ")",
"TokenId": 10
},
{
"BeginOffset": 57,
"EndOffset": 64,
"PartOfSpeech": {
"Score": 0.9986529350280762,
"Tag": "NOUN"
},
"Text": "service",
"TokenId": 11
},
{
"BeginOffset": 65,
"EndOffset": 69,
"PartOfSpeech": {
"Score": 0.9936331510543823,
"Tag": "PRON"
},
"Text": "that",
"TokenId": 12
},
{
"BeginOffset": 70,
"EndOffset": 74,
"PartOfSpeech": {
"Score": 0.9999306201934814,
"Tag": "VERB"
},
"Text": "uses",
"TokenId": 13
},
{
"BeginOffset": 75,
"EndOffset": 82,
"PartOfSpeech": {
"Score": 0.9979239702224731,
"Tag": "NOUN"
},
"Text": "machine",
"TokenId": 14
},
{
"BeginOffset": 83,
"EndOffset": 91,
"PartOfSpeech": {
"Score": 0.7294206023216248,
"Tag": "VERB"
},
"Text": "learning",
"TokenId": 15
},
{
"BeginOffset": 92,
"EndOffset": 94,
"PartOfSpeech": {
"Score": 0.9947968125343323,
"Tag": "PART"
},
"Text": "to",
"TokenId": 16
},
{
"BeginOffset": 95,
"EndOffset": 99,
"PartOfSpeech": {
"Score": 0.9998737573623657,
"Tag": "VERB"
},
"Text": "find",
"TokenId": 17
},
{
"BeginOffset": 100,
"EndOffset": 108,
"PartOfSpeech": {
"Score": 0.9998371601104736,
"Tag": "NOUN"
},
"Text": "insights",
"TokenId": 18
},
{
"BeginOffset": 109,
"EndOffset": 112,
"PartOfSpeech": {
"Score": 0.9999772310256958,
"Tag": "CONJ"
},
"Text": "and",
"TokenId": 19
},
{
"BeginOffset": 113,
"EndOffset": 126,
"PartOfSpeech": {
"Score": 0.9998776912689209,
"Tag": "NOUN"
},
"Text": "relationships",
"TokenId": 20
},
{
"BeginOffset": 127,
"EndOffset": 129,
"PartOfSpeech": {
"Score": 0.9999299049377441,
"Tag": "ADP"
},
"Text": "in",
"TokenId": 21
},
{
"BeginOffset": 130,
"EndOffset": 134,
"PartOfSpeech": {
"Score": 0.9992431402206421,
"Tag": "NOUN"
},
"Text": "text",
"TokenId": 22
},
{
"BeginOffset": 134,
"EndOffset": 135,
"PartOfSpeech": {
"Score": 0.9999969005584717,
"Tag": "PUNCT"
},
"Text": ".",
"TokenId": 23
}
]
}

サンプルテキスト: Amazon Comprehend is a natural language processing (NLP) service that uses machine learning to find insights and relationships in text. がトークン分割され、名詞、動詞と品詞でラベル付けがされていることがわかります。また、スコア(信頼度)も確認できます。

PartOfSpeechTag についてまとめておきます。英語での説明はこちらのSyntaxをご参照してください。

|Token|Part of speech|意味| |:---:|:---:|:---:| |ADJ|Adjective|形容詞| |ADP|Adposition|設置詞| |ADV|Adverb|副詞| |AUX|Auxiliary|助動詞| |CONJ|Coordinating conjunction|等位接続詞| |DET|Determiner|限定詞| |INTJ|Interjection|感動詞(間投詞)| |NOUN|Noun|名詞| |NUM|Numeral|数詞| |O|Other|その他 POS(PartOfSpeec)に割り当てられなかった単語| |PART|Particle|助詞| |PRON|Pronoun|代名詞| |PROPN|Proper noun|固有名詞| |PUNCT|Punctuation|句読点| |SCONJ|Subordinating conjunction|従位接続詞| |SYM|Symbol|シンボル| |VERB|Verb|動詞|

note: Parts of Speech の意味については以下サイトを参考に確認しました。

Bilingual Grammar Glossary for Japan 英語文法用語

まとめ

Amazon Comprehendの構文解析は、テキストをトークン分割し、各単語に品詞をラベル付して分析することができます。

今回は、AWS SDK for Python (Boto3)からAmazon Comprehend Syntax APIを使って構文解析をしてみました。 前回、形態素解析エンジンMeCabをPython3で使用する方法をご紹介しましたが Amazon Comprehendで日本語がサポートされたら Amazon Comprehendを使用して構文解析をすることもできそうです。

Python3で形態素解析エンジンMeCabを使ってみた

またAmazon Comprehendの他の機能、キーフレーズ抽出感情分析エンティティ認識言語の検出トピックモデルについては以下ブログをご参考ください。

AWS SDK for Python(Boto3)を使用してAmazon Comprehendを操作する

参考URL