embedSync method

Float32List embedSync(
  1. String text
)

The vector for text, synchronously.

Implementation

Float32List embedSync(String text) {
  final v = Float32List(dimensions);
  void add(String feature, double weight) {
    final h = _fnv1a(feature);
    final sign = (h & 0x80000000) == 0 ? 1.0 : -1.0;
    v[h % dimensions] += sign * weight;
  }

  final words = [
    for (final m in _word.allMatches(text.toLowerCase())) m.group(0)!,
  ];
  for (var i = 0; i < words.length; i++) {
    final w = words[i];
    add('w:$w', 1);
    if (i + 1 < words.length) add('b:$w ${words[i + 1]}', 0.5);
    final padded = '^$w\$';
    for (var j = 0; j + 3 <= padded.length; j++) {
      add('c:${padded.substring(j, j + 3)}', 0.25);
    }
  }
  var norm = 0.0;
  for (final x in v) {
    norm += x * x;
  }
  if (norm > 0) {
    final inv = 1 / sqrt(norm);
    for (var i = 0; i < v.length; i++) {
      v[i] *= inv;
    }
  }
  return v;
}