wordcloudを使ってアプリレビューを可視化する

アプリをダウンロードするとき、まずそのアプリに投稿されているレビューを参考にする人は多いと思います。
でもレビューって数が多くて全部見るのは難しいですよね。
そこで今回は **wordcloud** という表現で、アプリのレビューをひとめでわかるように可視化してみたいと思います。

## wordcloudとは
ある文書中の出現する単語を様々な大きさ、色で表すことで、文書の特徴を一枚の画像に可視化したものです。

## レビューデータの収集
App Storeのアプリレビューは下記のURLに該当するアプリのIDを入れると、JSON形式で取得することができます。
https://itunes.apple.com/jp/rss/customerreviews/id=(アプリID)/page=1/json
今回はTwitterアプリを対象とします。IDは333903271です。
page=のあとの数字を変えることで、10ページ分まで取得することができます。

下記のスクリプトでアプリのレビューデータを取得します。

```python
import pandas as pd
import requests
import json

rss_url = 'https://itunes.apple.com/jp/rss/customerreviews/id={}/sortBy=mostRecent/page={}/json'
app_id = '333903271'

def get_reviews(url):
    """ 
    iOSレビュー取得のAPIレスポンスから[点数、タイトル、文章、名前]のリストを取得する
    """
    response = requests.get(url, timeout=3.5)
    response_json = json.loads(response.text)
    reviews = [[int(entry['im:rating']['label']), entry['title']['label'], entry['content']['label'], entry['author']['name']['label']]\
               for entry in response_json['feed']['entry']]
    return reviews    

review_list = []
# 1~10ページ分のレビューを収集
for i in range(1, 11): 
    page_url = rss_url.format(app_id, i)
    reviews = get_reviews(page_url)
    review_list += reviews

review_df = pd.DataFrame(review_list, columns=['point', 'title', 'review', 'name'])![twitter_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/8c3531e3-7cde-a60f-8d5d-d8acd8594c6b.png)

```

収集したデータはこんな感じ。

<img width="1115" alt="スクリーンショット 2020-06-28 17.36.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/56327923-fdce-6de8-15da-51e4d72d3377.png">


## WordCloudの作成
集めたレビューデータを元にwordcloud画像を作成します。
まず、形態素解析のためにいMeCabをインストールします。

```
$ brew install mecab
$ brew install mecab-ipadic
```

続いてpythonでwordcloudライブラリをインストールします。

```
$ pip install wordcloud
```

下記のスクリプトでwordcloudを作成できます。
日本語入力のために、実行環境での日本語フォントファイルのパスを指定してください。

```python
# 日本語用のフォントが格納されているパスを指定
FONT_PATH = '/System/Library/Fonts//ヒラギノ角ゴシック W3.ttc'

def prepare_word_list(words):
    """
    wodcloudに入力用の文字列を作成する
    
    Args:
        words([str]): 文章のリスト
        
    Retruns:
        str: 全単語から指定した品詞のみを抽出し、スペース区切りで結合した文字列
    """
    m = MeCab.Tagger('')
    parsed_words = []
    for word in words:
        items = [x.split('\t') for x in m.parse(word).splitlines()]
        for item in items:
            if item[0] == 'EOS' or item[0] == '':
                pass
            elif item[1].split(',')[0] in ["名詞", "形容詞", "動詞"]:
                parsed_words.append(item[0]) 

    return ' '.join(parsed_words)


def make_wordcloud(words, file_name):
    """
    入力した文章から、wordcloud画像ファイルを作成する。
    
    Args:
        words(str): スペース区切りで単語を結合した文字列
        file_name(str): 画像ファイル出力先のパス
        
    Returns:
        なし
    """
    parsed_words = prepare_word_list(words)
    wordc = wordcloud.WordCloud(
        font_path = FONT_PATH,
        background_color='white',
        contour_width=2,
        width=800,
        height=600,
    ).generate(parsed_words)
    
    wordc.to_file(file_name)


make_wordcloud(review_df['review'], './image/twitter_wordcloud.png')
```

完成したwordcloud画像がこちら！
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/56ff612c-b5df-1bc0-dc56-83baa7edebf1.png width=65%>

Twitter, アカウント、 凍結、　フォロー、　タイムライン、、、などtwitterらしいワードが並んでいますね。

## まとめ
iosアプリのレビューを可視化することができました。
大量の文書のイメージをクイックに捉えたい時にwordcloudは良いかもしれませんね。