Monoxer Intern Report #2_誤答生成の改善(egashira)

はじめに

モノグサでソフトウエアエンジニアのインターンに参加した江頭叙那です。現在は慶應義塾大学の環境情報学部3年に在籍していて、VR空間での運動が実空間での動作に与える影響について研究しています。

参加を決めた理由

私は学生時代から学習アプリなどを用いて、いかに楽に暗記できるかを工夫してきた経験があり、モノグサの記憶を手助けするサービスはとても興味があるものでした。また、アプリからフロントエンド、バックエンドまで幅広く開発を経験できることが魅力的でした。

モノグサでのインターンで主に取り組んだこと

私は今回のインターンで主に誤答生成の改善に取り組みました。 モノグサではBook内(学習する問題群)から誤答を生成する機能と、Book外から誤答を生成する機能があり、私はBook外から生成される誤答の改善に取り組みました。Book外から生成される誤答は、正解の単語と文字類似度が近い物が候補として選ばれるような仕組みとなっており、以下のような課題がありました。

  1. 品詞が一致していない場合がある
  2. 誤答の難易度が、正解と大きく異なる場合がある
  3. 十分な誤答候補数を得られなかった場合に、ランダムで関係のない単語が選ばれる

f:id:corp_monoxer:20211007112552p:plain

上記の課題によって、学習者が選択肢の中から消去法で正解を選べてしまうという問題がありました。

誤答の改善方法 

単語に頻度や品詞が紐づいたデータが必要だったため、単語と頻度が紐づいたデータを入手し、それらに品詞の情報を付与しました。品詞情報の付与にはStanza*1 を使用しました。 そして頻度や品詞別に単語をグループ分けし、グループ分けされた単語の中から、正解の単語と近い文字類似度を持つものを誤答として選ばれるようにしました。また、頻度や品詞別で取得した誤答の数が足りなかった場合には既存の手法で誤答を取得し、それらの単語が正解の品詞と頻度が近いほど選ばれやすいようにする改善を行いました。
具体的には誤答生成の流れを以下のように改善しました。

f:id:corp_monoxer:20211007112715p:plain f:id:corp_monoxer:20211007112734p:plain

誤答生成の流れを上記のように改善したことによって、品詞や頻度が異なる単語が誤答として選ばれにくくなりました。さらに新しいデータで単語を取得するステップを追加したことで、候補数が足りずに完全ランダムで誤答が追加されるケースも大幅に減りました。下記の改善例では正解と誤答の品詞が統一されており、消去法で選ばれにくくなったと思います。

f:id:corp_monoxer:20211007112803p:plain

得た学び

チーム開発は少し経験があったのですが、しっかりと会社でレビューを受けて開発を行うプロセスは初めてだったため、多くの学びがありました。まず入社して印象的だったのは、コードにコメントがほとんど書かれていない点でした。初めのうちはコードを読むのに苦労しましたが、開発のガイドラインに書かれていた「コメントがあっても、わかりにくいCodeを正当化することはできません。」という一文に非常に納得しました。おかげで変数名や可読性を意識してコードを書くようになりました。また、インターンで取り組むテーマの実装なども自分で考えることができたため、自分の実装計画を他の人に伝えるプロセスも大変勉強になりました。  

社員やメンターさんとの交流

メンターさんとは週に1~2回ほど1on1ミーティングがあったため、テーマの実装などの相談をしたり、業務以外のことも話すことができました。私は週3日ほど出社していたので、出社時に直接お話できたのがよかったです。他の社員さんやインターン生とはおやつ会などで話す機会があり、エンジニア以外の業務の話なども聞くことができました。また、CEOの竹内さんがたまに話しかけてくれたのが印象に残っています。インターン生である私のテーマや進捗も把握されていて、驚いたと同時に嬉しかったです。

インターンを通じての感想

私はインターン前まではReactを軽く触ったことがある程度の開発経験だったため、インターンでアプリ(iOS Android)、フロントエンド、バックエンドまで触ることができたのはとても貴重な経験でした。また、私が今回取り組んだ誤答改善のテーマは、既存の誤答生成の方法を大きく変えるものであったため、責任感を持ちながら開発に取り組むことができたのも非常に楽しかったです。

*1:Stanza - A Python NLP Package for Many Human Languages https://stanfordnlp.github.io/stanza/