読者です 読者をやめる 読者になる 読者になる

tomoima525's blog

Androidとか技術とかその他気になったことを書いているブログ。世界の秘密はカレーの中にある!サンフランシスコから発信中。

ジロリアン(ラーメン二郎愛好者)界のスーパースター @habomaijiro 氏の2015年"完飲"生活についてツイートから解析してみる

f:id:tomoima525:20151231130146p:plain:w400
@habomaijiro氏をご存知でしょうか。ほぼ毎日どこかしらのラーメン二郎店舗に出没し、大盛りの二郎を完飲(スープまで飲み干すこと)している筋金入りのジロリアンです。また、その食事レポートは日々Twitterに投稿されています。 "麺、ザクザク喰えるもの" , "神域ブタ" 等、独特の表現を用いたツイートはジロリアンだけでなく一般人にも大人気です。間違いなくジロリアン界一番の有名人と言っても過言ではないでしょう。

自分も彼のツイートを楽しみにしている一人なのですが、ふと気になりました。一体彼がどれだけ完飲し、どんな二郎を味わっているのでしょうか?

Twitter API形態素解析を使って、解析してみることにしました。

やったこと

以下の機能を持った小さなjavaプログラムを書いてみました。

  • 過去1年(2015/1/1 - 2015/12/30)のツイートを取得する
  • 形態素解析を行う
  • TermVectorで単語の頻出度を出す

ソースコードこちらになります。 以前自分の1年間のツイートを解析したこちらの記事で書いたプログラムがベースになっていますが、機能の統合などフルスクラッチで書き直しました。

結果と考察

f:id:tomoima525:20151231125842p:plain:w400

ツイート回数

ツイート数は330件、3/16/2015からでした。ログはこちらにあります。ほぼ毎日ツイートしている様子ですね。

頻出ワード

10回以上でている頻出ワードの結果はこちらにあります。結果を元に、気になった点を考察してみたいと思います。

今年何回"完飲"したのか

ツイートにほぼ必ずある"完飲"というキーワードで抽出しました。

回数          ワード
val: 300     t: 完飲

実に300回の完飲ッ...! 最初のツイート日3/16から12/31まで290日あるので、1日1回以上二郎を完飲していた日が何日間かあったようです。やばい。

何曜日によく"完飲"しているのか

回数          ワード
val: 50      t: 土曜日
val: 50      t: 木曜日
val: 50      t: 金曜日
val: 46      t: 水曜日
val: 46      t: 火曜日
val: 44      t: 月曜日
val: 38      t: 日曜日

結果を見ると、ほぼ同率、日曜、月はお休みのことが比較的多いようです。スロースターターなんでしょうか。

@habomaijiro氏の好きなフレーズは?

@habomaijiro氏の独特の言葉使いで頻出するものをピックアップしてみました。

回数          ワード
val: 87      t: 俺好み
val: 83      t: ウンメ(ウッメェェッ,ウンメ〜,ウッメェッ,マイウ〜ッを含む)
val: 38      t: ウッメ
val: 76      t: 染みる("味染みてプルと柔らか神域ブタ。","今日の麺、メッチャ味染みる"等)

この辺が頻出なようです。"ごっそさん"は最初の頃はよく使っていたフレーズですが、最近は使ってないようで、42件しかありませんでした。 個人的に好きなフレーズである以下は思ったほど多くなかったでした。

回数          ワード
val: 25      t: 神域
val: 19      t: ミルキィ
val: 19      t: 奮える
val: 12      t: ズル

@habomaijiro氏は一杯に平均いくら使っている?

値段データで抽出した結果がこちらになります。 平均1009円、中央値975円でした。量の割に比較的安いことで知られる二郎ですが、この値段となっているのはトッピングが多いことが原因なのでしょう。 なお、一番高かった1835円は二郎じゃなかったのが意外でした。二郎以外も食べているんですね。(ラーメンじゃないですが面倒なので計算には入れてます)

f:id:tomoima525:20151231125220p:plain:w400

@habomaijiro氏の好きなラーメンの傾向は?

続いて、@habomaijiro氏の好きなラーメンについて考察してみましょう。 食べ物のキーワード上位5つを抽出してみました。

回数          ワード
val: 249     t: ニンニク
val: 238     t: 生卵
val: 132     t: ブタ
val: 89      t: 玉子
val: 85      t: うずら

とにかく卵が好きなようです。生卵+生卵がデフォ。 f:id:tomoima525:20151231125316p:plain:w400

一方で野菜に関するフレーズが"ネギ"くらいしかなかったのが印象的でした。 また二郎の味については

回数          ワード
val: 67      t: 醤油
val: 47      t: 塩
val: 40      t: 塩気
val: 23      t: 味噌

ということで、基本は醤油ですが、塩気効いたスープがお気に入りのようですね。

以上をまとめると、 醤油系でニンニク、卵、ブタどっさり、全体的に味染みて塩気があるもの が@habomaijiro氏の"俺好み"のようでした。

f:id:tomoima525:20151231125357p:plain:w400

実装的な話

ちょっとだけ実装的な話についても触れておきます。今回形態素解析をkuromojiで行ったのですが、単純なJapaneseAnalyzerですと、上手に解析出来ない部分があったので、以下の調整を加えました。

stopwordの編集

素のママで形態素解析をかけると、以下のように"n","27"などの解析には不要な用語が混じり込んできます。そのため、stopwordを追加することにしました。

val: 873      t: n
val: 530         t: ラーメン
val: 364         t: 汁
val: 340         t: 27
val: 332         t: t
val: 331         t: 日
val: 327         t: co
val: 326         t: yen

JapaneseAnalyzerソースコードを読んだところ、StopwordAnalyzerBase を継承してCustomJapaneseAnalyzerを作り、その中で以下のようにCustomのSetHolderを作ってあげれば良いようなので、そのようにしています。

private static class CustomSetHolder {
  static final CharArraySet CUSTOM_STOP_SET;
  static final Set<String> CUSTOM_STOP_TAGS;
  static {
    try {
      CUSTOM_STOP_SET = loadStopwordSet(true, CustomJapaneseAnalyzer.class, "stopwords.txt", "#");  // ignore case
      final CharArraySet tagset = loadStopwordSet(false, CustomJapaneseAnalyzer.class, "stoptags.txt", "#");
      CUSTOM_STOP_TAGS = new HashSet<>();
      for (Object element : tagset) {
        char chars[] = (char[]) element;
        CUSTOM_STOP_TAGS.add(new String(chars));
      }
    } catch (IOException ex) {
      // default set should always be present as it is part of the distribution (JAR)
      throw new RuntimeException("Unable to load default stopword or stoptag set");
    }
  }
}

stopword.txtにはちまちま不要なワードを追加しました。 LowerFilterをつけて1文字の単語を省くことも検討したのですが、"麺","汁"といった単語もあるので、見送りました。

userDictionaryの追加

@habomaijiro氏の表現は"俺好み","完飲"独特なものがいくつかあります。これらは通常の形態素解析では拾うことができません。そのため今回はuserDicitonaryを利用しました。 userDictionaryは以下のように定義し、Analyzerの引数にいれてやります。

UserDictionary dictionary;
  try {
      //ReaderからuserDictionaryを呼び出す
      Reader reader = IOUtils.getDecodingReader(WordCount.class.getResourceAsStream("userDic.txt"), StandardCharsets.UTF_8);
      dictionary = new UserDictionary(reader);
      } catch (IOException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
      dictionary = null;
  }
  analyzer = new CustomJapaneseAnalyzer(Version.LUCENE_4_9,
          dictionary,
          Mode.NORMAL,
          CustomJapaneseAnalyzer.getStopSet(), CustomJapaneseAnalyzer.getStopTags()); 
            

userDic.txtは、これもまたちまちま自分で追加していきます。@habomaijiro氏のすごいところは、ウマイの表現だけでこれだけあるという点です。

ウッメェェッ,ウンメ,うめえ,カスタム感嘆詞
ウンメ〜,ウンメ,うめえ,カスタム感嘆詞
ウッメェッ,ウンメ,うめえ,カスタム感嘆詞
ウッメ,ウンメ,うめえ,カスタム感嘆詞
マイウ〜ッ,ウンメ,うめえ,カスタム感嘆詞

また大好きな卵も複数の表記がありますので、油断できませんでした。

生卵,生卵,なまたまご,カスタム名詞
生たまご,生卵,なまたまご,カスタム名詞
生玉子,生卵,なまたまご,カスタム名詞
なまたまご,生卵,なまたまご,カスタム名詞

今回はあまり深く調査しませんでしたが、綺麗に分類ができないワード("ブタ"等)もありました。詳しくはソースコードや以下の参考サイトを見ていただくとよいです。

まとめ

しかしこれだけラーメンの画像みるとお腹すいてきましたね!来年も@habomaijiro氏を応援したい所存です。完飲! f:id:tomoima525:20151231130021p:plain:w400