徒然俺

twitter→@Sea_weeeeeeed

「日東駒専に行く」という男について

何もする事が無い。就活が終わらない。卒論のテーマすら決まっていない。俺みたいな大4で詰み確定の腐れ野郎、他に、いますかっていねーか、はは。とボヤきながらインターネットの波に乗っていたら「日東駒専に行く」というアカウントをふと思い出したので、アカウントを運用していた当時の彼は一体どのようなツイート傾向だったのかを探るべく、google colaboratoryに殴り込みをかけた。

 

 

思い立った矢先「でもツイートってTwitter API取得しないとイイ感じに掘れないじゃん」という壁にぶつかった。滅びろTwitter社。困ったので『Python ツイート 取得』で検索。するとイイ感じのアレが見つかった。「twitter-scraper」という、APIを用いずに対象アカウントのツイートを取得できるアレ。と言っても取得数に限界があるらしく、直近の1000ツイート程しか対象にならないらしい(数えてないけど多分それくらい)。

 

とりあえずインストールする

!pip install twitter-scraper

f:id:jikoai_ecstasy:20190820213211p:plain

結果

twitter_scraperのget_tweetをインポートして、日東駒専に行く(@zaki_monste)のツイートを取得。

from twitter_scraper import get_tweets

for tweet in get_tweets('zaki_monste', pages=10000):
        print(tweet['text'])

f:id:jikoai_ecstasy:20190820213555p:plain

結果(こんな感じのが1000行くらい続く)

次にcodecsをインポート。そして↑の実行結果で確認できたツイートを「zaki.txt」として保存。

import codecs

for tweet in get_tweets('zaki_monste', pages=100000):
        print(tweet['text'],file=codecs.open('zaki.txt','a'))

f:id:jikoai_ecstasy:20190820214233p:plain

get_tweetsの限界が来るとこの結果が返ってくる(実行できた部分の表示、保存はされる)

保存できたかどうかをチェック(普通にドライブに保存する方が楽だと思う)。

x = open('zaki.txt', 'r')
for line in x:
        print(line)

x.close()

f:id:jikoai_ecstasy:20190820214821p:plain

できてた

次に「janome」をインストール。正直信頼度とシェアの高いmecabを使ったほうが良いと思った。そもそも言語処理とか触れたことが無かったのでとりあえず何かできればいいと思いjanomeを利用した。もう2度と使わないと思う。

!pip install janome

f:id:jikoai_ecstasy:20190820215129p:plain

成功

ipagp.ttfをインストール。これはただのフォント(多分)。

from google.colab import files
uploaded = files.upload()

f:id:jikoai_ecstasy:20190820215351p:plain

ここで「ipagp.ttf」を選択

ワードクラウドで取得したツイートを見てみる。のでwordcloud、matplotlib、sysをインストール。

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import sys

 

「wordcloud_show」を定義。この辺はjanomeの掲載サイトからほぼ流用した。何故か分からないけれど表示される画像のサイズがうまい具合に設定できなくて10時間くらい格闘した。「ply.rc~」がなんか必要らしい。
def show_wordcloud(file):
    with open(file, encoding='utf8') as f:
        text = f.read()

        plt.rcParams['figure.figsize'] = (20,20)

        wordcloud = WordCloud(font_path='ipagp.ttf', background_color='white', width=1024,                height=674).generate(text)
        plt.imshow(wordcloud, interpolation='bilinear')
        plt.axis("off")
        plt.figure()
        plt.show()

wordcloudを出力してみる。
show_wordcloud('zaki.txt')

f:id:jikoai_ecstasy:20190820220455p:plain

こうなった

とにかく「pic twitter」「twitter」が邪魔。これはツイートに含まれる画像のURLだと思うのでなんとかする。それにしても変な単語が多いと感じる。

「zaki.txt」に保存されているツイートを単語分割して「word.txt」として保存。そしてもう一度ワードクラウドを見てみる。

from wordcloud import WordCloud
import matplotlib.pyplot as plt
from janome.tokenizer import Tokenizer

def split_text(src, out):

    t = Tokenizer()
    with open(src, encoding='utf8') as f1:
        with open(out, mode='w', encoding='utf8') as f2:
            for line in f1:
                 tokens = t.tokenize(line, wakati=True)
                 f2.write('%s\n' % ' '.join(tokens))


def show_wordcloud(file):
    with open(file, encoding='utf8') as f:
        text = f.read()
        wordcloud = WordCloud(font_path='ipagp.ttf', background_color='white', width=1024,                height=674).generate(text)
        plt.imshow(wordcloud, interpolation='bilinear')
        plt.axis("off")
        plt.figure()
        plt.show()

split_text('zaki.txt', 'words.txt')
show_wordcloud('words.txt')

「なんで何回も同じ関数定義してんだよ」と思うかもしれない。これは作者サイトの例からほぼ丸パクリしたためである。それにもしかしたら出力毎にいろとか変えたくなるかもしれないしいいんじゃいの。ウソ。めんどくさいからです。

f:id:jikoai_ecstasy:20190820221423p:plain

結果

やっぱり「pic twitter」がクソ邪魔。あと「きらら」「タイム」「ファンタジア」「MAX」などはおそらく固有名詞なので再定義が必要。

 

import csv
with open('udic.csv','a') as f:
    writer = csv.writer(f)
    writer.writerow(['まんがタイムきらら','名詞-カスタム','マンガタイムキララ'])
    writer.writerow(['喧嘩稼業','名詞-カスタム','ケンカカギョウ'])
    writer.writerow(['きららファンタジア','名詞-カスタム','キララファンタジア'])
    writer.writerow(['まんがタイムきららMAX','名詞-カスタム','マンガタイムキララマックス'])
    writer.writerow(['うらら迷路帖','名詞-カスタム','ウララメイロチョウ'])
    writer.writerow(['きんいろモザイク','名詞-カスタム','キンイロモザイク'])
    writer.writerow(['JKすぷらっしゅ','名詞-カスタム','ジェイケイスプラッシュ'])
    writer.writerow(['徒然俺','名詞-カスタム','ツレヅレオレ'])
    writer.writerow(['明日からめっちゃ勉強頑張るぜ','名詞-カスタム','アシタカラメッチャベンキョウガンバルゼ'])
    writer.writerow(['きんモザ','名詞-カスタム','キンモザ'])
    writer.writerow(['はんどすたんど','名詞-カスタム','ハンドスタンド'])
    writer.writerow(['Aチャンネル','名詞-カスタム','エイチャンネル'])
    writer.writerow(['モンスト','名詞-カスタム','モンスト'])
    writer.writerow(['おちこぼれフルーツタルト','名詞-カスタム','オチコボレフルーツタルト'])

 

とりあえずワードクラウドで目についた単語を再定義するために固有名詞をcsv形式で書いて保存。

 

from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import *
from janome.tokenfilter import *
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def create_analyzer(udic_file, udic_type):
    tokenizer = Tokenizer(udic_file, udic_type=udic_type, udic_enc='utf8') if udic_file else Tokenizer()
    char_filters = [RegexReplaceCharFilter('pic', ''),RegexReplaceCharFilter('http',                                           ''),RegexReplaceCharFilter('twitter', ''),RegexReplaceCharFilter('com',                                 ''),RegexReplaceCharFilter('/', ''),RegexReplaceCharFilter('3',                                                 ''),RegexReplaceCharFilter('4', ''),RegexReplaceCharFilter('5',                                               ''),RegexReplaceCharFilter('9', ''),RegexReplaceCharFilter('#',                                               ''),RegexReplaceCharFilter('1', ''),RegexReplaceCharFilter('2',                                               ''),RegexReplaceCharFilter('6', ''),RegexReplaceCharFilter('7',                                               ''),RegexReplaceCharFilter('8', ''),RegexReplaceCharFilter('0', '')]]
    token_filters = [POSKeepFilter(['名詞','形容詞','形容動詞','感動詞']), POSStopFilter(['名詞,非自立','名詞,代名詞']), ExtractAttributeFilter('base_form')]
    return Analyzer(char_filters, tokenizer, token_filters)

def split_text(src, out, udic_file='udic.csv', udic_type='simpledic'):

    a = create_analyzer(udic_file, udic_type)
    with open(src, encoding='utf8') as f1:
        with open(out, mode='w', encoding='utf8') as f2:
            for line in f1:
                tokens = list(a.analyze(line))
                f2.write('%s\n' % ' '.join(tokens))

def show_wordcloud(file):
    with open(file, encoding='utf8') as f:
        text = f.read()
        wordcloud = WordCloud(font_path='ipagp.ttf', background_color='white', width=1024,height=674).generate(text)
        plt.imshow(wordcloud, interpolation='bilinear')
        plt.axis("off")
        plt.figure()
        plt.show()

split_text('zaki.txt', 'words.txt')
show_wordcloud('words.txt')

 

ついでに数字やURLっぽいモノとハッシュタグを除外(クソ稚拙な記述方法を取ったので「RegexReplaceCharFilter」がとんでもないコトになっている)。googlecolabからコピペしてて思ったけれど上のほうのインストールcodeは無駄なのがある。でもこのコードも作者サイトのコピペがベースだからそうなるのも仕方ない。俺が悪い。

f:id:jikoai_ecstasy:20190820222718p:plain

こんな感じになった

再定義したせいで「まんが」「タイム」「きらら」などが埋もれてしまった。でもまぁ「こんな感じのツイート傾向」というのは得られたと思う。固有名詞の定義をしていない結果、単語分割していない結果とを見比べてみるとこれまた「うむ」と思う。

 

 

 

ちなみに「ザキ(@kinironomono)」の直近ツイート傾向はこんな感じだった。

f:id:jikoai_ecstasy:20190820223342p:plain

単語分割、再定義、不要ワード除外前

f:id:jikoai_ecstasy:20190820223851p:plain

単語分割、再定義、不要ワード除外後

一応言っておくとここに書いたコードをコピペしても多分うまい具合に動かないと思う。インデントとかアホほどテキトーに張り付けたので。ならcolabのファイルをドライブで共有すればいいじゃんって?うるせーアホ。FINALFANTASY

 

 

 

感想。そもそも自然言語処理とか形態素解析は全くやったことが無かったのでワードクラウド作成だけでも死ぬほど時間がかかった。あえて言うなら統計的分析をしたかったけれどこういう言語処理したデータをどんな感じに数値化するのか全く想像がつかない。というかプログラミング自体1から習ってねーからたまにやると時間も労力もとんでもない。もう2度とやらない。#明日からめっちゃ就活頑張るぜ


MR. Radio

MR. Radio

MR. Radio

  • Soulride
  • ジャズ
  • ¥150
  • provided courtesy of iTunes