以下のエンドポイントを持つWebサーバを実装せよ。
/select
:query
をHTTP GETすると、それを単語と解釈して保持している転置インデックスを引き、product_id
の辞書順に10件までの製品情報を返す。
ただし、転置インデックスは product_title
に張り、少なくとも query
との関連性が判定できる程度の製品情報を返すこと。
また、英語製品データを保持させた状態で、簡単に動作確認をせよ。
query
にスペース区切りで複数の単語を与えると、product_title
中に全ての単語を含む製品を返すようにせよ。
/select
の際に query
に加えて sort=tf
をHTTP GETすると、「query
中の単語が product_description
中に出現する回数」の降順に10件までの製品情報を返すようにせよ。
いくつかの適当な query
について、sort=tf
の有無どちらが優れた製品情報を返すか判定せよ。
新たに以下のエンドポイントを実装せよ。
/annotate
:query_id
をHTTP GETすると、英語結合データ上で紐づいた製品情報を返す。
前問で実装したエンドポイントを用いて、いくつかの適当な query_id
について、紐づいた全ての製品に手動でESCIラベル(Exact, Substitute, Complement, Irrelevantのいずれか)を付与せよ。
英語結合データには元々 esci_label
が含まれる。
これと前問の結果についてCohen's kappaを計算せよ。
query
で特別な単語 OR
に対応せよ。
この特別な単語が与えられた場合、この単語の左右それぞれが示す条件について、いずれかを満たす製品を返すようにせよ。
言い換えると、演算子の優先順位はスペースが先、OR
が後である。
ヒント:
query
を満たすproduct_id
の配列を構築するよりも、ポスティングリストを内包するイテレータや、他の複数のイテレータを内包するイテレータを書いたほうが効率的である。
転置インデックスを拡張する。
単語ごと製品ごとに、product_title
中の出現位置(先頭から何番目の単語として出現するか)の配列も保存するようにせよ。
ただし一般に、同じ単語が複数回出現する可能性があることに注意せよ。
単語ではなく単語の並び(フレーズ)を指定するための特別な単語 "
に対応せよ。
この単語でスペース区切りの複数の単語を挟むと、product_title
中にその単語の並びが出現する製品が返るようにせよ。
演算子の優先順位を任意に指定するための特別な単語 (
と )
に対応せよ。
例えば、Amazon HDMI OR Cable
と Amazon ( HDMI OR Cable )
で異なる製品情報が返るようにするということである。