めかぶ?すだち?

この記事はFUN Advent Calendarの11日目の記事です。 adventar.org

昨日はshirasayav5さんでした。 shiranuinui.github.io

自己紹介

Word2Vec*1を使った研究してます

来年度からは東京で働きます

はじめに

最初の予定ではコンビニのホットドッグをオススメしようと思ってましたが飽きてしまったので変えます

ちなみに個人的にはローソンのホットドッグとセブンのホットドッグが好きでパンがしっとりしたものを食べたい時はセブンでウインナーがジューシーなものを食べたいときはローソンにしています。値段はだいたい一緒です

ローソンのチリホットドッグも美味しいです

形態素解析機

本題です

みなさんは形態素解析機というものはご存知でしょうか

Mecabというものが有名だと思います。他にはRuby製のkuromojiも有名だと思います

すごくざっくりいうと単語に対して品詞などを特定するものです

例えば「会社のお金を使い込む」をMecabで形態素解析すると

会社 名詞,一般,*,*,*,*,会社,カイシャ,カイシャ

の 助詞,連体化,*,*,*,*,の,ノ,ノ

お金 名詞,一般,*,*,*,*,お金,オカネ,オカネ

を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ

使い込む 動詞,自立,*,*,五段・マ行,基本形,使い込む,ツカイコム,ツカイコム

になります

一般的な使い方としては文章を入力としてその文章に含まれる単語の品詞を特定し、名詞や動詞のみにフィルタリングするなどがあります

自然文章を対象とした研究であればかなりお世話になるツールと言えます

今回はSudachiという新しい形態素解析機のご紹介です   タスク管理アプリの方ではありません(https://dev.classmethod.jp/tool/sudachi/)

Sudachi

Sudachiとは、WorksApplicationsさんが開発した形態素解析機です

約1ヶ月前くらいにv0.1.0がリリースされました

元Chasenメンテナの高岡さんが開発しています

github.com

他の形態素解析ツールとの違いなどのスライド

t.co

Mecabやkuromojiと異なる点として省メモリであることなどがありますが、大きな1つの違いとして「正規化」というものがあります

正規化とはなんなのかというと、例えば「シュミレーション」と「シミュレーション」のような表記揺れに対して「シミュレーション」に統一することです

他にも送り仮名の違い、「使いこみ」と「使い込み」のような変換の違いを統一してくれます

この表記揺れというのはかなり複雑な問題で本来同じ意味である2つの単語が異なるものとして処理される可能性があります

例えば、

会社 の お金 を 使い込む
会社 の お金 を 使いこむ

の2つの文章は全く同じ文章であるのに漢字を変換するかしないかで類似度は0.8(4/5)になってしまいます。

本来であれば心温まる手作業で1つ1つ辞書を作り修正しなければいけないところをある程度は楽が出来ます

今回はこの超便利機能の正規化について実験を行いました

実験対象

ゲームレビューサイトmk2のnintendo 3DSのゲームレビュー

このサイトを実験対象にした理由は、ユーザーから投稿されたレビューであるため表記揺れが山ほどあるのでないかと思ったのと「シミュレーションゲーム」というジャンルがあるので「シュミレーション」と「シミュレーション」がめちゃくちゃ出てくるんじゃないかと思ったからです

SNSでも表記揺れは多く出現しがちなので良かったのですが過去の自分のツイートぐらいしかデータがなく過去のツイートを見るのは辛かったので辞めました

ちなみにシュミレーションという単語がレビューに多く含まれていたゲームは「ファイアーエムブレム 覚醒」でした

実験手順

実験手順としては 1. ゲームレビューをクローリング 1. 取得された文章をMecabとSudachiでそれぞれ形態素解析 1. 名詞と動詞、形容詞だけにフィルタリングし*2分かち書き*3 1. 分かち書きされた文章をそれぞれgensimのWord2Vecを用いて学習 1. 2つの学習結果を比較

で調査を行いました

Mecabでは正規化は行われませんので正規化なしのMecabと正規化ありのSudachiの違いを検証するものです Mecabは9日目の記事のuehara1414さんも使っていましたが拡張辞書として mecab-ipadic-neologdを使っています

未来大生のトレンドを知れるサービス「FUN TREND」を作ってみたuehara1414blog.wordpress.com

結果

いろいろ入力してみましたが面白かったもの、興味深いものを紹介いたします

「忍者」という入力に対して関連していると判断された単語

単語 類似度
固定 0.2742036283016205
降臨 0.2613376975059509
乱数 0.25779059529304504
物語 0.254666268825531
プリンセスプリキュア 0.2521257698535919
出入り 0.23701870441436768
安心 0.23156218230724335
こつ 0.22314965724945068
不向き 0.21753180027008057
SC 0.21550312638282776

プリキュアは忍者だったんですねー

  • Sudachi
単語 類似度
神器 0.2637416124343872
付け方 0.2479369342327118
box 0.24712923169136047
ace 0.2440178543329239
もったい 0.23105667531490326
マリベル 0.2295345962047577
ゼルダの伝説時のオカリナ3d 0.22730134427547455
おっさん 0.22543908655643463
パラレルワールド 0.22477799654006958
ハイスクールd×d 0.22431424260139465

おっさんが忍者でした、マリベルはドラクエですかね?

「ロボット」という入力に対して関連していると判断された単語

単語 類似度
十字 0.2513594925403595
パッド 0.2503074109554291
我慢 0.23809082806110382
鉱山 0.23738226294517517
特産 0.23582139611244202
記号 0.2356947809457779
金花 0.23352289199829102
使い 0.22769372165203094
古龍 0.22586342692375183
バースト 0.2221870869398117

古龍や鉱山、使いという単語を見るとモンハンのような気がします

  • Sudachi
単語 類似度
ロボボプラネット 0.2710425853729248
眠り 0.257391095161438
帳消し 0.24388960003852844
既存 0.2385057806968689
ゲット 0.23679396510124207
応援 0.23626789450645447
自分自身 0.23548564314842224
ほう 0.23243260383605957
分かれ道 0.2302807867527008
事件現場 0.22392229735851288

こちらはミステリーのような雰囲気が出ていますがもっとも類似度が高い単語として「カービィのロボボプラネット」が出力されています すごい

「馬」という入力に対して関連していると判断された単語

単語 類似度
些細な 0.25391948223114014
1種類 0.25197359919548035
ジュピターピクロス 0.24905437231063843
買い控え 0.23560309410095215
友情 0.2338598519563675
ソード 0.23023049533367157
託宣 0.22755567729473114
ガールズファッション3d☆めざせ!トップスタイリスト 0.22588399052619934
進入 0.219329833984375
こまめ 0.219301238656044

牝馬ってことなんでしょうか

  • Sudachi
単語 類似度
パール 0.25727373361587524
開示 0.2508084177970886
底上げ 0.23834645748138428
マリア 0.23764677345752716
é·¹ 0.23431171476840973
順当 0.22846585512161255
検事 0.22205126285552979
不思議 0.21848949790000916
ダービースタリオン 0.21799950301647186
現状 0.21797946095466614

ダービースタリオン!

まとめ

人間の目で見るとMecabよりもSudachiの方が関連している単語を出力出来ているような気がします

多分、正規化によって本来学習に含まれていなかった単語が正しく学習されたのが良かったのだと信じたいです

パラメタの調整などをもっと頑張ればもっとよい精度が出る可能性はあります

3DSとかだけじゃなくてSwitchやプレステのゲームも混ぜた方が良かったかも

もし余力があれば挑戦しまた記事にしたいと思います

明日は_manohitoさんです お楽しみに

余談

データを集めて形態素するまでよりもWord2Vecのパラメータを調整する方が辛かった

あと心温まる手作業とかも結構しました

最終的なパラメータは size=200, window=6, min_count=3, sg=1です、Skip-gramで学習しました

min_countはこの数字よりも出現頻度が低い単語は無視するオプションですがデフォルトの5とかだとかなり単語が失われてしまいました

*1:単語の分散表現を得る技術 QiitaやWebに分かりやすい記事が多くあります

*2:最終的な語彙数はMecabの方が11,057個、Sudachiの方が10,093個になった 正規化している分Sudachiの方が語彙数が少ない

*3:分かち書きとは単語ごとにスペースを入れる(「会社 の お金 を 使い込む」のように)。