google colab利用備忘録 集計編
ついに効果を見せるとき
これまでにデータを集計してきたのを
おーすげー、とか役に立ちそう!という形にするには
データをエクセルに入れてピポットテーブルにすると
簡単に集計できます。
が
一応今回はgooglecolabを用いて一連の処理をこなせるようにしていく
というスキルアップのために勉強したり発信することを目的にしていたので
調べてたり試したりしました。
集計は素直にpandasを使った方がよいかと思いました。
最終的にはstringがさいつよ(私がさいよわ)。
目的
今まで集めたデータ内で歌われた回数が多い曲のTOP10を調べる
データセットにデータを入れてカウントして出力する。
ソースコード
googledriveへの接続は初回のおまじないを見ていただければと思います。
目的達成のためには考慮が必要なものが何点かあったので、そのいろいろは後述しますが、ひとまず今回の結果ソースコートはこちらになります。
import re
import pandas as pd
# データ元
input_file = "/content/drive/MyDrive/AI/youtube_come_T/timestamp_comme.txt"
# 除外ワードファイル
specific_file = "/content/drive/MyDrive/AI/youtube_come_T/specific_comme.txt"
# データの展開
with open(input_file, 'r') as file:
lines = file.readlines()
# 除外ワードファイルの展開
specific_words = []
with open(specific_file, 'r') as file_a:
for line_a in file_a:
specific_words.append(line_a.strip())
# 時間表記を削除するための正規表現パターン
time_pattern = r'\b\d{1,2}:\d{2}(:\d{2})?\b'
# 除外ワードや時間表記を取り除く
filtered_lines = []
for line_b in lines:
#時間表記の削除
line_c = re.sub(time_pattern, '', line_b)
# 特定の文字列が含まれていない行を filtered_lines に追加する
include_specific_string = False
for specific in specific_words:
if specific in line_c:
include_specific_string = True
break
if not include_specific_string:
filtered_lines.append(line_c.strip())
#集計用にDataFrameに変換する
df = pd.DataFrame({'Music Title': filtered_lines})
# データの個数をカウントしてTOP10を取得する
top10_title = df.value_counts().nlargest(10)
print(top10_title)
ローカル変数扱いで同じ変数名使いまわしてもいいはずなんだけど、理解を優先して別の変数名にしています。
結果としては以下の通り(データ取得してから時間たっているので計測したら変わってるかもしれません。)
Music Title
3876
Mata Ashita // Fuwari-P 96
またあした / ふわりP 94
Yozora ni Futatsu // koyori 46
またあした/ふわりP 42
夜空にふたつ / koyori 36
Tsuki no Waltz // Mio Isayama 34
Ao no Ether // Ranka Lee = Megumi Nakajima 30
Dried Flower // Yuuri 30
パレード / ヨルシカ 30
dtype: int64
ということで、よく歌われる曲「は」 なんとなくわかったところで表記ゆれ、重複カウントの問題が見つかりました。
そちらについては次回ということで。。。
除外ワードファイルの中身はこちら
曲名じゃないと思われるもので多数ヒットしてしまうものを別途用意しておく必要がありました。手作業がんばる。
୨୧
━━━━
オープニング
配信開始
最初の挨拶
初めの挨拶
終わりの挨拶
スパチャ読み
~トーク
~曲間
ミスしたソースコードや経緯
最初にこんなコードで行けるやろと簡単に作ったものはこちらです。
import pandas as pd
#データ元
input_file = "/content/drive/MyDrive/AI/youtube_come_T/timestamp_comme.txt"
#データとしては、csvっぽいが半角空白区切りでで取り出す
df = pd.read_csv(input_file,delimiter='\s+', header=None,usecols=[1])
# データの個数をカウントしてTOP10を取得する
top10_title = df.value_counts().nlargest(10)
print(top10_title)
結果
୨୧ 324
━━━━ 196
終わりの挨拶 170
~トーク2 164
~トーク1 162
~トーク3 156
~トーク4 140
初めの挨拶 140
~トーク5 132
~トーク6 128
dtype: int64
まあ そうですよね。汎用的な文言は排除しないといけないですね。
あと、時間表記が1カラム目と見立てていて、2カラム目以降を取り出したかったのに1カラム目のも含まれているし、空白を含むタイトルは切られてしまうなどの問題点がわかりました。
正直、重複削除は前回のコードも見直してやる必要があるかなー??
と思ったので次回に回します。
まずは 除外リストの行自体を削除、時間表記を削除すればよさそうということで前述のコードが完成しました。
課題
いろんな重複があるのでそこを直さないといけないですね。
「またあした/ふわりP」 と「またあした / ふわりP」と「Mata Ashita // Fuwari-P」って同じですもんね。
ここで日付を付けておいたのが生きてくるはず
この記事が気に入ったらサポートをしてみませんか?