LINUX.ORG.RU

JS-библиотека для нечеткого поиска текста.

 , , , ,


0

2

https://github.com/MaratBektemirov/alif

Добрый вечер. Хотел поделиться с форумом своими наработками в области нечеткого поиска.

import { ABGD } from "alif"

const probabilityResult = (score, maxScore, templatePermanentLength, wordPermanentLength, x1) => {
  return score/maxScore;
};

const abgd = new ABGD('russian');

const templateTuples = [
  ['отец','мыл','машину'],
  ['мама','мыла','раму'],
  ['машина','отца','помыта'],
  ['отец','отец','отец','отец','мыл','машину'],
  ['рама','мамы','моется'],
].map((arrString) => abgd.getTuple(arrString))

const tuple = abgd.getTuple(['мама','мыла','раму'])

abgd.getTuplesProbabilities(
  templateTuples,
  tuple,
  probabilityResult
)
-> [
    [1,1],
    [0.5555555555555556,4],
    [0.2777777777777778,0],
    [0.1388888888888889,3],
    [0,2]
  ]

Можно использовать в node.js, но думаю в основном такая вещь нужна для фронтендеров (реализовать поиск по большому меню или каталогу). У меня лично была рабочая задача сделать нечеткий поиск по меню.



Последнее исправление: kodoi (всего исправлений: 1)

Код не смотрел, но вспомнил свой старый комментарий в http://www.delphiarea.com/articles/how-to-match-two-strings-approximately/ (ёлки-моталки, уже 14 лет прошло).
Для D/Phobos потом так же сделал. С самим Александреску пообщался! :)

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Ну точно знаю что в русском языке результаты у моей библиотеке будут лучше. По скорости не знаю, для моей задачи ее достаточно, но думаю что моя библиотека опередит flexsearch, но тут нужно бенчить что сказать об этом убежденно. Еще у меня авторский алгоритм сравнения посредством AF-пар. На самом деле русский язык имеет консонантную природу, мой алгоритм опирается на это. Расстояния Левенштейна и прочее – алгоритмы которые опираются на математику больше, чем на природу языка. Хотел статью выпустить в arxiv.org на эту тему, никто не знает как это лучше сделать?

kodoi
() автор топика
Ответ на: комментарий от dataman

Да, у меня как раз не Левенштейн.

  const result = (score, maxScore, templatePermanentLength, wordPermanentLength, x1) => {
    return maxScore - score;
  };

  const abgd = new ABGD('russian');
  abgd.matchStr('день', 'пень', result);
  ->12
  abgd.matchStr('отец', 'отца', result)
  ->6

Если использовать Левенштейна, то получится что расстояние между словами в первом варианте, меньше чем во втором.

kodoi
() автор топика