餅屋LGTM

餅つきのあとの静けさ

本当に語彙力がないのは誰なのか

こういうアンケートをとっていたので実際に調べてみることにした。

ツイートの取得

今回はrubyTwitterAPIを使いツイートの取得をした

  1. アプリの登録とgemのインストール
    このページとかを参考にさくっとやる

  2. ツイートの取得

7rpn.hatenablog.com この記事を参考にやっていった

require "twitter"

#1.で作成したkey,tokenのセット
client = Twitter::REST::Client.new do |config|
  config.consumer_key        = 'Consumer Key (API Key)'
  config.consumer_secret     = 'Consumer Secret (API Secret)'
  config.access_token        = 'Access Token'
  config.access_token_secret = 'Access Token Secret'
end

puts 'ユーザ名:'
#ツイートを取得したいユーザーのユーザー名を取得(アカウント名ではない)
user = gets.chomp

#ユーザー名.txtファイルにツイートを書き出す
file_name = user + '.txt'
file = File.open(file_name, "w")

max_id = client.user_timeline(user).first.id

#200*5で1000件分取得
5.times do
  client.user_timeline(user, { count: 200, max_id: max_id } ).each do |tweet|
    file.puts tweet.text
    max_id = tweet.id
  end
end

file.close

Twitterの仕様上1回につき200ツイートまでしか取得できないようなので5回繰り返すことで1000件取得する(max_idはそのidのツイートより前のツイートを取得するオプション)
APIの利用は15分で15回までなので気をつける

ツイートの解析

ツイートの収集が終わったらそれを解析し、誰がボキャ貧なのかを明らかにする。 解析にはMeCabrubyから利用できるnattoというgemを利用する。

require 'natto'
require 'csv'

def mecab(txt)
  nm = Natto::MeCab.new(dicdir: "/usr/lib/mecab/dic/mecab-ipadic-neologd", node_format:'%f[6]\t%f[0]\n', unk_format: '%M\t未知語\n',eos_format:"")
    parse = nm.parse(txt)
  split = parse.split(/\n/)
  split.map! do |str| #,で配列に
    str.split(/\t/)
  end
  split.flatten!
  return split
end

dir = Dir.glob("*.txt")
dir.each do |file|
count = 0
  word = []
  File.foreach(file) do |line|
    if line =~ /^RT|^I'm at/ #リツイート,チェックインを除去
    else
      line.gsub!(/@.+\s|http.+(\s|$)|\(@.+\)|#.+(\s|$)/, "")  #リプライ,リンク,コメント付きチェックインのチェックイン部分,ハッシュタグの除去
      line.gsub!(/@/, "")    #複数人への空リプの除去
      parse = mecab(line)
      word.push(parse)
      count += 1
      if count == 900 #900ツイート解析したら終了
        break
      end
    end
  end

  word.flatten!
  word_count = Hash.new(0)
  word.each_with_index do |count, i|
    if i % 2 == 0
      word_count[count] += 1  #文字列の出現回数を数える
    end
  end

  word_sort = word_count.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }
  word_class = Hash[*word]

  name = file.split(/.txt/)[0]
  out = name + ".csv"

  CSV.open(out, "wb") do |csv|
    csv << ["文字列", "出現回数", "品詞"]
    word_sort.each do |row|
      row.push(word_class[row[0]])
      csv << row
    end
  end
end

他人のツイートであるRTや定型文のチェックインなどは簡単に弾いた。また、解析するツイート数が同数になるように900ツイート解析することにした。 あとは出来上がったcsvをエクセルなどで適当に集計すればとりあえずおしまい

結果

比較のために語彙力に溢れんツイートをしているように見えるもと媒体長にも渦中の3人のほかに登場していただいた。
その結果が以下の表である。
※ツイートの取得時刻は2016/12/08 16:00頃

媒体長 ともねちゃん ヒマカ ksk
名詞 1519 968 1480 1131
動詞 340 275 346 323
未知語 191 131 131 110
副詞 118 95 101 89
形容詞 74 55 68 60
助詞 72 62 66 57
記号 25 22 26 18
助動詞 20 18 17 16
接頭詞 18 13 16 16
接続詞 17 17 14 14
連体詞 14 12 8 10
感動詞 12 17 17 11
フィラー 4 3 4 3
その他 1 1
出現単語数(uniq) 2425 1688 2295 1858

いかがでしたか?