Slackチャットデータで共起ネットワーク分析を試す
この記事は2025 ZAICO アドベントカレンダーの2日目の記事です。
私が勤務する会社は、2016年の創業当時からリモートワークで、チャットツールはずっとSlackを利用しています。
チャットデータには歴史が詰まっており、いい感じに可視化したいと思って、様々取り組んでいます。
今回はSlackのチャットデータを使って、共起ネットワーク分析を試してみます。
共起ネットワークとは
共起ネットワークは、同じ文脈で一緒に使われる単語のつながりを可視化したものです。
例えば「バグ」と「修正」が同じメッセージで頻繁に登場すれば、それらは線で結ばれます。
これにより、チームで話題になっているトピックの関係性がわかります。
まずは、Slackデータの読み込み
https://ワークスペース名.slack.com/services/export

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

今回は、月毎にどのような共起ネットワークが現れるか確認していくため、月毎にグルーピングします。
テキストの前処理
形態素解析
MeCabを使って文を単語に分割し、名詞のみを抽出します。
ただし以下は除外しています。
- 非自立名詞(「こと」「もの」など)
- 代名詞、数詞、接尾辞
ストップワード
分析のノイズになる一般的な語を定義して除外します。
STOP_WORDS = frozenset({
'これ', 'それ', 'あれ', 'この', 'その', ...
'確認', 'お願い', '手隙', '修正', '対応', ... # 業務でよく使う一般語も除外
})
共起のカウント
共起分析の核心部分です。以下の手順で単語ペアをカウントします。
- 頻出上位50語のみを分析対象にする
- 各メッセージ内で、対象単語のすべてのペアをカウント
- 順序を正規化する(「A-B」と「B-A」を同一視)
- 5回以上出現したペアのみをカウント
頻出上位の語数や、出現回数は適宜調整するといいみたいです。
ネットワークの可視化
NetworkXでグラフ構造を構築し、Matplotlibで描画します。
- ノードサイズ: 単語の出現頻度に比例
- エッジの太さ: 共起回数に比例
結果
上手く行った結果だけ載せます。
2024年9月のチャットデータを対象にしたものです。
「バリエーション」「期限切れ」など、他の年度には見られない特徴的な単語が出現しています。
そうでした。このときバリエーション機能をリリースしたんでした。

このように特徴的な結果が見えると面白いですが、現実はなかなか上手くいかないものです。
精度を高めたり、他のアプローチで探ってみたり、また色々試したいと思います。
今回作成したスクリプト
2025 ZAICO アドベントカレンダーやってます。次回の担当はいうちくんさんです!楽しみですねぇ!
Discussion