📑

[Python]Slackで一番利用されている絵文字はなにか調べる

2024/07/09に公開

やりたいこと

Slackのパブリックチャンネルで一番使われている絵文字は何か知りたい。
((ついでにPythonはどんなもんか知りたい))

準備すること

管理者に頼んで、パブリックチャンネルのJSONファイルをいただく。

https://slack.com/intl/ja-jp/help/articles/201658943-ワークスペースのデータをエクスポートする

参考にした記事

https://www.estie.jp/blog/entry/2021/12/01/100000

APIを利用する方法は、有識者ではない場合管理者と密なやり取りをする必要があるため繁忙期におすすめできないです。

コード

# Jsonモジュール
import json
# globモジュール
import glob

# 指定したパスに一致するすべてのファイル名をリスト化して取得
json_files = glob.glob("./[フォルダ名]/*/*.json")

# 初期化
emojis = {}

# jsonファイルリストに対してループを回す
for file in json_files:

    # JSONファイルを読み込みモードで開く エンコード指定
    json_open = open(file, 'r', encoding='utf-8')
    # jsonファイルをPythonの辞書として読み込み
    json_load = json.load(json_open)

    # メッセージループ
    for message in json_load:
        # メッセージがリアクションを含んでいたら
        if "reactions" in message:
            # リアクションに対してループ
            for reaction in message["reactions"]:
                # 絵文字がすでに辞書に存在する場合
                if reaction["name"] in emojis:
                    # +1
                    emojis[reaction["name"]] += reaction["count"]
                else:
                    # 絵文字が辞書にない場合は追加する
                    emojis[reaction["name"]] = reaction["count"]

# 絵文字を出現回数順にソートして上位10件を取得する
emojis_sorted = sorted(emojis.items(), key=lambda x:x[1], reverse=True)[:10]

print(emojis_sorted)

globジュールとは

ディレクトリ内のファイル名を一覧表示してくれる

ランキング結果

番外編

ちょっと調べてみたところ、グラフのライブラリがあるみたいなので使ってみました

matplotlibライブラリを使用してみた。

Mu Editorを使用している人はパソコンに搭載されているターミナルではなく、Mu Editor内でインストールする必要があります。お気を付けください。(私はこの作業に3時間ほど振り回されました)

 import matplotlib.pyplot as plt
ModuleNotFoundError: No module named 'matplotlib'

パッケージをインストールする

pip install matplotlib

コードを付け加える

# ここにコードを書いてね :-)
import matplotlib.pyplot as plt
import json
import glob


# 読み込む日毎で別れたjsonファイル一覧をリストにする
json_files = glob.glob("./salto/*/*.json")

emojis = {}

# jsonファイルリストに対してループを回して各ファイルに処理を行う
for file in json_files:

    json_open = open(file, 'r', encoding='utf-8')
    json_load = json.load(json_open)

    for message in json_load:
        if "reactions" in message:
            for reaction in message["reactions"]:
                # 集計リストに追加
                if reaction["name"] in emojis:
                    emojis[reaction["name"]] += reaction["count"]
                else:
                    emojis[reaction["name"]] = reaction["count"]

# 集計リストをカウント数で並び替え、上位100位を取得する
emojis_sorted = sorted(emojis.items(), key=lambda x:x[1], reverse=True)[:10]

print(emojis_sorted)

# 絵文字とその出現回数をリストに分ける
emoji_names = [emoji[0] for emoji in emojis_sorted]
emoji_counts = [emoji[1] for emoji in emojis_sorted]

# バープロットを作成
plt.barh(emoji_names, emoji_counts, color='skyblue')

plt.xlabel('出現回数')  # x軸のラベル
plt.ylabel('絵文字')  # y軸のラベル
plt.title('絵文字の出現回数')  # グラフのタイトル

plt.show()  # グラフを表示

グラフ

文字化けしてしまう。。。

文字化けの原因

どうやらデフォルトのフォントが日本語に対応していないのが原因らしい。
ということで。フォント指定します。

修正

フォント指定後
# ここにコードを書いてね :-)
import matplotlib.pyplot as plt
import json
import glob
# フォント指定
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 読み込む日毎で別れたjsonファイル一覧をリストにする
json_files = glob.glob("./salto/*/*.json")

emojis = {}

# jsonファイルリストに対してループを回して各ファイルに処理を行う
for file in json_files:

    json_open = open(file, 'r', encoding='utf-8')
    json_load = json.load(json_open)

    for message in json_load:
        if "reactions" in message:
            for reaction in message["reactions"]:
                # 集計リストに追加
                if reaction["name"] in emojis:
                    emojis[reaction["name"]] += reaction["count"]
                else:
                    emojis[reaction["name"]] = reaction["count"]

# 集計リストをカウント数で並び替え、上位100位を取得する
emojis_sorted = sorted(emojis.items(), key=lambda x:x[1], reverse=True)[:10]

print(emojis_sorted)

# 絵文字とその出現回数をリストに分ける
emoji_names = [emoji[0] for emoji in emojis_sorted]
emoji_counts = [emoji[1] for emoji in emojis_sorted]


# フォントのパスを指定(パスは媒体によって違います。コントロールパネルがフォントのプロパティを開きパスを確認してください)
font_path = 'C:\Windows\Fonts\meiryo.ttc'  # Meiryoフォントのパス
font_prop = fm.FontProperties(fname=font_path)
# バープロットを作成
plt.barh(emoji_names, emoji_counts, color='skyblue')

plt.xlabel('出現回数', fontproperties=font_prop)  # x軸のラベル
plt.ylabel('絵文字', fontproperties=font_prop)  # y軸のラベル
plt.title('絵文字の出現回数', fontproperties=font_prop)  # グラフのタイトル

plt.show()  # グラフを表示

color=''の部分を変えることで他の色も指定できます。

グラフを降順にする

グラフを降順にする
# ここにコードを書いてね :-)
import matplotlib.pyplot as plt
import json
import glob

# フォント指定
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 読み込む日毎で別れたjsonファイル一覧をリストにする
json_files = glob.glob("./salto/*/*.json")

emojis = {}

# jsonファイルリストに対してループを回して各ファイルに処理を行う
for file in json_files:

    json_open = open(file, "r", encoding="utf-8")
    json_load = json.load(json_open)

    for message in json_load:
        if "reactions" in message:
            for reaction in message["reactions"]:
                # 集計リストに追加
                if reaction["name"] in emojis:
                    emojis[reaction["name"]] += reaction["count"]
                else:
                    emojis[reaction["name"]] = reaction["count"]

# 集計リストをカウント数で並び替え、上位100位を取得する
emojis_sorted = sorted(emojis.items(), key=lambda x: x[1], reverse=True)[:10]

print(emojis_sorted)

# 絵文字とその出現回数をリストに分ける
emoji_names = [emoji[0] for emoji in emojis_sorted]
emoji_counts = [emoji[1] for emoji in emojis_sorted]


# フォントのパスを指定
font_path = "C:\Windows\Fonts\meiryo.ttc"  # Meiryoフォントのパス
font_prop = fm.FontProperties(fname=font_path)
# バープロットを作成
plt.barh(emoji_names, emoji_counts, color="yellow")

plt.xlabel("利用回数", fontproperties=font_prop)  # x軸のラベル
plt.ylabel("絵文字", fontproperties=font_prop)  # y軸のラベル
plt.title("絵文字の出現回数", fontproperties=font_prop)  # グラフのタイトル
plt.gca().invert_yaxis()  # y軸を反転(降順に)
plt.show()  # グラフを表示

Discussion