GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Amazon Comprehend と Python で自然言語処理をしてみよう!

さて、本日は自然言語処理について書いてみようと思います。様々な自然言語処理サービスがありますが、今回は Amazon Comprehend を使ってみようと思います。このサービスを使うと簡単にテキストの感情分析などができるようになります。

Amazon Comprehendとは

Amazon Comprehend は、機械学習を使用して構造化されていないデータから情報を見つける自然言語処理 (NLP) サービスです。ドキュメントを詳細に調べる必要がなく、プロセスが簡単で、隠れている情報を容易に把握できます。(出典:AWS)

主な特徴

Amazon Comprehend には以下のような特徴があります。

キーフレーズ抽出

キーフレーズ抽出 API は、キーフレーズまたは会話のポイント、およびそれがキーフレーズであることを裏付ける信頼性スコアを返します。

感情分析

感情分析 API は、テキストの全体的な感情 (肯定的、否定的、中立的、または混在) を返します。

構文解析

Amazon Comprehend Syntax API を使用すれば、お客様は、トークン分割や品詞 (PoS) を使用してテキストを分析したり、テキスト内の名詞や形容詞などの単語境界やラベルを識別したりできます。

※2021/7/22で日本語未対応のため、本エントリーでは取り上げません。早く日本語対応になってほしいですね。

エンティティ認識

エンティティ認識 API は、提供されたテキストに基づいて自動的に分類される、名前付きエンティティ (「人」、「場所」、「位置」など) を返します。

言語検出

言語検出 API は、100 を超える言語で書かれたテキストを自動的に識別し、主要言語と、言語が主要であることを裏付ける信頼性スコアを返します。

関連エントリー

自然言語処理に関するエントリーです。興味のある方はぜひ読んでみてください。

www.gis-py.com

www.gis-py.com

使用するテキスト

富士通さんのTwitterアカウントのつぶやきを使用します。なぜ富士通さんかは秘密です。

f:id:sanvarie:20210722185101p:plain

テキスト内容

「明日は海の日ですね🌊⛵離れた場所から水中を体験することができる 水族館と教室を繋いだ #遠隔教育 をご紹介します✨5Gによる映像伝送や水中ドローンにVR技術などを活用し、校外学習に行かなくても子供たちはリアルタイムで #美ら海水族館 のサメを観察しました🙋」

環境

Windows10 64bit
Python3.6.6

サンプルコード

キーフレーズ抽出

import boto3

comprehend = boto3.client(service_name='comprehend', 
                                             region_name='ap-northeast-1',
                                             aws_access_key_id="***",
                                             aws_secret_access_key="***")

text = """明日は海の日ですね🌊⛵離れた場所から水中を体験することができる 水族館と教室を繋いだ 
          #遠隔教育 をご紹介します✨5Gによる映像伝送や水中ドローンにVR技術などを活用し、
          校外学習に行かなくても子供たちはリアルタイムで #美ら海水族館 のサメを観察しました🙋"""

result = comprehend.detect_key_phrases(Text = text, LanguageCode='ja')
for r in result["KeyPhrases"]:
    print(r)

このような結果になりました。スコアの高いキーフレーズを見ると確かにと思える結果ですね。

f:id:sanvarie:20210722190313p:plain

感情分析

import boto3

comprehend = boto3.client(service_name='comprehend', 
                                             region_name='ap-northeast-1',
                                             aws_access_key_id="***",
                                             aws_secret_access_key="***")

text = """明日は海の日ですね🌊⛵離れた場所から水中を体験することができる 水族館と教室を繋いだ 
          #遠隔教育 をご紹介します✨5Gによる映像伝送や水中ドローンにVR技術などを活用し、
          校外学習に行かなくても子供たちはリアルタイムで #美ら海水族館 のサメを観察しました🙋"""
 
result = comprehend.detect_sentiment(Text=text, LanguageCode='ja'),
for k, v in comprehend_result["SentimentScore"].items():
    print(f"    {k}: {v}")

今回選んだテキストは中立的な感情という結果になりました。

f:id:sanvarie:20210722190701p:plain

エンティティ認識

import boto3

comprehend = boto3.client(service_name='comprehend', 
                                             region_name='ap-northeast-1',
                                             aws_access_key_id="***",
                                             aws_secret_access_key="***")

text = """明日は海の日ですね🌊⛵離れた場所から水中を体験することができる 水族館と教室を繋いだ 
          #遠隔教育 をご紹介します✨5Gによる映像伝送や水中ドローンにVR技術などを活用し、
          校外学習に行かなくても子供たちはリアルタイムで #美ら海水族館 のサメを観察しました🙋"""

result = comprehend.detect_entities(Text=text, LanguageCode='ja')
for r in result["Entities"]:
    print(r)

以下のような単語た抽出されました。「ドローン」などもう少し多く抽出してほしいですね。

f:id:sanvarie:20210722204005p:plain

言語検出

import boto3

comprehend = boto3.client(service_name='comprehend', 
                                             region_name='ap-northeast-1',
                                             aws_access_key_id="***",
                                             aws_secret_access_key="***")

text = """明日は海の日ですね🌊⛵離れた場所から水中を体験することができる 水族館と教室を繋いだ 
          #遠隔教育 をご紹介します✨5Gによる映像伝送や水中ドローンにVR技術などを活用し、
          校外学習に行かなくても子供たちはリアルタイムで #美ら海水族館 のサメを観察しました🙋"""

result = comprehend.detect_dominant_language(Text = text)
print(result['Languages'])

日本語と判定されました。しかし、スコアは思ったよりも高くないですね。英文とかが混じった日本語とかの判断は難しそうですね。

f:id:sanvarie:20210722185330p:plain

さいごに

自分で自然言語処理などを開発しようとするとかなり大変だと思いますが、Amazon Comprehend を使えばそんな苦労をすることもなく簡単に実行できてしまいます。また、おそらく精度も相当高いと思われるのでテキストの感情分析などをしたいという案件が来た場合は開発するよりも Amazon Comprehend のようなサービスを使用するのがベターだと思います。本日は以上です。