Python
python3
fastText

オタク向け学習済みfasttextを公開しました

初めに

こんにちは。
最近、word2vecを始めとした分散表現によるベクトル化が人気です。
しかし、Wikipediaで学習させたといった、"真面目な"例はあるもののいわゆる"遊んでみた"といった記事も少ないと思います。
僕が捜したところ(モデルが公開されている例が)このサイトしか見つかりませんでた。(多分探せば他にもあるとは思います)
だからといって、自分で学習済みモデルを作るのも面倒ですよね。
そこで今回の記事です。
今回はfasttextでオタク向けのモデルを作ります。

どのコーパスを使ったか

アニヲタWikiのほぼ全記事(563MB)を学習させました。
単語数は198536個で、ベクトルサイズは200次元です。
一応、サーバーには負担をかけないようにしたつもりです。
分かち書きにはmecab-ipadic-NEologdを使いました。
binとvec両方含んである物もあるのでお好みで使い分けてください。

ダウンロード

ダウンロード
注意:両方含んだ方のzipファイルサイズは大きいです。
ライセンスはMIT Licenseです。

使い方

gensimの場合

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('model.vec', binary=False)

検証

ベクトル化は上手くいっているのか?
という疑問の声を聞かれそうなので、検証結果を載せておきます。

上手くいった例

>>> model.most_similar(positive=['雪ノ下雪乃'])
[('由比ヶ浜結衣', 0.8398512005805969), ('比企谷八幡', 0.8388717770576477), ('井上心葉', 0.8085094690322876), ('やはり俺の青春ラブコメはまちがっている。', 0.7935140132904053), ('嘘つきみーくんと壊れたまーちゃん', 0.7915672659873962), ('天野遠子', 0.765424907207489), ('木下秀吉', 0.7628801465034485), ('瀬川泉', 0.7601190805435181), ('小牧愛佳', 0.7600274682044983), ('小早川ゆたか', 0.759345293045044)]
#同じシリーズのキャラクターが出ている
>>> model.most_similar(positive=['王', '女'], negative=['男'])
[('女王', 0.5404699444770813), ('バルホルス', 0.5356605052947998), ('マギ・ヴァル', 0.5220056772232056), ('獅子心王', 0.5187593698501587), ('ゼテギネア', 0.5122318863868713), ('ファレナ', 0.5120536088943481), ('レファル・エディア', 0.5085812211036682), ('モルブディア', 0.507931113243103), ('ルキウス', 0.5058585405349731), ('ネサラ', 0.505682647228241)]
#こちらも一応、1位は上手くいっている
>>> model.most_similar(positive=['ロンドン', '日本'], negative=['イギリス'])
[('東京', 0.551081120967865), ('日本橋', 0.5485166907310486), ('日本勢', 0.5443987846374512), ('日本大', 0.543359100818634), ('日本三景', 0.5350313782691956), ('東京都心', 0.5298252105712891), ('日本犬', 0.529288649559021), ('日本進出', 0.5274679660797119), ('ロンドン大学', 0.5271546840667725), ('布袋劇', 0.5242681503295898)]
#上手くいっている

あまり上手くいかなかった例

>>> model.most_similar(positive=['パリ', '日本'], negative=['フランス'])
[('パリ郊外', 0.4626120924949646), ('日本の首都', 0.4594534635543823), ('日本の人', 0.4535835385322571), ('日本の刑務所', 0.4501851201057434), ('日本向け', 0.44550591707229614), ('日本国', 0.4448232054710388), ('富山県', 0.44453561305999756), ('日本の昔話', 0.44140082597732544), ('中国本土', 0.43912768363952637), ('パリパリ', 0.43846452236175537)]
>>> model.most_similar(positive=['うれしい', '泣く'], negative=['笑う'])
[('うれしいこと', 0.5961353182792664), ('嬉しい', 0.5788377523422241), ('うれしく', 0.5299932360649109), ('うれし', 0.5080203413963318), ('うれしゅう', 0.5042930841445923), ('うれしかっ', 0.5040944814682007), ('恋しい', 0.474494606256485), ('さみしく', 0.469252347946167), ('さみしかっ', 0.4595452547073364), ('ありがたい', 0.4571915864944458)]
>>> model.most_similar(positive=['雪ノ下雪乃', '男'], negative=['女'])
[('比企谷八幡', 0.7107969522476196), ('井上心葉', 0.6862789392471313), ('由比ヶ浜結衣', 0.678931713104248), ('嘘つき みーくんと壊れたまーちゃん', 0.676953911781311), ('木下秀吉', 0.6709913015365601), ('やはり俺の青春ラブコメはまちがっている。', 0.6639811992645264), ('鳳長太郎', 0.654731035232544), ('ねじ巻き精霊戦記', 0.6532943248748779), ('前田一也', 0.6506378054618835), ('大石秀一郎', 0.647756814956665)]
#これは賛否両論有りそうなので保留

考察

以上、検証結果でした。
僕は余りアニメ系は詳しくないので、もし「このアニメで上手くいった」とか「このアニメだと駄目だった」とか教えていただけると嬉しいです。
今回は前処理等をほとんどしてないのとデータの形式が特殊なためWikipediaを使ったデータに比べると劣っていると言わざるを得ません。
しかし、オタクに特化した学習済みモデルとして、そこそこの出来かと思います。