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
サンプルコード
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.
がトークン分割され、名詞、動詞と品詞でラベル付けがされていることがわかります。また、スコア(信頼度)も確認できます。
PartOfSpeech の Tag についてまとめておきます。英語での説明はこちらの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を使用して構文解析をすることもできそうです。
またAmazon Comprehendの他の機能、キーフレーズ抽出
、感情分析
、エンティティ認識
、言語の検出
、トピックモデル
については以下ブログをご参考ください。