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

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

環境

$ pip list | grep boto3
boto3              1.9.2

サンプルコード

実行結果

{
    "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