💭
【FSRS】ts-fsrsについての紹介
について
ts-fsrsは自由間隔重複スケジューラ(FSRS)アルゴリズムを実装するための、TypeScriptで開発されたESモジュールパッケージです。このツールは、開発者がFSRSアルゴリズムを彼らのフラッシュカードアプリケーションに適用し、ユーザーの学習体験を向上させるのに役立ちます。
ts-fsrsの使用方法
Node.js (バージョン >= 16.0.0)を実行する環境を準備して、package.json
で"type":"module"
をデフォルトに設定してください。
npm install ts-fsrs
yarn install ts-fsrs
pnpm install ts-fsrs
例
import {createEmptyCard, formatDate, fsrs,
generatorParameters, Rating, Grades} from 'ts-fsrs';
const params = generatorParameters({enable_fuzz: true});
const f = fsrs(params);
const card = createEmptyCard(new Date('2022-2-1 10:00:00'));
// createEmptyCard();
const now = new Date('2022-2-2 10:00:00');// new Date();
const scheduling_cards = f.repeat(card, now);
// console.log(scheduling_cards);
Grades.forEach(grade => {
// [Rating.Again, Rating.Hard, Rating.Good, Rating.Easy]
const {log, card} = scheduling_cards[grade];
console.group(`${Rating[grade]}`);
console.table({
[`card_${Rating[grade]}`]: {
...card,
due: formatDate(card.due),
last_review: formatDate(card.last_review as Date),
},
});
console.table({
[`log_${Rating[grade]}`]: {
...log,
review: formatDate(log.review),
},
});
console.groupEnd();
console.log('--------------------------------------------------------');
});
もっと:
- 参考資料- Github Pages
- 参考スケジューラ - Github Pages
- ブラウザで使い方 (CDNを使用して ts-fsrs ESM パッケージにアクセスする)
- 実際のケース - Next.js+Prismaを利用する
基本的な使い方
1. 初期化:
まずは、空ぽっいカードインスタンスを作成して、現在の日付を設定します(デフォルトはシステムの現在時刻):
import {Card, createEmptyCard} from "ts-fsrs";
let card: Card = createEmptyCard();
// createEmptyCard(new Date('2022-2-1 10:00:00'));
// createEmptyCard(new Date(Date.UTC(2023, 9, 18, 14, 32, 3, 370)));
// createEmptyCard(new Date('2023-09-18T14:32:03.370Z'));
2. FSRSのパラメータ設定:
このts-fsrsライブラリは、カスタムSRSパラメータを許可します。generatorParameters
を使用して、SRSアルゴリズムの最終パラメータセットを生成します。以下は、最大間隔を設定する例です:
import {Card, createEmptyCard, generatorParameters, FSRSParameters} from "ts-fsrs";
let card: Card = createEmptyCard();
const params: FSRSParameters = generatorParameters({maximum_interval: 1000});
3. FSRSを使いしてスケジューリングする:
核心機能は「fsrs
」関数にあります。このrepeat
関数を呼び出すと、異なるユーザー評価に基づいて、カードセットのスケジュール結果が返されます。
import {
Card,
createEmptyCard,
generatorParameters,
FSRSParameters,
FSRS,
RecordLog,
} from "ts-fsrs";
let card: Card = createEmptyCard();
const f: FSRS = new FSRS(); // or const f: FSRS = fsrs(params);
let scheduling_cards: RecordLog = f.repeat(card, new Date());
4. スケジュールされたカードの取得:
scheduling_cardsオブジェクトがあると、ユーザーの評価に基づいてカードを取得できます。例えば、Good
評価でスケジュールされたカードにアクセスするには:
const good: RecordLogItem = scheduling_cards[Rating.Good];
const newCard: Card = good.card;
もちろん、各評価に対応するカードの新しい状態と履歴を取得できます:
scheduling_cards[Rating.Again].card
scheduling_cards[Rating.Again].log
scheduling_cards[Rating.Hard].card
scheduling_cards[Rating.Hard].log
scheduling_cards[Rating.Good].card
scheduling_cards[Rating.Good].log
scheduling_cards[Rating.Easy].card
scheduling_cards[Rating.Easy].log
5. カード属性の理解:
それぞれのCard
オブジェクトは、その状態、スケジュール、その他の指標を決定するさまざまな属性を含んでいます:
type Card = {
due: Date; // カードの次のレビュー日
stability: number; // 記憶の安定性
difficulty: number; // カードの難易度
elapsed_days: number; // 前回のレビューからの日数
scheduled_days: number; // 次のレビューの間隔日数
reps: number; // カードのレビュー回数
lapses: number; // カードが忘れられたか、間違って覚えられた回数
state: State; // カードの現在の状態(新しいカード、学習中、レビュー中、再学習中)
last_review?: Date; // 最近のレビュー日(適用される場合)
};
6. レビュー履歴属性の理解:
それぞれのReviewLog
オブジェクトは、そのカードに関連するレビュー記録情報を決定するさまざまな属性を含んでいます。分析、今回のレビューをやり直す、最適化(作成中):
type ReviewLog = {
rating: Rating; // レビューの評価(手動変更、やり直し、難しい、良い、簡単)
state: State; // レビューの状態(新しいカード、学習中、レビュー中、再学習中)
due: Date; // レビューの次の日付
stability: number; // レビュー前の記憶の安定性
difficulty: number; // レビュー前のカードの難易度
elapsed_days: number; // 前回のレビューからの日数
last_elapsed_days: number; // 前回のレビューの間隔日数
scheduled_days: number; // 次のレビューの間隔日数
review: Date; // レビュー日
}
Discussion