Monthly Hacker's Blog

プログラミングや機械学習の記事を中心に書きます。

レシピの材料名の表記ゆれに対処する

tl;dr

  • 日本語における自然言語処理では表記ゆれが大きな問題である。
  • word2vecを使えば辞書や正解ラベルに頼らない(作らない)で済む。
  • 文章ではなくてもdoc2vecを使うと安定する。

はじめに

こんにちは、さかぱ(@zacapa_23) です。8ヶ月前に修論が終わり、今は社畜です。

今日、cookpadさんのブログを見て、「あっ!修論でやったやつに似てる!」と思い、「こんなやり方もあるんですよ。」と気持ちが高まったので書きます。
techlife.cookpad.com

表記ゆれは日本語での自然言語処理では大きな課題で、様々な論文で「表記ゆれのせいでうまくいかなかった。」という文言が散見されます。
2015年には日本語解析システム 雪だるま - 雪だるまプロジェクトで、地道に辞書を作成しているようで、開発理念の最後の1文からも表記ゆれ問題の深刻さが伺えますね。

一つ一つの技術を積み重ねていかない限り、高度な自然言語処理は実現しない。自然言語処理は総合芸術のようなもので、モデルのパラメータを一ついじるだけで問題が解決するような世界では決してない。

辞書レベル、単語レベルから地味で泥臭い積み重ねを行い、及びそれを蓄積していくことで初めて次の技術の突破口になる。いくら個別の技術を個別に研究していても、自然言語処理の全体像はいつまでも明らかになってくれない。しっかりとした土台を造り、基礎を固めていかなくてはならず、それを実現していない状態で最上階から見える景観の議論をやっていても不毛ではないのか。

学会発表の考察で、「形態素解析の解析誤り」とか「表記ゆれ」とかいう文言はもう聞きたくない。

日本語解析システム 雪だるま - 雪だるまプロジェクト, 開発理念より引用

表記ゆれ問題とは

修論ではcookpadの材料データを扱っていたので、それを例にすると以下の通り。自然言語処理では単語をid化するので、表記ゆれを放置するとそれぞれ別のidになってしまい、やりたいことの精度性能に悪影響を及ぼします。

  • 文字種: たまねぎ, タマネギ, 玉葱
  • 漢字: 醤油, 醬油, 酱油
  • 略語: チョコ, チョコレート
  • 同義語*1: しそ, 大葉
  • 書き間違え*2: ごぼう, こぼう, ごほう

word2vecによる対処結果

レシピに使われる材料を1文にしてword2vecすると、以下のように学習できます。でもアジやカツオに鶏もも肉やポテトが入っていますね。

f:id:ron_zacapa:20170302155130p:plainf:id:ron_zacapa:20170302155136p:plain

  • なす: ナス, 茄子, なすび, 長なす, 長茄子
  • チョコレート: 板チョコ, チョコ, ビターチョコレート, ビターチョコ, スイートチョコレート
  • 玉葱: 玉ねぎ, タマネギ, 玉ネギ, たまねぎ, 玉ねぎ中
  • アジ: 鯵, 鳥もも肉, 鰯, 鶏もも肉, さんま
  • かつお: カツオ, お好みのお刺身, かつおぶし, 冷凍の皮つきポテト, 鰹節
  • ブリ: ぶり, ぶりの切り身, ブリの切り身, カレイ, 秋刀魚

doc2vecによる対処結果

そこでレシピのカテゴリを1文書としてdoc2vecをするとword2vecのときよりも、うまく学習できます。

f:id:ron_zacapa:20170302155149p:plainf:id:ron_zacapa:20170302155153p:plain

  • なす: なすび, ナス, 茄子, 長なす, 長茄子
  • チョコレート: 板チョコ, チョコ, 板チョコレート, 明治ミルクチョコレート, ミルクチョコレート
  • 玉葱: 玉ねぎ, タマネギ, 玉ネギ, たまねぎ, 玉ねぎ中
  • アジ: 鯵, いわし, 秋刀魚, サンマ, イワシ
  • かつお: かつおのたたき, 鰹のたたき, カツオ, 鯵, 鰯
  • ブリ: ぶり, ぶりの切り身, 鰤, ぶり切り身, さんま

さいごに

word2vecは文脈に合わせて単語を推測するので、他の材料から材料を推測するタスクも難しくなさそうです。
doc2vecだと料理カテゴリ特有の材料を上手く学習できるので、低頻度の材料にも対応できます。

勢いに任せて書きました。もし詳しい手法が知りたいって人がいたらコメントください。できる限り答えます。

p.s.

ちなみにfastTextでは上手く行きませんでした。英語ではfastTextを使うと、表記ゆれ*3に対応できるが、日本語は部分文字列で構成される単語が少ないため、上手く行かないのかなと思います。

*1:同義語は表記ゆれに含まれないかも知れません。

*2:ユーザ投稿(自由記述)タイプ特有の問題ですが。

*3:複数形のsや過去形のed等