💭

【FSRS】ts-fsrsについての紹介

2023/12/15に公開

について

ts-fsrsは自由間隔重複スケジューラ(FSRS)アルゴリズムを実装するための、TypeScriptで開発されたESモジュールパッケージです。このツールは、開発者がFSRSアルゴリズムを彼らのフラッシュカードアプリケーションに適用し、ユーザーの学習体験を向上させるのに役立ちます。
https://github.com/ishiko732/ts-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('--------------------------------------------------------');
});

もっと:

基本的な使い方

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