@recoengine/features
v0.1.2
Published
Domain-neutral feature extractors and transforms for recoengine: interaction count and decayed recency from history, plus log and decay column transforms.
Maintainers
Readme
@recoengine/features
Reusable, domain-neutral feature extractors and transforms for
@recoengine/core.
npm i @recoengine/features @recoengine/coreAlready using
recoengine? These are re-exported from it — no separate install needed.
What it is
The standard strategies read features with fixed names — interaction_count,
interaction_recency, and so on. Someone has to produce those. For the features that come
from the interaction history rather than from your item payload, that producer is
domain-neutral: counting events keyed by item id, and decaying their recency, is the same
arithmetic whether the items are tracks or products. This package ships those producers, so
you get history-based scoring without writing any domain code.
| Factory | Kind | Produces |
| --- | --- | --- |
| interactionCountExtractor | extractor | interaction_count — how often the user interacted with each item |
| interactionRecencyExtractor | extractor | interaction_recency — decayed recency of those interactions |
| logTransform | transform | log1p compression of a column (tame heavy tails) |
| decayTransform | transform | a decay curve (exponential / linear) over a column |
- Extractors read
ctx.historyandctx.now— never the payload — which is what keeps them reusable across domains. - Transforms are pure maths over columns, domain-neutral by construction.
Features that genuinely need the payload — an item's own age, its category, a precomputed co-occurrence score — stay in your own domain extractors, because only you know where in the payload they live.
Usage
import { createEngine } from '@recoengine/core'
import { interactionCountExtractor, interactionRecencyExtractor, logTransform } from '@recoengine/features'
import { historyStrategy } from '@recoengine/strategies'
const engine = createEngine<Track>()
.use(myProvider)
.use(interactionCountExtractor())
.use(interactionRecencyExtractor({ halfLife: 30 })) // days
.use(logTransform({ source: 'plays', target: 'plays_log' }))
.use(historyStrategy()) // reads the features above
.configure({ limits: { maxCandidates: 5_000, maxLimit: 100, timeoutMs: 200 } })
.build()Options: InteractionCountOptions, InteractionRecencyOptions, LogTransformOptions,
DecayTransformOptions.
Links
- Repository & full docs: https://github.com/waleron07/recommendationEngine
MIT
