3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

トラストバンクAdvent Calendar 2022

Day 15

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

Last updated at Posted at 2022-12-14

初めに

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

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

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

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

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

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

NotionのデータをAPIで取得する

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

構成

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

image.png

Notion APIのセットアップ

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

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

Notionの左側のナビの設定をクリックします。
コネクトを選択します。
image.png

「新しいインテグレーションを作成する」クリックします。
image.png

名前欄に任意の名前を入力します。(今回はdialy textとしています)
image.png

今回はコンテンツ機能は取得のみですので、「コンテンツを読み取る」のみ選択しています。
image.png

一番下の送信ボタンを押します。
image.png

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

トークンとデータベースの紐づけ

発行したトークンで特定のデータベースにアクセスするために、データベースと紐づけを行います。
まずNotionの私の日記データベースをブラウザで表示します。
image.png

画面右上の「・・・」から「コネクトの追加」を選択します。
先ほど作成したインテグレーションがありますので、選択します。
image.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

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 : 悲しみや憤り、そして楽しかったこともつらかったことも乗り越えてとうとう金曜日がやってきた。

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

行の表示内容ですが行頭の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を見た方がいいですね。

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

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

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

最後に

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

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?