🌲

Slackチャットデータで共起ネットワーク分析を試す

に公開

この記事は2025 ZAICO アドベントカレンダーの2日目の記事です。

私が勤務する会社は、2016年の創業当時からリモートワークで、チャットツールはずっとSlackを利用しています。
チャットデータには歴史が詰まっており、いい感じに可視化したいと思って、様々取り組んでいます。
今回はSlackのチャットデータを使って、共起ネットワーク分析を試してみます。

共起ネットワークとは

共起ネットワークは、同じ文脈で一緒に使われる単語のつながりを可視化したものです。
例えば「バグ」と「修正」が同じメッセージで頻繁に登場すれば、それらは線で結ばれます。
これにより、チームで話題になっているトピックの関係性がわかります。

まずは、Slackデータの読み込み

https://ワークスペース名.slack.com/services/export

Slackのエクスポートデータは、チャンネルごとのディレクトリに日付別のJSONファイルとして保存されています。

今回は、月毎にどのような共起ネットワークが現れるか確認していくため、月毎にグルーピングします。

テキストの前処理

形態素解析

MeCabを使って文を単語に分割し、名詞のみを抽出します。
ただし以下は除外しています。

  • 非自立名詞(「こと」「もの」など)
  • 代名詞、数詞、接尾辞

ストップワード

分析のノイズになる一般的な語を定義して除外します。

STOP_WORDS = frozenset({
    'これ', 'それ', 'あれ', 'この', 'その', ...
    '確認', 'お願い', '手隙', '修正', '対応', ...  # 業務でよく使う一般語も除外
})

共起のカウント

共起分析の核心部分です。以下の手順で単語ペアをカウントします。

  1. 頻出上位50語のみを分析対象にする
  2. 各メッセージ内で、対象単語のすべてのペアをカウント
  3. 順序を正規化する(「A-B」と「B-A」を同一視)
  4. 5回以上出現したペアのみをカウント

頻出上位の語数や、出現回数は適宜調整するといいみたいです。

ネットワークの可視化

NetworkXでグラフ構造を構築し、Matplotlibで描画します。

  • ノードサイズ: 単語の出現頻度に比例
  • エッジの太さ: 共起回数に比例

結果

上手く行った結果だけ載せます。
2024年9月のチャットデータを対象にしたものです。
「バリエーション」「期限切れ」など、他の年度には見られない特徴的な単語が出現しています。
そうでした。このときバリエーション機能をリリースしたんでした。

このように特徴的な結果が見えると面白いですが、現実はなかなか上手くいかないものです。
精度を高めたり、他のアプローチで探ってみたり、また色々試したいと思います。

今回作成したスクリプト

https://github.com/gununu1028/practice-text-mining

2025 ZAICO アドベントカレンダーやってます。次回の担当はいうちくんさんです!楽しみですねぇ!

ZAICO Developers Blog

Discussion