Source code for revscoring.features.functions
"""
.. autofunction:: revscoring.features.trim
"""
from itertools import chain
from .feature import Constant, Feature, Modifier
[docs]def trim(features, context=None):
"""
Trims a feature set down to a bare set of :class:`~revscoring.Feature` by
removing :class:`~revscoring.features.Modifier` and
:class:`~revscoring.features.Constant`.
:Parameters:
features : `list` ( :class:`revscoring.Feature` )
A feature list to trim
context : `dict` | `set`
A context to apply while trimming
"""
context = context or {}
cache = set()
if hasattr(features, "__iter__"):
for feature in features:
yield from _trim(feature, context, cache)
else:
yield from _trim(features, context, cache)
def _trim(dependent, context, cache):
if isinstance(dependent, Feature):
feature = dependent
if isinstance(feature, Modifier):
for dependent in feature.dependencies:
yield from _trim(dependent, context, cache)
elif isinstance(feature, Constant):
pass
else:
if feature not in cache:
cache.add(feature)
yield feature
def vectorize_values(feature_values):
"""
Converts a list of feature_values that contains sub-FeatureVector
into a flat list of values.
"""
return list(chain(*(val if hasattr(val, "__iter__") else [val]
for val in feature_values)))