トレンドワード抽出をちょっと変更。Jumanも使ってみる

1ツイート内での名詞はユニークにしてカウントする

以前から簡単なトレンドワード抽出をやっているのですが、いろいろ変な語が混ざってきます。2012年1月16日のベスト10を出してみると、次のようになっていました。

逐逐	    61.0
TORE	    58.0
土蜘蛛	    44.0
INFOBAR	    41.5
ケケ	    40.0
瑛	    39.8
チキンフィレダブル	    38.0
ッポイド	    37.0
A子	    32.0
イト	    30.6

この最初にある「逐逐」という形態素(と判定されたもの)が元のツイートではどう使われているのか見てみると、次のようなツイートでした。

間違い探し【中級】逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐遂逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐逐 できたらRT

「逐逐」という形態素はこの1つのツイートでのみ現れていて、それがこのトレンドワード抽出のための頻度に影響しています。今回以外にもこういうケースは多いようです。
「逐逐」を形態素とする判定自体はさておき、トレンドワードはみんなが書いているからこそトレンドになれるわけです。そのため、ツイートからの名詞(トレンドワード候補)抽出処理で、現在のように1つのツイートで同一形態素を何度もカウントするのはやめたほうが良さそうです。ツイート内で形態素(の、さらに名詞として判定されたもの)をユニークにして扱うことにします。
以前のコードからの修正は微々たるもので、いったんsetに入れてからそのsetの要素を出力するという単純なやり方で対処しました。

#!/usr/bin/ruby
#Coding:utf-8

require 'set'
require 'MeCab'

#char type
CHAR_DEFAULT = 0
CHAR_SPACE = 1
CHAR_KANJI = 2
CHAR_SYMBOL = 3
CHAR_NUMERIC = 4
CHAR_ALPHA = 5
CHAR_HIRAGANA = 6
CHAR_KATAKANA = 7
CHAR_KANJINUMERIC = 8
CHAR_GREEK = 9
CHAR_CYRILLIC = 10

def isNoun(morph_type)
  morph_type == "名詞"
end

def isSymbol(char_type)
  char_type == CHAR_SYMBOL
end

def isKanji(char_type)
  char_type == CHAR_KANJI 
end

def isAcceptableNoun(morph_inf)
  return isNoun(morph_inf[1]) \
    && !isSymbol(morph_inf[2].to_i) \
    && (morph_inf[0].length != 1 || isKanji(morph_inf[2].to_i))
end

mc = MeCab::Tagger.new('--node-format=%m\t%f[0]\t%t\n --eos-format=\tEOS\n')

while gets
  uniq_morphs = Set.new
  begin
    morphs = mc.parse($_).force_encoding("utf-8").split("\n")
  rescue
    next
  end
  morphs.each do |morph|
    morph_inf = morph.split("\t")
    uniq_morphs.add(morph_inf[0]) if isAcceptableNoun(morph_inf)
  end
  uniq_morphs.each do |uniq_morph|
    puts uniq_morph
  end
end

ついでに

mc.parse($_).force_encoding("utf-8").split("\n")

という行のsplit()でエラーになることがあるので、その場合の例外は握り潰すようにしておきました。合成文字によってエラーになるようですが、そのツイートごと無視することにします。

このスクリプトによって、同じ日のツイートを再解析してみると、トレンドワードは次のようになりました。

TORE	    57.0
瑛	    38.6
チキンフィレダブル	    38.0
INFOBAR	    37.8
ッポイド	    37.0
A子	    32.0
カミスン	    28.6
ラッキーセブン	    26.8
Lv	    24.0
ネプリーグ	    24.0

ちなみに「TORE」はテレビ番組です。そして「瑛」はテレビドラマですごい腹筋を披露していた俳優「瑛太」が分離されて判定されたものです。テレビの影響は相変わらず大きいですね。「ッポイド」はshindanmakerの「あなたをボーカロイドにしてみったー」をやった人が多かったためです。

Juman7.0で形態素解析してみる

瑛太」の解析が崩れてしまうのはMeCabというよりは辞書(ipadic)に原因があるのだろうと思いますが、辞書を修正するにしても、現実的にはいくら頑張っても未知語(辞書にない語)はあるわけですし、文字列をどんな形態素かと捉えるためのコスト調整(というもの)はあちらを立てればこちらが立たずという感じでなかなか難しいものです。

MeCabよりも古い歴史を持つ形態素解析ソフトウェアにJumanがあります。つい最近、新しいバージョンのJuman 7.0が発表されました。
Jumanのwebページによれば、このJuman 7.0ではWebでよく書かれる、次のようなひどい日本語(?)も解析できるとのことです。

  • ビミョーだ
  • がんがる
  • ありがとー
  • 行きたぁぁぁい

改めて考えてみると、昔は文語よりも口語のほうがくだけていたように思いますが、いまは文語のほうがくだけているのかもしれません。

次の2文をMeCabとJumanで解析させてみます。

MeCabでは次のようになります。

瑛	名詞,固有名詞,人名,名,*,*,瑛,アキラ,アキラ
太っ	動詞,自立,*,*,五段・ラ行,連用タ接続,太る,フトッ,フトッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
『	記号,括弧開,*,*,*,*,『,『,『
ラッキー	名詞,形容動詞語幹,*,*,*,*,ラッキー,ラッキー,ラッキー
7	名詞,数,*,*,*,*,*
』	記号,括弧閉,*,*,*,*,』,』,』
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
も	助詞,係助詞,*,*,*,*,も,モ,モ
出	動詞,自立,*,*,一段,連用形,出る,デ,デ
てる	動詞,非自立,*,*,一段,基本形,てる,テル,テル
けど	助詞,接続助詞,*,*,*,*,けど,ケド,ケド
、	記号,読点,*,*,*,*,、,、,、
『	記号,括弧開,*,*,*,*,『,『,『
ワイルド	名詞,形容動詞語幹,*,*,*,*,ワイルド,ワイルド,ワイルド
7	名詞,数,*,*,*,*,*
』	記号,括弧閉,*,*,*,*,』,』,』
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
も	助詞,係助詞,*,*,*,*,も,モ,モ
出	動詞,自立,*,*,一段,連用形,出る,デ,デ
て	動詞,非自立,*,*,一段,未然形,てる,テ,テ
なかっ	助動詞,*,*,*,特殊・ナイ,連用タ接続,ない,ナカッ,ナカッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
か	助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
!?	名詞,サ変接続,*,*,*,*,*
EOS
瑛	名詞,固有名詞,人名,名,*,*,瑛,アキラ,アキラ
太い	形容詞,自立,*,*,形容詞・アウオ段,基本形,太い,フトイ,フトイ
い	名詞,一般,*,*,*,*,い,イ,イ
から	助詞,格助詞,一般,*,*,*,から,カラ,カラ
だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
や	助動詞,*,*,*,特殊・ヤ,基本形,や,ヤ,ヤ
なあ	助詞,終助詞,*,*,*,*,なあ,ナア,ナー
EOS

Jumanでは次のようになります。

瑛太 瑛太 瑛太 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:テキスト"
って って って 助詞 9 副助詞 2 * 0 * 0 NIL
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
『 『 『 特殊 1 括弧始 3 * 0 * 0 NIL
ラッキー らっきー ラッキーだ 形容詞 3 * 0 ナ形容詞 21 語幹 1 "代表表記:ラッキーだ/らっきーだ"
7 7 7 未定義語 15 その他 1 * 0 * 0 NIL
』 』 』 特殊 1 括弧終 4 * 0 * 0 NIL
に に に 助詞 9 格助詞 1 * 0 * 0 NIL
@ に に に 助詞 9 接続助詞 3 * 0 * 0 NIL
も も も 助詞 9 副助詞 2 * 0 * 0 NIL
出て でて 出る 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:出る/でる 補文ト 自他動詞:他:出す/だす 反義:動詞:入る/はいる"
る る る 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:る/る"
けど けど けど 助詞 9 接続助詞 3 * 0 * 0 NIL
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
『 『 『 特殊 1 括弧始 3 * 0 * 0 NIL
ワイルド ワイルド ワイルドだ 形容詞 3 * 0 ナ形容詞 21 語幹 1 "自動獲得:テキスト"
7 7 7 未定義語 15 その他 1 * 0 * 0 NIL
』 』 』 特殊 1 括弧終 4 * 0 * 0 NIL
に に に 助詞 9 格助詞 1 * 0 * 0 NIL
@ に に に 助詞 9 接続助詞 3 * 0 * 0 NIL
も も も 助詞 9 副助詞 2 * 0 * 0 NIL
出て でて 出る 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:出る/でる 補文ト 自他動詞:他:出す/だす 反義:動詞:入る/はいる"
なかった なかった ない 接尾辞 14 形容詞性述語接尾辞 5 イ形容詞アウオ段 18 タ形 8 "代表表記:ない/ない"
か か か 助詞 9 接続助詞 3 * 0 * 0 NIL
!? !? !? 未定義語 15 その他 1 * 0 * 0 NIL
EOS
瑛太 瑛太 瑛太 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:テキスト"
いい いい いい 形容詞 3 * 0 イ形容詞イ段 19 基本形 2 "代表表記:良い/よい 反義:形容詞:悪い/わるい"
からだ からだ からだ 名詞 6 普通名詞 1 * 0 * 0 "代表表記:体/からだ 漢字読み:訓 カテゴリ:動物"
や や や 助詞 9 接続助詞 3 * 0 * 0 NIL
なあ なあ なあ 感動詞 12 * 0 * 0 * 0 "代表表記:なあ/なあ"
EOS

瑛太」勝負ではJumanが勝利しました。とくに2番目の文がいやらしいというか面白く、「太い」という2文字に引っ張られたせいで周辺部もダメになっていますね。
瑛太」の代わりに「杉山」を使うとMeCabでも次のようになります

杉山	名詞,固有名詞,人名,姓,*,*,杉山,スギヤマ,スギヤマ
いい	形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
からだ	名詞,一般,*,*,*,*,からだ,カラダ,カラダ
や	助動詞,*,*,*,特殊・ヤ,基本形,や,ヤ,ヤ
なあ	助詞,終助詞,*,*,*,*,なあ,ナア,ナー

この場合は「からだ」も1つの形態素として正しく解析されますね。いいからだになりたいものです。