ツイートのキーワード分析で話題のネタをざっと見る

# はじめに

今回も[【Qiita x COTOHA APIプレゼント企画】COTOHA APIで、テキスト解析をしてみよう！](https://zine.qiita.com/event/collaboration-cotoha-api/?utm_source=qiita&utm_medium=banner)に関連して投稿してみます。COTOHA APIとは何か？については、[公式のページ](https://api.ce-cotoha.com/contents/index.html)からご確認ください。

前回[こんな記事](https://qiita.com/aoimidori/items/644ac0e726d60a99cc4a)を書いてMATLABからCOTOHA APIを触れるようになったので、今日は[キーワード抽出](https://api.ce-cotoha.com/contents/reference/apireference.html#keyword)のAPIを試してみたいと思います。今日は火曜日...Netflixでテラスハウスが更新される日...ということで、テラスハウスという単語をキーワードにしてツイートをざっと見てみます。今日も良い回でしたね。ネタバレしたくない人は以下閲覧されませんように。。

# 環境
MATLAB R2019b
Text Analytics Toolbox
Datafeed Toolbox

# やったこと

ざっと以下の3ステップを実施しました。1つずつ記載していきます。

①ツイートの取得
②キーワード抽出
③キーワードに関連するツイートの可視化

### ①ツイートの取得
#### Twitter developerアカウントの作成

まずは[@kngsym2018](https://qiita.com/kngsym2018)様の[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)という記事を参考にTwitterのDeveloperアカウントを作成しました。

API key、API secret key、Access token、Access token secretの4種類を入手できれば準備完了です。

#### ツイートの取得

[Datafeed Toolbox](https://jp.mathworks.com/products/datafeed.html)にTwitter用の関数があるようなのでそちらを使います。コードは下記。API key、API secret key、Access token、Access token secretには自身のものを入れましょう。

```matlab
consumerkey = 'input_your_consumerkey';
consumersecret = 'input_your_consumersecret ';
accesstoken = 'input_your_accesstoken';
accesstokensecret = 'input_your_accesstokensecret ';

c = twitter(consumerkey,consumersecret,accesstoken,accesstokensecret)
tweetquery = 'テラスハウス'; % 検索したいキーワードを入力
parameters.count = 100; % 取得するツイート数
d = search(c,tweetquery,parameters);

ssize = length(d.Body.Data.statuses);
for ii = 1:ssize
    tw{ii,1} = d.Body.Data.statuses{ii,1}.text; 
end
```

上のコードにもコメントを入れてますが、tweetqueryに「テラスハウス」と入れてみました。~~どんなツイートが取得できたでしょうか。試しに上から５つを表示させてみます。（ユーザー名は後からぼかしてます）~~→追記：勝手に引用するのが気が引けたので消しました。

```matlab
>> tw(1:5,:)

ans =

  5×1 の cell 配列

    {'ここに結果を書いてました'}
    {''}
    {''}
    {''}
    {''}
}
```

~~それっぽいツイートが取れていますね。~~

### ②キーワード抽出

では、上で取得したツイートを、COTOHAのキーワード抽出APIに入れてみましょう。コードは下記。取得した100個のツイート全てを丸ごとAPIに投げています。

```matlab
clientid = 'input_your_Client_ID';
clientsecret = 'input_your_Client_secret';

url = 'https://api.ce-cotoha.com/v1/oauth/accesstokens';
options = weboptions('RequestMethod','post', 'MediaType','application/json');
Body = struct('grantType', 'client_credentials', ... 
          'clientId', clientid, ...
          'clientSecret', clientsecret);
response = webwrite(url, Body, options);

accesstoken = response.access_token;
tweets = char(tw);
baseurl = 'https://api.ce-cotoha.com/api/dev/';
Header = {'Content-Type', 'application/json;charset=UTF-8'; 'Authorization', ['Bearer ' accesstoken]};
Body = struct('document', tweets, ... 
          'max_keyword_num', 10);
      
options = weboptions('RequestMethod','post', 'MediaType','application/json','HeaderFields', Header, 'Timeout',10);
response2 = webwrite([baseurl 'nlp/v1/keyword'], Body, options);
```

すると、response2のresultにはこんな結果が入っていました。「テラスハウス」で検索したから、キーワードもテラスハウスが上位に...そりゃそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/62a71558-8178-c7d3-9bac-91777be76cb8.png)


上記のキーワード・スコアを棒グラフで可視化させてみるとこんな感じになりました。コードも下に載せています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/5d4947a4-682e-841a-c731-259231e31324.png)



```matlab
keywordtable = struct2cell(response2.result);
bar(categorical(keywordtable(1,:)),cell2mat(keywordtable(2,:)));
jptime = datetime(d.Header(1,8).Value, 'Format', 'eee, dd MMM yyyy HH:mm:ss z', 'Locale', 'en_US', 'TimeZone', 'Asia/Tokyo'); % 日時を日本時間に変換
title(char(jptime))
```

### ③キーワードに関連するツイートの可視化
COTOHA APIでキーワードを抽出してみましたが、それぞれのキーワードを含むツイートで何が話されていたのか気になるので、取得してきた全ツイート（変数tw）を解析してみます。

まずは、それぞれのキーワードを含むツイートのインデックスを取得します。TFには0か1かの情報が入っています。

```matlab
for ii = 1:size(keywordtable,2)
    TF(ii,:) = contains(tw,keywordtable(1,ii));
end
```

次に、それぞれのキーワードを含むツイートをwordcloudで可視化させてみます。ただし、単純に可視化させると句読点だったり、「は」「が」のような副詞が一番多くなったりするので、Text Analytics Toolboxの[テキストクリーニング関数](https://jp.mathworks.com/help/textanalytics/ug/prepare-text-data-for-analysis.html)を複数駆使して前処理を行ってから可視化させました。ところどころTwitterアカウントが表示されたので黒塗りにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/186090b1-0449-a839-a9fe-b4771b2347ee.png)


YOUさんの着てる服が好みだったのでしょうか。また、メンバーの卒業や、新メンバーについても話題になっているようですね。
表示は以下のコードで行いました。

```matlab
figure;
for ii = 1:size(keywordtable,2)
    subplot(2,5,ii)
    documents = tokenizedDocument(tw(TF(ii,:),:));
    newDocuments = removeStopWords(documents);
    newDocuments = erasePunctuation(newDocuments);
    newDocuments = removeWords(newDocuments,["RT" "テラス" "ハウス"]); % 任意のワードの除去
    wordcloud(newDocuments);
    title(keywordtable(1,ii))
end
```

個人的には、えみかちゃんたちのあの幸せなシーンについてもっと盛り上がっていると思ったのですが。。
来週の火曜日はまた違う図が作成されるでしょうね。楽しみ。

# おわりに
「コロナ」「新型」でも同様のことを試してみたところ、こんな感じの結果でした。新型コロナウイルスと新型コロナウィルスが別ものとしてスコアリングされていますね。この辺の表記ゆれに対しての処理は未対応なのかしら。（最近出た言葉ですしね。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/a30d8bfe-09c7-e181-6459-6d7cafd1de37.png)

表記ゆれの処理については私も勉強中なので、COTOHA APIには今後も目が離せません！