Notionで書いた日記を感情分析してみる

# 初めに
開発部サーバーサイドエンジニアチームのnagaiと申します。
こちらは、トラストバンク Advent Calendar 2022 の15日目の記事です。
私は入社してまだ２か月ですが、担当しているシステムが大きく、全体を把握できずに右往左往しております。
今回、15日目の記事を任されたので、頑張って書いていきます！よろしくお願いします。



# Notionというすごいアプリケーション

皆様はNotionというアプリケーションをご存じでしょうか？
私はトラストバンクに入社して、初めてNotionというアプリケーションを知りました。
簡単に言うとすごいドキュメント管理アプリです。※ドキュメント管理以外も色々できます！

入社後初めてNotionを使った感想は、今までWindows explorerを嗜んできた私からすると、
どこにドキュメントがあるかわからない、フォルダ階層表示できないかな・・・とネガティブな感じだったのですが、現在は立派なNotionerとなっております。

Notionのすごいところは、ドキュメントをデータベースという形でリレーションできるところかと思います。
リレーションによって、ドキュメントが紐づけられているので必要な情報を簡単に見つけられるんですね。（基本テキストなので検索もしやすい）
個人的には議事録のテンプレート機能がお気に入りです。
議事録作成ボタンを押せば、テンプレート入り議事録ページが簡単作成！プロジェクトを紐づければ終わりです。

**「さぁ、今から議事録を作るから前の議事録をコピペして、いらない情報を消して、プロジェクトフォルダに置いてっと。・・・あ、日付がコピペのままだった・・・」**
等と皆様も経験はあると思いますが、私はもうそんな失敗をすることがありません。

# NotionのデータをAPIで取得する
そんなNotionですが、ググってたらNotionのデータベースをapiで取得できることがわかりました。
せっかくですので、個人的にNotionで書いている私の日記をapiを使って取得してみようと思います。
ただ、取得するのもつまらないので、AWSのComprehendというAIツールを使って、日記の内容を感情分析した結果もつけてみます。

## 構成
NodejsでNotionから日記データを取得して、取得した日記の内容をAWSの感情分析にかけて内容を表示する構成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/82688e67-b8cf-4365-2021-79a6656526cb.png)

# Notion APIのセットアップ

まずはNotion APIを利用するためのトークンを発行します。
私は以下のドキュメントを参考にしました。

https://www.notion.so/ja-jp/help/create-integrations-with-the-notion-api

### インテグレーションの作成

Notionの左側のナビの設定をクリックします。
コネクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/b3698450-66bf-10ee-faea-ad0847410386.png)

「新しいインテグレーションを作成する」クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/6c4441ac-b630-94c5-8578-777b8e32c3a2.png)

名前欄に任意の名前を入力します。（今回はdialy textとしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/a350a4ed-517a-cf06-2dbf-53a1f8ddd4ce.png)

今回はコンテンツ機能は取得のみですので、「コンテンツを読み取る」のみ選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/2d24dd7d-3929-bc27-6549-4af450224e5a.png)

一番下の送信ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/7effb76f-8917-549a-459c-d1babd28c57b.png)

発行されたトークンが表示されますので、**必ず保管**しておいてください。

### トークンとデータベースの紐づけ
発行したトークンで特定のデータベースにアクセスするために、データベースと紐づけを行います。
まずNotionの私の日記データベースをブラウザで表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/0d9748d8-4802-7d8a-316d-73bf5fefdaab.png)

画面右上の「・・・」から「コネクトの追加」を選択します。
先ほど作成したインテグレーションがありますので、選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/5af17a94-53bd-53da-b540-1ca0c783ddfe.png)

### データベースIDの取得
データベースIDも必要になりますので**必ず保管**しておいてください。
データベースIDはデータベースページのURLから取得できます。

    https://www.notion.so/88400d98a******************?v=83****************************f5d

上記URLの場合は**884～から?の手前まで**がデータベースIDになります。

Notionの設定は以上です。

# AWSの設定

### CLIユーザーの作成
AWSのコンソールで、ComprehendFullAccessのポリシーを持ったCLIユーザーを作成してください。
作成後はcredentials.csvをダウンロードしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954569/89492a6e-a4be-3415-cacb-9330e97bc6e0.png)

AWSの設定は以上です。


# nodejsの実装
最後にNodejsでプログラムを作成します。

### Nodejs実行環境
    
    // nodejs バージョン
    v16.18.1
    // npmのバージョン
    8.19.2

### プロジェクト作成
任意の場所にディレクトリを作ります。

    mkdir comprehend

作成したディレクトリ内で以下を実行します。

    npm init
    npm install aws-sdk @notionhq/client


### 接続のプログラムを作成

    touch notiontest.js

作成したnotiontest.jsにプログラムを書いていきます。

### module読み込み、API設定

    const AWS = require('aws-sdk');
    const { Client } = require("@notionhq/client");
    
    // キー設定
    const AWS_ACCESS_KEY_ID='credentials.csvのアクセスキー';
    const AWS_SECRET_ACCESS_KEY='credentials.csvのシークレットキー';
    const AWS_REGION='credentials.csvのリージョン';
    const NOTION_ACCESS_KEY='Notionの発行したトークン';
    const NOTION_DATABASE_ID='日記データベースのID';

### AWS接続

    // Comprehend
    AWS.config.update({
      accessKeyId: AWS_ACCESS_KEY_ID,
      secretAccessKey: AWS_SECRET_ACCESS_KEY,
      region: AWS_REGION
    })
    const comprehend = new AWS.Comprehend();
    const detectSentiment = (text) => {
      const params = {
        LanguageCode: 'ja', 
        Text: text
      }
    
      return new Promise((resolve, reject) => {
        comprehend.detectSentiment(params, (err, res) => {
          if ( err ) {
            console.log(err);
            reject(err);
            return;
          }
          resolve(res.Sentiment);
        })
      })
    }

### Notion接続
    // Notionデータ取得
    const getdialies = async () => {
      // データベースID 
      const databaseId = NOTION_DATABASE_ID;
    
      const notion = new Client({
      auth: NOTION_ACCESS_KEY,
      })
        
      const response = await notion.databases.query({ 
        database_id: databaseId,
        sorts: [
          {
            property: "日付",
            direction: "ascending",
          }
        ]
      });
      return response.results;
    }

### 実行部分

    // main
    const main = async () => {
      // Notionから日記取得
      const dialies = await getdialies();
      for(let elm of dialies) {
        const diary_date = elm.properties.日付.date.start;
        const diary_text = elm.properties.日記.title[0].text.content;
        // 日記の解析結果
        const ret = await detectSentiment(diary_text);
        console.log("(・ω・)" + "< " + ret + " : " + diary_date + " : " + diary_text);
      }
    }
    
    main();

以上です。
### 実行結果

    $ node notiontest.js
    (・ω・)< POSITIVE : 2022-12-11 : 今日はとても忙しかったです。だけどいっぱい仕事が終わって嬉しかったです！
    (・ω・)< NEGATIVE : 2022-12-12 : 朝から頭が痛くて、一日中憂鬱でした。気圧の変化のせいかなぁ・・・
    (・ω・)< MIXED : 2022-12-13 : 午前中はちょっと進みが遅かったけど、午後になってからは順調に仕事がこなせました！
    (・ω・)< POSITIVE : 2022-12-14 : 年末はとても忙しくなります。SREの方がslack上で年末対応で盛り上がってました。絶対に止めないという気持ちが伝わってきて、とても頼もしかったです。
    (・ω・)< POSITIVE : 2022-12-15 : 夕焼けって幻想的ですよね。子供の頃も通っていた道を夕暮れ時に歩くと、あの頃ってどういう気持ちでこの道歩いてたのかな？ってふと思う時があります。
    (・ω・)< MIXED : 2022-12-16 : 悲しみや憤り、そして楽しかったこともつらかったことも乗り越えてとうとう金曜日がやってきた。

１行ずつ取得してペコペコ表示されました。
なんということでしょう。私の思いをつづった日記が取得され、感情が英単語一つで見事に~~片付けられ~~、まとめられました。

行の表示内容ですが行頭のPOSITIVEとかが感情分析結果で、それ以降が日記の情報となっています。

# AWS Comprehend

AWS Comprehend APIでは、実際にはこんなデータが取得できます。

    {
      Sentiment: 'POSITIVE',
      SentimentScore: {
        Positive: 0.9837326407432556,
        Negative: 0.00022055386216379702,
        Neutral: 0.000659584766253829,
        Mixed: 0.015387212857604027
      }
    }

SentimentScoreは以下の表のとおりです。

|SentimentScore  |意味  |説明  |
|---|---|---|
|Positive  |肯定的  |このテキストは、全体的にポジティブな感情を表しています。  |
|Negative  |否定的  |テキストは全体的に否定的な感情を表しています。  |
|Neutral  |混成  |テキストは肯定的な感情と否定的な感情の両方を表しています。  |
|Mixed  |普通  |テキストは肯定的な感情も否定的な感情も表していません。  |

SentimentはSentimentScoreで一番高いものが表示されるようです。
もうちょっと正確に見たいときは、SentimentScoreを見た方がいいですね。

https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/how-sentiment.html

AWSのNLPサービスでは、この他にもエンティティ分析やキーフレーズ抽出ができるようで、どのようなフレーズが利用されているか等も分析ができます。
当社では日々お客様の声を多くいただいていますので、そのような声を分析できるとカスタマーサクセスが捗るように感じました。

また、開発部ではグループで毎日の独り言というか思っていることを書き溜めているので、いつもつらそうにしている人をキャッチアップできるかもです（笑）

感情分析のAPIはAWSのComprehend以外にもあるようです。（喜怒哀楽とかも分類できるものもあるらしいです）

https://gaaaon.jp/blog/mlask

# 最後に
Notionは本当に便利で、多分ものすごい効率化ができるアプリケーションです。
ただ、何でもできる反面、設計といったレベルのNotionの作り方が必要となってくると思います。
トラストバンクでもNotionの使い方がどんどん成熟していくと思いますので、とても楽しみにしています！

トラストバンクでは一緒に活躍いただけるエンジニアを募集中です。

https://www.wantedly.com/companies/trustbank/projects