乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

非常に素晴らしいピアニストの動画を見つけてしまったので
コメントを集計したいと思いまーす。

解説動画はこちら







さて今回集計する動画チャンネルは
PanPiano

こちらは2016年くらいから活動されているようですね。

2020/04/19現在で
登録者数50万人弱
再生回数も6千万回弱
と非常に人気のあるピアニストさんのようですね。

コメントの集計の方法は
1.Youtubeの動画のページをスクロールして
コメント表示させてから保存 

2.BeautifulSoupでHTMLの中から
コメントの部分だけ拾い上げる

3.単語に分割して集計する

となります。


ライブラリやファイルの読み込み

下記のようなコードで実現できます。
事前にHTMLファイルをフォルダに格納しておきましょう。
import glob
from bs4 import BeautifulSoup
from janome.tokenizer import Tokenizer
t = Tokenizer()

result_list = []
for file_path in glob.glob('panpiano/panpiano*.htm'):
    with open(file_path) as _f:
        html = _f.read()
        soup = BeautifulSoup(html ,'lxml')
        contents = soup.find_all('div',id='contents')
        for content in contents:
                ytds = content.find_all('ytd-comment-thread-renderer')
                for ytd in ytds:
                    span1 = ytd.find('span',class_="style-scope ytd-comment-renderer")
                    name = span1.text.replace('\n','').replace(' ','') if span1 is not None else ''
                    span2 = ytd.find('span',id="vote-count-middle")
                    high = span2.text.replace('\n','').replace(' ','') if span2 is not None else '0'
                    high = int(high)
                    come1 = ytd.find('yt-formatted-string', id="text")
                    rep = come1.text.replace(' 件の返信を表示','').replace(' ','') if come1 is not None else ''
                    come2 = ytd.find('div',id="content", class_="style-scope ytd-expander")
                    com = come2.text.replace('\n','').replace(' ','') if come2 is not None else ''
                    tmp = [name,high,rep,com]
                    result_list.append(tmp)

これでコメント部分を抜き出せました。

次は単語に分割して集計をします。
calc_dict = {}
for i,row in enumerate(result_list):
    for token in t.tokenize(row[3]):
        p = token.part_of_speech
        if not p.startswith('記号') and not 'サ変接続' in p:
            if any([p.startswith('名詞'),p.startswith('動詞'),'形容詞' in p]):
                #print(token)
                key = token.surface
                if key in calc_dict:
                    calc_dict[key] += 1
                else:
                    calc_dict[key] = 1

名詞、動詞、形容詞だけ集計しました。
結果を見てみると・・・
for i,(k,v) in enumerate(sorted(calc_dict.items(),reverse=True,key=lambda x:x[1])):
    print(v,k)
    if i>30:
        break
122 し
115 ピアノ
97 胸
69 見
68 の
67 ん
67 乳
63 おっぱい
63 てる
51 いい
51 人
48 れ
47 動画
44 欄
42 曲
39 て
38 き
38 さ
37 目
36 い
35 コメ
33 ある
33 ラピュタ
32 好き
32 私
27 する
27 さん
26 いる
26 素晴らしい
26 空
25 これ
24 音色

ピアニストらしく、単語にピアノとか入っていますねーー
でも、上位には何かもやもやする単語が多く感じられますね。

じゃあ
コメントそのものを見てみましょう。

for row in sorted(result_list,key=lambda x: x[1],reverse=True):
    print(row[1],'\t',row[3])
    if row[1]<100: 
        break
2606 全然この動画に関係ないことですが、ピアノもお上手なんですね!!
2080 すまんが、その胸をしまってくれんか…ワシには強すぎる…
1880 「そんなに形にこだわらないの大事なのは大きさよ」魔女の宅急便より
1295 海じゃなくて山が見えるんだが2つの
1234 見ろ‼️コメ欄がゴミのようだ‼️
1140 なんかもう演奏を最高のBGMにしてコメ欄を見てる感じになってる
1091 わたし、魔女のキキ!これはただのチチ!
1016 主さんも不安よな。右手動きます。
972 マジで勃急便
864 これ知ってる猫のチチがでるやつでしょ
857 ここのコメ欄面白いし、いつも素敵なBGM流れてるからいいなって思う。
841 正直に言わせて欲しい。私もサムネの乳に惹かれてクリックした内の一人だ。ラピュタでも久石譲でもない。乳に惹かれ、光の速さでクリックした内の一人だ。
831 サムネ見た瞬間にこのコメント欄の惨状が目に浮かんだわ。
815 やっぱりおっぱい上手だなぁみんなピアノに気取られすぎ、ちゃんと評価してあげて
728 ahappy乳year😍
633 一見ピアノそっちのけで胸に夢中なコメント欄のように見えるが、実は胸も本命ではなく、いかに面白いことを言えるかを競っているコメント欄。
615 BGM聞きながらコメント欄見てる人が大半説
607 カテゴリ音楽で草
589 ゆうべから石たちが妙に騒ぎおってな
571 公開前から性欲の獣でコメ欄うまってて草
570 ドピュタ
544 「ぼくの息子は親方のげんこつより硬いんだ」
519 もはや動画よりコメ欄見にきてるわ
425 よく見たらこの人ピアノ弾いてんじゃん
403 たくさんの変態コメが恥ずかしいのはあのどれか一つに僕がいるから
397 この胸に不思議な力があるなんて、私ちっとも知らなかった。・・・ずっと昔から家に伝わってきたもので、母が私にくれたの。けっして人に触らせたり見せたりしちゃいけないって。
393 22年間ピアノしてるからわかる。いい身体ですね
391 あまりの大きさに驚いたムスカ「メガ!メガァァア!!!!!」
388 幼い頃から千と千尋はとても好きなので、思い出深い曲です。感動で胸がおっぱいおっぱいです。
378 そういや、おかみさん言ってたな「いい乳じゃないか、守っておやり」って。
365 外はどんどん寒くなっているのに、どんどん薄着になっていくその姿勢。神様かと思います。
353 どんなに恐ろしい武器を持っても、たくさんの可哀想なロボットを操っても、乳から離れては生きられないのよ!
342 新年明けましておめでとうございます。今年もまた綺麗な音色と演奏している美しい姿を見れる事をたのしみにしています。
296 新年あけましておめでとうございます!本年も息子をどうぞ宜しくお願いします!
292 動画をBGMにコメ読みに来た人↓
292 ムスコ「3分間、勃ってやる」
283 私はこの音楽が好き。デモっぱいの放題標愛。
280 10時間前から待機してる奴ばっかで草。
267 我之見、即息子極大成長。息子上下摩擦後、大量白濁液噴出不可避。嗚呼、我今噴火警戒規定最大値。嗚呼、我行寸前。嗚呼、嗚呼嗚呼〜!!
264 40秒で発射しな
263 娘のピアノの練習にとこの音楽に辿り着きましたが隠れて1人だけでみることにしました
251 なあ女の子さんその、、、その乳には強い力があるわしは乳ばかり相手にくらしてきたからようわかるんだが力のある乳は人を幸せにもするが不幸を招くこともようあることなんじゃ、、、
243 馬鹿共にはちょうどいい目くらましだ。
230 カテゴリ音楽で草
200 特に理由はないんですけど、縄跳びの企画とかやりません?
197 強弱の付け方が旋律に柔らかいふくらみをもたらしていて、たわわで深い演奏ですね。
193 むしろたたない方が失礼。あくまで礼儀の一環で丁寧に勃起させていただきました。
178 ピアノ大きいですね!あっ違う胸上手ですね!
177 ピアノ講師です。30年色んな生徒教えてきましたがこんなに上手なお乳みたことありません。
173 ジブリ大好きでその中でもラピュタは本当に思い出の映画で何回も見てこの歌も歌ってきたけど、やっぱりいい乳だなって思う。
165 この曲聞いてると眠たくなるな息子は起きるけどな
163 胸ネタが大量にある中でいかに被らず、面白い文を考えるかが重要。
162 4:33〜お急ぎの方〜
160 ムスカ「その大砲のような巨乳で私と勝負するのか?」
158 海の見える町…?私には谷が見えます✨
156 はっはっは、まるで息子が鋼のようだ
153 あるいみ「顔無し」ですね
150 paiさん「決して人に渡したり、見せたりしたらいけないって」
145 我息子新年早々発射寸前、息子喜喜
142 本人も狙ってこの格好してるんだろうな
142 なんか匂わぬか?チチだ、おまえチチくさいぞ。
140 私、山育ちで胸は大きいの。
135 0:53視聴者全員の視線が移動する瞬間
130 サ胸につられてしまった者達↓↓↓
120 このコメント欄にいる方達は、決して変態などではありません。彼らは欲望に忠実なだけです。むしろ純粋だと言えます。
118 ムスコ「竿が、竿が~!」
116 服に書いてある字を読みたいからズームしてくれません?
116 父 さ ん が 残 し た熱 い 想 い
111 目を瞑るとそこには海が、目を開くとそこには乳があるんだなぁ。みつを
108 なんでそんな女児の肌着みたいなの着てんの...
108 「40秒で支度しな!」「支度どころか出発できるぜ」
103 乳見てる自分が悲しくなるくらい儚い音色。いい動画見させていただきました。
88 親方!空から胸にふたつラピュタをつけた女の子が!ラピュタは本当にあったんふぅ...

はい
評価の高いコメントなんですが
コメントがゴミのようですねーーーwwwwwww

動画のサ胸、もといサムネイルに
ヒントが隠されていますので
是非皆様も一度ご覧になってみてください。


自分もこのチャンネルを見るときは
ピアノの音が邪魔なので
ミュートして見ています!!!!!!

コメントも見所の一つなので
そっちメインで見ていますが
他にも素晴らしいところはあると思いますよ
きっと


今回はこれまでです
それでは。

今回は3D写真を作る奴を試してみました。

説明動画はこちら





元ネタはGIGAZINEさんに紹介されていた
画像から簡単に精巧な3D写真が作成できる論文が公開される 実際に3D写真を生成することも可能

という記事の内容です。

1枚の写真から
立体感のある3D写真を生成するというものです。


早速試してみましょう。

手順は
1.下記のGoogle Colaboratoryノートブックにアクセス
要Google Acount

GoogleColabのサンプル

2.「ファイル」から「ドライブにコピーを保存…」をクリック
スクリーンショット 2020-04-18 16.29.07



3.Prepare environmentの再生ボタンをクリック
ツール類のインストールをしている模様(5分くらいかかる)
スクリーンショット 2020-04-18 16.29.48




4.Download script and pretrained model」下の再生ボタンをクリック
gitからコードを読み込んでダウンロードshellを実行している模様
スクリーンショット 2020-04-18 16.30.01



5.Switch off off-screen renderingの再生ボタンをクリック
argument.ymlを書き換えてるっぽい
スクリーンショット 2020-04-18 16.30.12



6.Please upload .jpg files の再生ボタンをクリック
デスクトップとかに画像を用意しておいて、変換したい画像を選択する。
この部分を実行すると選択ボタンが下の方に出るので
スクリーンショット 2020-04-18 16.30.38

ファイル選択をクリックして自分の変換したいファイルを選択する
スクリーンショット 2020-04-18 16.30.50

アップロードすると「image」フォルダの中に格納される。


7.Execute the 3D Photo Inpainting」の再生ボタンをクリック
画像から動画ファイル(MP4)が作成される。(結構時間かかる)
スクリーンショット 2020-04-18 16.31.02


8.「3d-photo-inpainting」の中の「video」フォルダ内に
出力された3D写真がMP4形式で保存されている
スクリーンショット 2020-04-18 16.31.25

ファイルは
「xxx_circle.mp4」: 螺旋を描いて拡大縮小
「xxx_swing.mp4」: 横にスライドしながら拡大縮小
「xxx_zoom-in.mp4」: ズームインのみ
の3種類が作成される。


サンプルには
こんな画像がついています。
スクリーンショット 2020-04-18 16.23.12

ここに動画は載せられないようなので
代わりにGIFにしたものを置いておきます。
moon_swing.mp4
download

こんな感じで
奥行きを感じられる風に動きます。

コードでは
自分で画像ファイルをアップして
3D写真に変換することもできるので

興味のあるかたは
是非試してみてください。

それでは。





新型コロナウイルス感染拡大に伴う
緊急経済対策の柱に位置付けられる
「現金30万円」の給付金。

これ貰えるのか貰えないのか
気になってしまったので実装してみました。

解説動画はこちら




聞いた話だと「給付条件」は段階があるようです。

1.世帯主の2~6月の月収が減り
以下の月収金額以下である場合は給付金は貰える

単身世帯…月収10万円
2人世帯…月収15万円
3人世帯…月収20万円
4人世帯…月収25万円

2.世帯主の2~6月の月収が1/2以下に減り
以下の月収金額以下である場合は給付金は貰える

単身世帯…月収20万円
2人世帯…月収30万円
3人世帯…月収40万円
4人世帯…月収50万円

段階があるのでちょいとややこしいですね。

今回はipywidgetsで実装してみました。

条件の目安にしていただく程度のものです
実際に貰えるかどうか等は
ご自身でご確認くださいませ。
from ipywidgets import IntSlider , interact

n1 = IntSlider(value=20, min=0, max=100, step=1,description='前年の月給')
n2 = IntSlider(value=20, min=0, max=100, step=1,description='今年の月給')
n3 = IntSlider(value=1  , min=1, max=4,      step=1,description='世帯人数')

def show_plot(n1, n2,n3):
    print('前年の月給 : {0}万円 , 今年の月給 : {1}万円 , 世帯人数 : {2}人'.format(n1,n2,n3))
    if any([(n3==1 and n2<=10),(n3==2 and n2<=15),(n3==3 and n2<=20),(n3==4 and n2<=25)]):
        print('給付金がもらえる(1)')
    elif (n2<=n1/2) and any([(n3==1 and n2<=20),(n3==2 and n2<=30),(n3==3 and n2<=40),(n3==4 and n2<=50)]):
        print('給付金がもらえる(2)')
    else:
        print('給付金は貰えない')

interact(show_plot, n1=n1,n2=n2,n3=n3)

実行していただくと、こんな感じになります。
スライダーを動かしていけば結果が出ます。

スクリーンショット 2020-04-12 16.05.24



結論から行くと
自分は貰えないんで、テンションだだ下がりです。

とはいえ、この条件であれば
家族が多ければ貰える人も結構いると思うので
条件に当てはまる方は
申し込みした方が良いですね。

申し込みする役所が
クラスターになる可能性も有るので
気を付けないといけないですが。

今回はこれまでです
それでは。


TKO木下の動画が絶賛炎上中だと聞きつけまして
早速コメントを感情分析してみました

解説動画はこちら


炎上している動画はこんな感じです。

動画タイトル:TKO木下よりご報告がございます。
公開日:2020/04/01
2020/04/11 16:00現在
視聴回数:2,845,395 回視聴
高評価:4771件
低評価:28万件
コメント数:50,898 件

素晴らしい低評価の数ですねー。
私は動画は見ておりませんが
低定評に1評投じさせていただきました。


さて
感情分析のやり方ですが
Youtubeのコメントと形態素解析
それと単語感情極性対応表というものを使います。

単語感情極性対応表は
こちらを参照してください。



中身はこんな感じで

ない:ない:助動詞:-0.999997
酷い:ひどい:形容詞:-0.999997
病気:びょうき:名詞:-0.999998
死ぬ:しぬ:動詞:-0.999999
悪い:わるい:形容詞:-1

ポジティブワード、ネガティブワードがあり
ポジティブ方向になると0から1点
ネガティブ方向は-1から0点の間の数値を取ります。

単語のポジネガ具合が分かる訳です。

手順としては

1.事前にYoutubeのコメントを集める。
  Youtubeの動画のページをスクロールして
  コメント表示させてから保存する。

 2.BeautifulSoupでHTMLの中から
  コメントの部分だけ拾い上げる。

3.コメントを形態素解析して単語感情極性対応表と
  比較してポジネガ点数をつける
  ポジティブだとプラス,ネガティブだとマイナスの点になる

まずはじめに
動画のコメントを集めなければならないので
動画のページをブラウザーで開いて
コメントを表示させたら、HTMLファイルに保存します。

次にPythonのコードを使って
HTMLの構文解析を行い、コメントを抽出します。

まず必要なライブラリは
from bs4 import BeautifulSoup
from janome.tokenizer import Tokenizer
t = Tokenizer()

janomeは後に使いますが、インストールしていない方は
pip などでインストールしておきましょう。

次にhtmlファイルを読み込んで変数に格納しておきます。
with open('htmlのファイル') as _f:
    html = _f.read()


お次はコメント部分の抽出です。
htmlファイルの中からコメントを抽出して
リストに格納しています。
soup = BeautifulSoup(html ,'lxml')
contents = soup.find('div',id='contents')
ytds = contents.find_all('ytd-comment-thread-renderer')
result_list = []
for ytd in ytds:
    span1 = ytd.find('span',class_="style-scope ytd-comment-renderer")
    name = span1.text.replace('\n','').replace(' ','') if span1 is not None else ''
    span2 = ytd.find('span',id="vote-count-middle")
    high = span2.text.replace('\n','').replace(' ','') if span2 is not None else ''
    come1 = ytd.find('yt-formatted-string', id="text")
    rep = come1.text.replace(' 件の返信を表示','').replace(' ','') if come1 is not None else ''
    come2 = ytd.find('div',id="content", class_="style-scope ytd-expander")
    com = come2.text.replace('\n','').replace(' ','') if come2 is not None else ''
    tmp = [name,high,rep,com]
    result_list.append(tmp)

次は形態素解析です。

単語感情極性対応表は事前にダウンロードしておいて
CSVファイルなどにしておいてください。

単語を辞書型に取り込みます。
posinega = {}
with open('posinega.csv') as _f:
    for row in _f:
        rows = row.replace('\n','').split(':')
        posinega[rows[0]] = float(rows[3])

最後にコメントを形態素解析して
ポジネガで点数をつけていきます。
nega_result = {}
for rows in result_list:
    count = 0
    for token in t.tokenize(rows[3]):
        h = token.part_of_speech.split(',')[0]
        if any(['名詞'==h,'形容詞'==h,'動詞'==h]):
            num=len(token.surface)
            key = token.surface
            if key in posinega:
                count+=posinega[key]
    nega_result[rows[3]]=count

これでコメントにポジネガの点数が付きました。

最もネガティブなコメントは・・・

-53.76871590000002
私は叙々苑でバイトをしていた者です。
1年前、TKO木下が私のバイト先東京の叙々苑を
訪れた際の記憶は忘れられません。 悪い意味で。
TKO木下は入店早々に既に様子がおかしく、
ホール担当だった私の胸ぐらを急に掴み一言。
「さっさと案内しろやボケ」と。
しかし木下が入店する所を見て3秒程で
駆けつけたのにも関わらすこの暴言暴力
・・・
辛いです。

と全文はかなり長いので端折りますが
冒頭を見るだけでもかなりネガティブさが伝わる文面です。

ネガティブの一番悪いものでも-1点なので
60個近くネガティブな単語が使われているコメントでした。

これだけの長文を想像で書くのは無理でしょうから
実体験だったんだろうと思いますね。

というようなネガティブコメントが多数並んでいました。

逆に
ポジティブなコメント有るんかな?
みてみましょう。

11.14069 ウケる笑笑低評価笑笑笑笑笑笑笑笑笑笑
2.890590 おはよう。くっさいなぁ~笑笑笑
2.530665 祝!低評価日本一更新!
1.666281 2倍速だと面白い
1.412733 朗報低評価日本一達成
1.374283 むしろコメ欄見にきてる笑日本一の低評価王にしてあげるためにみんな低評価押そうな
1.299542 宮迫博之の真似すれば売れるとおもったんやろ笑笑
1.261103 (*'∇')/゚・:*【祝】*:・゚\('∇'*)低評価日本一!よっ!!あっぱれ!流石です!!
0.989242 ヒカルを越した天才
0.989199 適当にやってもいいよ君が面白いと思っても多分面白くないから
0.989199 ff7本当に面白いよ😃
0.963530 なんかこんだけ荒れてることすらおいしいな〜とか思ってそう。笑 0.935754 大喜利コメ見てるから黙れ
0.932040 バチスタすごい好きでしたw
0.932040 本当にお笑いが好きならやらんやろアホか
0.921042 うちの姪が初めて掴まり立ちしましてね。みんなで喜びました。
0.769555 来世で頑張って下さい❗️来世で応援します‼️
0.650668 ファンのみなさま、、、っておるんか?(笑)
0.568479 低評価日本一おめでとう㊗️あと、誰に謝ってんねん
0.568479 おめでとう低評価日本一‼️
0.568479 低評価日本一おめでとうございます!
0.568479 低評価日本一おめでとナス!


低評価おめでとう、など
悪い意味で褒めてる感じですねwwwwww。

というわけで、まとめですが

日頃の行いは大事です。
見てない所でも敬意を払うことは当たり前だと思います。
特にタレントさんの私生活には
その人となりが出るようですね。

また素行の悪い方がテレビに出るのは
あまり良いことだとは思いません。

ネガティブなイメージの有るタレントをCMなどに使うと
商品、サービスにもネガティブイメージがつくので
我々企業側の人間はこういうタレントは
使わないようにしないといけないです。

ということで動画コメントの
感情分析でした。

皆様も
日頃の行いには気をつけたほうが良いですよ
誰がみてるか分かりませんし。

それでは


米失業保険申請者数のデータがあったので
可視化してみました。


解説動画はこちら



データはここにあります。

データソース:2020年03/28までの統計データ

米国労働省:

https://www.dol.gov/ui/data.pdf

アメリカ合衆国 労働省雇用管理局

https://oui.doleta.gov/unemploy/wkclaims/report.asp

これをcsvファイルにしておきます。
列は「N.S.A(日付)」「S.F.(申請数)」の2列分を用意します。




pandas を使ってデータを読み込みします。
import pandas as pd

df = pd.read_table("米失業申請者数データ20200328.csv")
df['day'] = pd.to_datetime(df['N.S.A'], format='%m/%d/%Y')
「N.S.A」列が日付の部分の文字列「m/d/y」形式になっているので
日付のデータに直します。

次に可視化ツールのplotlyの方ですが
普通はインストールされていないと思うので
インストールしていない方はpip install plotly
などでインストールしてください。

以下のコードがこのデータを可視化するコードです。
import plotly
plotly.offline.init_notebook_mode(connected=False)
data = [
    plotly.graph_objs.Scatter(x=df["day"], y=df["S.F."], name="Claims")
]
layout = plotly.graph_objs.Layout(
    width=1000, height=600,
    title="title",
    xaxis={"title":"Years"},
    yaxis={"title":"Claims"},
)
fig = plotly.graph_objs.Figure(data=data, layout=layout)
plotly.offline.iplot(fig, show_link=False) 

日付を横軸(x) , 申請者数を縦軸(y)にあてて
線グラフを作ります。

可視化の結果は・・・
スクリーンショット 2020-04-05 15.56.29

右上にplotlyのツール類が表示され、ズームインアウトや
選択など色々選んで操作できます。

一般的なpandas、matplotlibの可視化では
動かすことができないので
可視化された図表を動かして見ることのできる
plotlyはかなりの優れものです。

データの方を見てみると
1982年とリーマンショックのあった2009年に
かなり多くの申請があったことが見えました。

しかし2020年3月になると
ドーンと跳ね上がって・・・

スクリーンショット 2020-04-05 16.01.20

爆増しているのが見えます。
レポートの数値から見ると
失業申請者数は600万人を超えているみたいですね。

リーマンの時でさえ100万人に満たなかった訳で
今回の影響がどれだけヤバイのかがすぐにわかります。

このデータは3/28のデータ
今日は4/5なのでそこから1週間経ってるいるため
さらに倍増している可能性もあります。

一説によると
アメリカの労働人口の2割ほどが影響を受けているそうで
もし、日本でも同様の事態となると
数十万人 - 100万人単位で
影響を受ける方が増えると予想されます。

特にレストランやバー、映画館、ホテル、スポーツジム
などは営業停止しており
特定の製造業も工場の稼働停止をしています。

リーマンの時は稼働停止までは至っていなかったと思うので
10年前の大不況に比べると
はるかに大きな不況が目の前に来ています。

前回の余波は、自分も食らったので2年くらい
まともな仕事が無かったです。

今回、それを超えるようなことに
ならないことを願うばかりです。

エンジニアの対策としては
現状新規案件が白紙、撤回されたり
内定も取り消されるケースが増えているようです。

フリーランスになったり、転職活動は
かなり厳しくなると予想されるので
今雇用があるなら、そこでじっと騒動が収まるまで
耐えるしかないかなと思います。

頑張って乗り切れば
明るい未来が待っていると思いたい。

それでは。



 

このページのトップヘ