こんにちは!技術部機械学習グループの山口(@altescy)です。
先日、沖縄にて開催された言語処理学会第29回年次大会(NLP2023)に参加してきました。 今年の大会は過去最多の参加者数となり、かつ久しぶりの本格的なオフライン開催ということで大変活気のある大会になったかと思います。 クックパッドからもML/NLPエンジニア3名が参加し、研究発表を行いました。
今週のTechLifeでは、今回から発表編、聴講編、座長編の3回に渡ってNLP2023の参加報告を各参加メンバーからお伝えしたいと思います。 ぜひお楽しみください!
クックパッドと自然言語処理
NLP2023での様子をお伝えする前に、クックパッドにおける自然言語処理技術・研究に関する取り組みについて紹介させてください。
クックパッドで主に扱われるレシピデータはその情報の大部分が自然言語で記述されるため、サービスや社内において自然言語処理が活躍する場面が多くあります。 レシピのカテゴリ分類、レシピからの固有表現抽出、レシピ入力補助のための食材提案、レシピの分量予測など、レシピを対象にしたものだけでも非常にユニークなタスクで溢れています。 これまでにも上記のような業務における課題解決の中で生まれた成果を研究としてまとめて言語処理学会をはじめとした大会などで発表してきました。
例えば直近2年の言語処理学会年次大会 (NLP2021, NLP2022) では以下のような研究発表を行っています。
- NLP2021
- NLP2022
その他にもクックパッドでは多数の研究活動を行っていて、過去に発表した内容は research.cookpad.comから見ることができます。 今回もこうした研究活動の一環として NLP2023 に参加してきました。
NLP2023での発表の紹介
今大会では『レシピに含まれる不使用な材料等に関する記述の抽出』という題で研究成果の発表を行いました。 この研究では題の通りレシピ中のテキストに含まれる、不使用であることが明記された材料・調理器具・調理工程の記述を抽出するタスクに取り組んでいます。
不使用に着目する大きなモチベーションのひとつとしてあげられるのはレシピ検索における課題です。 通常の転置インデックスを用いた検索システムでレシピを検索する場合、「卵」で検索すると「卵なし」と記載されたレシピが検索結果に載ることがあります。 多くの場合、「卵」でレシピを検索するユーザーは卵を使ったレシピを探している可能性が高いと考えらるため、「卵なし」のレシピが登場すると違和感を感じるかもしれません。 そこで、レシピ中のテキストにおいて使わないアイテムをあらかじめ検出しておけば検索体験の改善に繋げられるのではと考え、不使用に関する記述を抽出するモデルの開発に取り掛かりました。
また、この研究はインターンシップに参加していただいた染谷大河さんと共に進めました。 染谷さんには特に後述のデータ拡張の検討や手法の比較実験に注力していただき、有意義な結果を残すことができました。 クックパッドでは自然言語処理や機械学習を扱う就業型インターンシップを募集していますので、ご興味のある方はぜひご応募ください!
Cookpad 採用サイト - [就業型インターンシップ] 機械学習コース
データセットの準備
モデルの学習・評価に用いるデータセットを作成するために、社内のアノテーターに依頼して1万件のレシピのタイトルと説明文に含まれる不使用な材料・調理器具・調理工程のスパンのアノテーションを行いました。 下図のようにテキストに対して不使用の対象となる領域とそのカテゴリを付与しています。
作成したデータセットの統計は以下のようになりました。
不使用の記述を含むデータ数(# texts w/ spans
)はそうでないものと比べて少ないことがわかります。
そこで、より多くの正例を学習に利用できるように不使用の記述に着目したデータ拡張を試すことにしました。
今回は以下3つのデータ拡張手法を検討しています。 より詳細な設定は論文をご確認ください。
不使用抽出モデルの仕組み
今回作成したモデルは不使用と書かれたアイテムの領域を予測するスパン抽出モデルと、抽出したスパンのフィルタリングを行うモデルの2つから構成されます。
まず、スパン抽出モデルは BiGRU-CRF を用いた系列ラベリングにより不使用の記述とそのカテゴリを予測します。 BiGRU-CRF の入力は文字レベルで分割されたトークンです。 単語の境界の情報を与えるために、形態素解析により得られた品詞の情報を BIOUL スキーマでエンコードした系列を文字列と合わせて入力しています。 出力は材料・調理器具・調理工程のそれぞれのスパンに対応する BIOUL タグ系列となります。
入力テキストからスパンを抽出した後はフィルタ処理を行います。 ここではレシピの材料欄の内容を元に誤って抽出されたと考えられるスパンを除去します。 抽出したスパンのテキストと材料欄に書かれた材料名をそれぞれ正規化し1、もし材料欄の内容と一致するスパンがあればそれらを取り除く、という仕組みです。 スパン抽出モデルが抽出したスパンの中から実際にレシピ中で使われていそうな材料を取り除くことで Precision の改善が期待できます。
実験結果
提案手法を使ってテストデータに対して予測を行った結果が以下の表になります。 ベースラインとして、辞書ベースで抽出を行う手法 (Dictionary-based Extractor) と依存構造解析の結果を使う手法 (Dependency-based Extractor) を用意しました。
2つのベースライン手法に比べて、提案手法は F1 スコアで +20% 以上高い精度を達成しています。 データ拡張も Precision の向上に貢献し、全ての拡張手法を適用した場合に F1 スコアにおいて +2.1% の向上が見られました。 また、材料欄に基づくスパンのフィルタ処理も Precision の改善 (+2.3%) が確認でき、F1 スコアでも +1% の改善となりました。
誤りの例を見てみると「〜の代わりに」や「〜を避けたい」のように「なし」や「不使用」などに比べてレアな表現であることがわかりました。 また、カテゴリごとの結果を見てみると材料や調理器具は F1 86% 程度であるのに対し、調理工程は F1 77% 程度と他に比べて悪い結果でした。 材料や調理器具は一般名詞である場合が多いのに対して調理工程は「一晩水に浸け」や「粉をふるう」のように複雑な表現が存在するため、それが精度低下の要因になった可能性があります。 不使用抽出タスクにおいては、こうした多様な表現にいかに対応するかが今後の課題となりそうです2。
ちなみに、最近話題の ChatGPT はこのタスクを上手く扱うことができるのでしょうか? 以下の画像は zero-shot / few-shot の設定で GPT-4 に不使用検出タスクを解いてもらった結果になります。
抽出したスパンとラベルの関係は正しく対応していますが、「さつまいも」や「ボウル」のように使用するアイテムも抽出されてしまいました。 もし人間がこのプロンプトを見たのであれば、このように間違うことは少ない気がします。 もちろん、プロンプトをもっとチューニングしたり、Chain-of-thought のようなテクニックと組み合わせることで改善する可能性はありますが、期待した結果を得るにはそれなりの工夫が必要そうです。 NLP2023でもLLMが否定表現を上手く扱えない可能性を示す研究があったように、「不使用」も LLM にとって苦手な表現なのかもしれません。
おわりに
NLP2023で発表したレシピから不使用に関する記述を抽出する研究について紹介しました。 今後は抽出した結果を使って実際にレシピ検索の改善などに応用できるか確かめていく予定です。
次回は聴講編として深澤(@fukkaa1225)が NLP2023 で発表された研究から特に興味深かったものをピックアップして紹介します!
- 材料名の正規化に関する記事はこちら: https://techlife.cookpad.com/entry/2017/10/30/080102↩
- RoBERTa などの事前学習済みモデルを使う方法も試しましたが、F1における精度向上は +1% ほどと限られたものでした。↩