iVoca で単語の難易度を取得する API を試験リリース(項目反応理論)


英単語タイピングゲーム 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:実際は中央に寄せるため、分散を少し大きくしている