ラジオ番組の特徴をTweetから見てみる(MeCabと単語カウントで)

ラジオが好きでよく聴くんですが、音声メディアの性質上実際に聞いてみないと好き嫌いが判断できず、自分の知らない面白いラジオがあるのでは?といつも思っています。

機械学習の本を何冊か読むなかで、その番組の特徴量を出せれば「自分の好きな番組に似ている番組」を探せるのではないかと思いました。
音声データから特徴量を出すやり方もあると思いますが、テキストベースでの学習をしてみたいので、そのラジオについてのツイートから特徴量を出せないかを試してみるメモです。

※初心者が勉強しながら手を動かしたメモなので、間違っている部分があれば優しく教えてもらえるとうれしいですm

ツイートを集める

まず、分析するためのツイートを収集します。今回は python でコードを書いていきます。tweepyというライブラリを使います。

tweepy - GitHub

ラジオについてのツイートを分析するには、ラジオ公式のハッシュタグでツイート検索するのが良さそうです。
今回は「Creepy Nutsのオールナイトニッポン0」という番組を例に進めますが、ハッシュタグは「#cnann0」になります。

tweepy をインストールして、

$ pip install tweepy

ツイートを検索して100件ほど取得してみます。

import tweepy

# https://developer.twitter.com から取得した値を入れる
consumer_key = '{YOUR_CONSUMER_KEY}'
consumer_secret = '{YOUR_CONSUMER_SECRET}'
access_token = '{YOUR_ACCESS_TOKEN}'
access_token_secret = '{ACCESS_TOKEN_SECRET}'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

# RTは除いて検索
keyword = '#cnann0'
query = keyword + ' -filter:retweets'

tweets = []

# 100件分取得. 改行はなんとなく消しておく
for tweet in tweepy.Cursor(api.search, q=query).items(100):
   tweets.append(tweet.text.replace('\n', ' '))
   
print(len(tweets)) # -> 100

認証キーには Twitter Developer から取得した値を入れます。

今回はRTは除いて、リスナーが自分の言葉でつぶやいた文章で分析したいため、クエリに -filter:retweets をつけてRTを除いています。

tweets の中身をみてみると、

お腹の虫が鳴りヤーマン 野菜天丼天ヤーマン笑笑 #cnann0 
 #cnann0    3分42秒からくらいかな? Rさんが言ってた通りで笑ってしまったw 本当に、無音の境地に辿り着けるかもしれない笑  Better Than Yesterday Feat. Mr. Room9, 배치기, Ktc… https://t.co/Ak3fWYXj6c

TF #cnann0 

ミーーーーーーー #cnann0 

AppStoreに出てきた #cnann0  https://t.co/c2aydzhB2d

クリーピーの食べ物の話ダイスキ💮 #cnann0 

正しく取得できてそうです。分析に使いたいツイートが準備できました。

MeCabで形態素解析する

英語の文章なら単語ごとに区切られていて分析しやすいのですが、日本語の文章は区切り場所が分かりにくいため前処理が必要です。

今回はMeCabを使って形態素解析し、「名詞」「動詞」「形容詞」「副詞」をキーワードとして利用してみます。

まずは mecab をインストールします。

$ brew install mecab
$ brew install mecab-ipadic

次に mecab-ipadic-NEologd をインストールします。
mecab-ipadic-NEologd はMeCabと一緒に使う辞書で、新語や固有表現に強いそうです。
mecab-ipadic-NEologd - GitHub

$ brew install git curl xz
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n

最後に、python で MeCab を利用するために mecab-python3 をインストールします。

$ brew install swig
$ pip install mecab-python3

これで準備は整いました。

MeCab.Tagger で指定するパスを確認しておきます。

echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

では形態素解析のコードを書いていきます。

import MeCab

def parse(text):
   mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
   mecab.parse('')
   node = mecab.parseToNode(text)
   word_list = list()
   while node:
       word = node.surface
       word_type = node.feature.split(",")[0]

       if word_type in ["名詞", "動詞", "形容詞", "副詞"]:
           if word != "*":
               word_list.append(word)
               
       node = node.next
   return word_list

# サンプルで文章を与えてみる
parse("R-指定とDJ松永が楽しそうに話してて嬉しくなるラジオ #cnann0 ")

MeCab で形態素解析し、名詞・動詞・形容詞・副詞に当たる単語のリストを作っています。

「R-指定とDJ松永が楽しそうに話してて嬉しくなるラジオ #cnann0 」という文章の場合、

['R-指定', 'DJ松永', '楽し', 'そう', '話し', 'て', '嬉しく', 'なる', 'ラジオ', 'cn', 'ann0']

といった結果が得られます。文章が単語に分割されていて、使いやすい形になっています。

単語カウントで特徴量に変換する

ツイートを単語レベルに分解できたので、文書の特徴量を抽出してみます。今回は単語カウントという、単純に単語の出現頻度をみる方法でやってみます。

python の scikit-learn の CountVectorizer を使うと簡単にできそうですが、今回は勉強のため自分で単語をカウントしてみます。

ソースコードはこう書きました:

# 100件のツイートを一つの文章にする
full_tweet = " ".join(tweets)

# MeCabでパース
result = parse(full_tweet)

# 単語カウント
counter = Counter(result)
for word, count in counter.most_common():
   print(word, count)

これを実行すると、以下の結果が得られます。

ann0 99
cn 97
https 26
t 26
co 26
ヤーマン 25
野菜 17
天丼 1211
さん 88
てる 8
笑っ 7
Creepy Nuts 7666
てんや 6
なっ 6
離れ 6
ラジオ 5
TF 55
28 5
8 5
www 5

... (以下略)

結果をみてみると、ハッシュタグ #cnann0 自体に含まれる cn と ann0 ががトップ。次いでツイッターの短縮リンクのパーツである https / t / co が並んでます。

その次に多いのは「ヤーマン」「野菜」「天丼」ですが、これは今週(2020/07/28)の放送でCreepy Nutsの二人が話した

・食べてうまいもののことを野菜って呼んでる
・天丼は野菜めっちゃ乗ってる最高の食べ物。インゲン最初に食べちゃう
・(ラジオでかかったHIBIKILLAのヤーマンという曲にかけて)野菜大好き 天ヤーマン!などヤーマンを連呼した

トークへの反応と思われます。

並んでいる単語をみるとある程度番組(というか放送回)の特徴を表せていますが、「し」「さん」「て」「てる」など無関係な単語も上の方にあがってきてます。
これは単純に単語をカウントしたためで、 tf-idfを使えばもう少し結果は改善されそうです。

まとめ

ラジオへ寄せられたツイートを分析することでラジオの特徴が表現できないか試してみました。
単純な単語カウントでもなんとなくの特徴が出ることが確認できたので、次は複数の番組で試して番組間の類似度を計算してみようと思います。

Python や MeCab は初めて触りましたが使い勝手の良さ・文献の豊富さに驚きました。勉強しやすい環境が整っていて先人の方に感謝をお伝えしますす!

関連リンク

↑単語カウント、tf-idf について大変勉強になりました

↑データをどう活用するか、前処理の重要さなど大変勉強になりました

・実装の参考にさせていただいたサイト
  ・Python3からMeCabを使う
  ・Tweepyの使い方 ~その1~ 【Tweetの取得】
  ・Pythonで機械学習はじめました データ前処理編

・題材にさせていただいた番組も貼っておきます。おもしろいよ!
  ・Creepy Nutsのオールナイトニッポン0

画像2



この記事が気に入ったらサポートをしてみませんか?