Amazon Comprehend を利用して、Twitter から読者の主要言語を解析 #reinvent

ども、藤本です。

AWS re:Invent 2017 にて自然言語処理(Natural Language Processing)サービスの Amazon Comprehend がリリースされました。Amazon Comprehend に関しては下記エントリにまとめてみました。

自然言語処理サービスの Amazon Comprehend についてまとめてみた #reinvent

使ってみて何かスゴいな、という印象は受けるのですが、じゃあ実際に何ができるのでしょうか?ユースケースを考えてみて実装してみました。

前回は感情の検出を利用して、Twitter からエゴサーチしてみました。

https://dev.classmethod.jp/cloud/aws/amazon-comprehend-egosearch-from-twitter/

概要

Amazon Coprehend はドキュメントから主要言語の解析を行うことができます。この主要言語の検出を利用して、Twitter のツイートからどういう言語でツイートされているのか見てみましょう。

dev.classmethod.jpで検索した直近1,000件のツイートを抽出し、それぞれ言語の検出を行い、言語毎のパーセンテージの算出を行います。読者の層が分かりますね。

簡単に図示すると↓のようなイメージ。

まぁ、前回の実装のほぼ使いまわしですw

読者の主要言語を解析してみた

環境

  • 端末:Macbook
  • 言語:Python
  • Python:3.6.1
  • Boto3:1.4.8
  • Botocore:1.8.6
  • Twitter SDK:python-twitter

ソースコード

ブログ最下部にもソースコードを張り付けています。

実行

1
2
3
4
5
6
$ ./language.py
ja : 99.1%
zh-TW : 0.2%
zh : 0.0%
en : 0.6%
id : 0.1%

弊社ブログなのでほぼ日本語ですね。続いて、英語、中国語、インドネシア語? 信頼度となるスコアを集計しているので各言語の低信頼度となるスコアを拾ったのかもしれません。

まとめ

いかがでしたでしょうか? ビジネスに結びつけるのは難しいかもしれませんが、アイデア次第では色々とできそうな気がします。

ソースコード

#!/usr/bin/env python
import twitter
import boto3
import os
keyword = 'dev.classmethod.jp'
region = 'us-east-1'
size = 10 * 100
def get_tweet_texts():
api = twitter.Api(consumer_key=os.environ['consumer_key'],
consumer_secret=os.environ['consumer_secret'],
access_token_key=os.environ['access_token_key'],
access_token_secret=os.environ['access_token_secret'],
sleep_on_rate_limit=True)
maxid = None
corpus = []
for i in range(int(size/100)):
results = api.GetSearch(term=keyword,result_type='recent',count=100,max_id=maxid)
maxid = min([result.id for result in results]) - 1
corpus.extend(results)
return corpus
def detect_language(corpus):
comprehend = boto3.client('comprehend', region_name=region)
batch_size = 25
result = {}
for tweets in [corpus[i:i+batch_size] for i in range(0, len(corpus), batch_size)]:
language_results = comprehend.batch_detect_dominant_language(
TextList=[tweet.text for tweet in tweets]
)
for languages in language_results['ResultList']:
for language in languages['Languages']:
code = language['LanguageCode']
score = language['Score']
result[code] = result[code] + score if result.get(code) else score
return result
def stdout(result):
sum_score = sum([value for key, value in result.items()])
[print('{} : {:.1f}%'.format(code, round(score/sum_score*100, 1))) for code, score in result.items()]
def main():
corpus = get_tweet_texts()
result = detect_language(corpus)
stdout(result)
if __name__ == '__main__':
main()