Amazon Comprehend を利用して、Twitter から読者の主要言語を解析 #reinvent
ども、藤本です。
AWS re:Invent 2017 にて自然言語処理(Natural Language Processing)サービスの Amazon Comprehend がリリースされました。Amazon Comprehend に関しては下記エントリにまとめてみました。
使ってみて何かスゴいな、という印象は受けるのですが、じゃあ実際に何ができるのでしょうか?ユースケースを考えてみて実装してみました。
前回は感情の検出を利用して、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() |