タスクに合わせたトークナイザ、単語分割に関連したポエム

ポエムを適当に書きます。2本立て。週末のノリなので、適当です。

Sentencepieceの紹介記事を読んだ

ニューラル言語処理向けトークナイザのSentencepieceについて書かれた紹介記事を読みました。

自分用の要約すると

  • ニューラル言語処理では語彙数が大きくなると扱いにくい
  • 単語をサブワードに分割できるものは分割して、語彙数を制限する(数千から数万)方法がよく使われる
    • 尤度を最大にするエントロピー圧縮の一部と見なせる
  • スペースもメタ文字に置き換えて生文を食わせることにより、detokenizeが言語によらず簡単になる
    • 翻訳等のタスクで助かる!
    • こういうのが必要なくなる
    • 単語分割されたものからさらに分割するわけではなく、生文からやるために計算量オーダーの削減が行なわれている
  • 従来の単語分割手法を凌ぐBLEUスコアを達成している

ということでした。ちまたで話題のneologdを使うと逆にBLEUスコアが(mecabのときよりも)落ちてしまうという実験結果もあって、応用に即した単語分割を使うべきという工藤さんの主張に(再び)納得でした。

余談ですが、生命科学系の研究所(DBCLS)でバイトした経験から、M1の初期は応用タスクに最適化された単語分割を学習できないかと思って少し考えた時期がありました。Sentencepieceのようなシンプルな手法がニューラル言語処理向けトークナイザとして役に立つのは面白いなあと、一人でテンションが上がりました。ちなみに、M1の初期のやつは、Joint Learning的なノリで解けないかと思っていましたが、挫折で終わりました…。

文書分類でneologdとmecabを比較した

「応用に即した単語分割を使うべき」というエントリを読んだのと、週末のノリで単語分割を変えてあれこれ遊びたいという欲求が湧いたので、自分のbotで試してみました。機械学習のエントリかどうかを判定してくれるbot君です。

タイトルと本文をそれぞれ形態素解析、BoWとして放り込むだけの手抜き実装です。この形態素解析の部分をneologdを使う/使わないで比較してみました。学習/テストデータの分け方で精度が変わってくるため、10回ランダムにデータを分割、F値の平均と標準偏差を出してみました。

平均 標準偏差
mecab 0.747 0.0056
neologd 0.766 0.0066

neologdを用いた場合、BoWの次元数がmecabの場合よりも増加していました。人工知能の話題でよく出てくる「東ロボくん」もneolodgでは一単語として認識されているので、このような単語により精度が上がっていそうかな。

% echo "東ロボくん" | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
東ロボくん      名詞,固有名詞,一般,*,*,*,東ロボくん,トウロボクン,トウロボクン
EOS
% echo "東ロボくん" | mecab
東      名詞,一般,*,*,*,*,東,ヒガシ,ヒガシ
ロボ    名詞,一般,*,*,*,*,*
くん    名詞,接尾,人名,*,*,*,くん,クン,クン
EOS

@overlastさんが過去のNL研等で報告されているように、文書分類のタスクではneologdは有効そうなことが分かりました。

まとめ

謎のテンションなので特にまとめはないですが、応用タスクによって単語分割を使い分けることを検討してみてもよさそうです。

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)