英単語タイピングゲーム iVoca にて、単語の難易度を取得する API を試験的に提供開始しました。
- http://ivoca.31tools.com/api/wordlevel?word=[単語] にアクセスすると、単語の難易度データを JSON 形式で返します
- 指定できる単語は言語に寄りません。英語に限らずイタリア語、フランス語、スペイン語、ドイツ語、……
- API が返す単語は iVoca の公開ブックに含まれるものに限ります。また、難易度を求めるには、その単語の学習データがある程度たまっている必要があります
- 返値の項目
- level
- 与えられた単語の難易度 (0.0〜9.9)
- reliability
- 難易度の信頼性(1〜10、難易度の推定に用いることができたデータが多いほど高い)
- sense
- 意味
- book_url
- 単語が含まれるブックの URL
- name
- 単語が含まれるブック名
例: http://ivoca.31tools.com/api/wordlevel?word=cabbage
[ { "reliability":6, "level":3.5, "sense":"キャベツ", "book_url":"http:\/\/ivoca.31tools.com\/book?id=38", "name":"食べ物の英単語" }, { "reliability":2, "level":1.7, "sense":"[名]キャベツ", "book_url":"http:\/\/ivoca.31tools.com\/book?id=241", "name":"英単語3000 part8" } ]
例: http://ivoca.31tools.com/api/wordlevel?word=reliability
[ { "reliability":7, "level":8.0, "sense":"信頼性", "book_url":"http:\/\/ivoca.31tools.com\/book?id=43", "name":"IT 用語の英単語" }, { "reliability":4, "level":0.6, "sense":"信頼性", "book_url":"http:\/\/ivoca.31tools.com\/book?id=73", "name":"工業英検3級対策 Vocabulary \"M-R\"" }, { "reliability":2, "level":9.2, "sense":"信頼性", "book_url":"http:\/\/ivoca.31tools.com\/book?id=344", "name":"TOEFL Standard 4" } ]
例: http://ivoca.31tools.com/api/wordlevel?word=lappola
[ { "reliability":7, "level":6.0, "sense":"ゴボウ", "book_url":"http:\/\/ivoca.31tools.com\/book?id=104", "name":"イタリア語の食べ物 90語" } ]
(例は読みやすさのため、適宜改行を入れています)
なお、このようなサービスに需要があるか、難易度の精度をあげるにはどういったことができるか、などを検証するための試験的なリリースなので、仕様の変更やサービスの中断・停止などを予告無く行うことがありますので、あらかじめご了承ください。
解説
あとはいつもの調子で。
大元は以前書いたこのブログの記事。
項目反応理論を使って、 iVoca の学習データから単語の難易度を出してみたら、それなりにそれっぽく。
実装は逐次ロジスティック回帰により、拍子抜けするほど簡単、という記事。
今回の単語難易度 API の実装も、基本はこのときのまま「2値のラッシュモデル+逐次勾配降下」。
特徴ベクトルをチューニングしつつ、IRT から算出される難易度を 0.0 から 9.9 にマッピングしたらほぼできあがりである。
なので、実装にまつわる工夫とかそういう話は、残念ながらない。
しかしこんな簡単なものであっても、実際のデータを使って実際にサービスとしてリリースする、となるといろんな課題が出てくるのが面白い。
- 追加学習をどのように行うか。ユーザがプレイする度に、更新された学習データに対して逐次勾配降下を行うということも可能だが、特定のアイテム/ユーザについて偏ってしまう。現状は1日1回、全データについて学習を行うようにしてみた。
- そもそもデータ自体が非常に偏っている。IRT はそれなりに偏っていても大丈夫という印象(ちゃんと勉強していないので、あくまでも「印象」)はあるが、iVoca のようなサービスの学習データはベキ分布なので、それでも大丈夫なのかどうかはとても興味がある。
- 追加アイテム/ユーザの特徴値の初期値をどうするか。現在、平均0分散1の正規乱数にしているが、0固定のほうがいいのかも。
- 難易度のマッピングは、平均0分散1の累積ロジスティック分布関数で 0.0〜1.0 に直したものを10倍している*1。
- 項目反応理論なので、ユーザの特徴値も計算されている。これも 0.0〜9.9 にマップして、ユーザ画面とかに出したら……おもしろいんだろうか?
上にも書いたとおり、こういうサービス(難易度データ)に需要があるのか、というあたりにも興味がある。
学習ツールやサービスで、単語の難易度があれば難しいものほど何度も復習させるとか、どっちの問題集が難しいか、とか、そういう判断が出来るようになるのになあ、とか、そういうことを考えちゃう人ってどれくらいいるのかな?
もちろん iVoca に登録されていない単語は当然難易度が取れない。そういう場合に「この単語の難易度が欲しいから iVoca に登録しよう!」(4,5人に学習してもらえれば、難易度が取れるようになる)という効果につながれば、さらに嬉しいところ。
*1:実際は中央に寄せるため、分散を少し大きくしている