Быстрый полный текстовый поиск на основе BM25
wink-bm25-text-search , основанный на BM25-A Probability R Elevance Algorithm для поиска документов, является полным пакетом поиска текста для разработки приложений в средах Node.js или браузера. Он создает индекс поиска в памяти из документов JSON Input, который оптимизирован для размера и скорости.
Исследуйте пример поиска текстового поиска Wink BM25, чтобы копать глубже:
Его код доступен в Repo Showcase-BM25-Text-Search, а также подробное сообщение в блоге.
Легко добавить семантический аромат к поиску:
Присваивая различные численные веса на поля. Отрицательный вес поля снижает счет документа, когда происходит совпадение с этим полем.
Используя богатые функции обработки текста Wink-NLP, такие как обнаружение отрицания , Stemming , Lemmatization , STOP DETACTION и DETACTION и названные объекты для выполнения интеллектуальных поисков.
Определение различных задач подготовки текста отдельно для полей и текста запроса.
Используйте NPM для установки:
npm install wink-bm25-text-search --save // Load wink-bm25-text-search
var bm25 = require ( 'wink-bm25-text-search' ) ;
// Create search engine's instance
var engine = bm25 ( ) ;
// Load sample data (load any other JSON data instead of sample)
var docs = require ( 'wink-bm25-text-search/sample-data/demo-data-for-wink-bm25.json' ) ;
// Load wink nlp and its model
const winkNLP = require ( 'wink-nlp' ) ;
// Use web model
const model = require ( 'wink-eng-lite-web-model' ) ;
const nlp = winkNLP ( model ) ;
const its = nlp . its ;
const prepTask = function ( text ) {
const tokens = [ ] ;
nlp . readDoc ( text )
. tokens ( )
// Use only words ignoring punctuations etc and from them remove stop words
. filter ( ( t ) => ( t . out ( its . type ) === 'word' && ! t . out ( its . stopWordFlag ) ) )
// Handle negation and extract stem of the word
. each ( ( t ) => tokens . push ( ( t . out ( its . negationFlag ) ) ? '!' + t . out ( its . stem ) : t . out ( its . stem ) ) ) ;
return tokens ;
} ;
// Contains search query.
var query ;
// Step I: Define config
// Only field weights are required in this example.
engine . defineConfig ( { fldWeights : { title : 1 , body : 2 } } ) ;
// Step II: Define PrepTasks pipe.
// Set up 'default' preparatory tasks i.e. for everything else
engine . definePrepTasks ( [ prepTask ] ) ;
// Step III: Add Docs
// Add documents now...
docs . forEach ( function ( doc , i ) {
// Note, 'i' becomes the unique id for 'doc'
engine . addDoc ( doc , i ) ;
} ) ;
// Step IV: Consolidate
// Consolidate before searching
engine . consolidate ( ) ;
// All set, start searching!
query = 'not studied law' ;
// `results` is an array of [ doc-id, score ], sorted by score
var results = engine . search ( query ) ;
// Print number of results.
console . log ( '%d entries found.' , results . length ) ;
// -> 1 entries found.
// results[ 0 ][ 0 ] i.e. the top result is:
console . log ( docs [ results [ 0 ] [ 0 ] ] . body ) ;
// -> George Walker Bush (born July 6, 1946) is an...
// -> ... He never studied Law...
// Whereas if you search for `law` then multiple entries will be
// found except the above entry! Примечание:
Node.js версия 16 или 18 требуется для winknlp.
Wink-NLP-Utils остается доступным для поддержки устаревшего кода. Пожалуйста, обратитесь к версии Wink-BM25-Text-Search версии 3.0.1 для примеров Wink-NLP-UTIL.
defineConfig( config ) Определяет конфигурацию из объекта config . Этот объект определяет следующие 3 свойства:
fldWeights (обязательный) - это объект, в котором каждый ключ является именем поля документа , а значение - это числовой вес , т.е. важность этого поля.
bm25Params (необязательно) также является объектом, который определяет до 3 клавиш, а именно. k1 , b и k Их значения по умолчанию соответственно 1.2 , 0.75 и 1 . Примечание: k1 контролирует насыщение TF; b контролирует степень нормализации, а k управляет ИДФ.
ovFldNames (необязательно) - это массив, содержащий имена полей, исходное значение которого должно быть сохранено. Это полезно для сокращения пространства поиска с использованием фильтра в API search() .
definePrepTasks( tasks [, field ] ) Определяет tasks подготовки текста для преобразования необработанного входящего текста в массив токенов, требуемых во время addDoc() , и search() . Он возвращает количество tasks .
tasks должны быть массивом функций. Первая функция в этом массиве должна принять строку в качестве входного; и последняя функция должна вернуть массив токенов в виде строк JavaScript. Каждая функция должна принять один входной аргумент и вернуть одно значение.
Второй аргумент - field является необязательным. Он определяет field документа, для которого будут определены tasks ; В отсутствие этого аргумента tasks становятся по умолчанию для всего остального. Конфигурация должна быть определена через defineConfig() до этого вызова.
addDoc( doc, uniqueId ) Добавляет doc с uniqueId в модель BM25. Перед добавлением DOCS defineConfig() и definePrepTasks() должны быть вызваны. Он принимает структурированные документы JSON в качестве входных данных для создания модели. Ниже приведен пример структура документа образца данных JSON, содержащегося в этом пакете:
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
Примерные данные создаются с использованием выдержек из статей Википедии, таких как один на Бараке Обаме.
Он имеет псевдоним, который learn( doc, uniqueId ) , чтобы поддерживать однородность уровня API в различных пакетах Wink, таких как Wink-naive-bayes-text-classifier.
consolidate( fp ) Консолидирует модель BM25 для всех дополнительных документов. fp определяет точность, при которой хранятся значения частоты членов. Значение по умолчанию 4 и достаточно для большинства ситуаций. Это предпосылка для search() , и документы не могут быть добавлены после консолидации.
search( text [, limit, filter, params ] ) Поиск text и возвращает до limit количества результатов. filter должен быть функцией, которая должна вернуть True или False на основе params . Думайте об этом как о функции фильтра JavaScript Array. Он получает два аргумента, а именно. (a) Объект, содержащий имени поля/значения пары, как определено через ovFldNames in defineConfig() и (b) params .
Последние три limit аргументов, filter и params являются необязательными. Значение limit по умолчанию составляет 10 .
Результатом является массив [ uniqueId, relevanceScore ] , отсортированный на relevanceScore .
Как и addDoc() , он также имеет псевдоним, predict( doc, uniqueId ) для поддержания однородности уровня API в различных пакетах Wink, таких как Wink-Naive-Bayes-Text-Classifier.
exportJSON()Модель BM25 может быть экспортирована как текст JSON, который может быть сохранен в файле. Это хорошая идея для экспорта JSON до консолидации и использовать его, когда необходимо добавить больше документов; тогда как JSON экспортируется после консолидации, хороша только для поисковой операции.
importJSON( json ) Существующая модель JSON BM25 может быть импортирована для поиска. Очень важно вызвать definePrepTasks() прежде чем пытаться искать.
reset()Он полностью сбрасывает модель BM25, повторно инициализируя все переменные, кроме подготовительных задач.
Он предоставляет следующие методы аксессуара:
getDocs() возвращает термины частоты и длину каждого документа.getTokens() возвращает token: index отображение.getIDF() возвращает IDF для каждого токена. Токены ссылаются с помощью их численного индекса, доступ к которому доступны через getTokens() .getConfig() возвращает конфигурацию BM25F в соответствии с настройкой defineConfig() .getTotalCorpusLength() возвращает общее количество токенов во всех добавленных документах.getTotalDocs() возвращает общие документы.ПРИМЕЧАНИЕ. Эти аксессов разоблачают часть внутренней структуры данных, и нужно воздерживаться от изменения ее. Это подразумевается исключительно для цели только для чтения. Любая преднамеренная или непреднамеренная модификация может привести к серьезным неисправности пакета.
Если вы обнаружите ошибку, и то же самое еще не сообщалось, поднимите новую проблему или рассмотрите возможность его исправления и отправить запрос на привлечение.
Winkjs - это семейство пакетов с открытым исходным кодом для обработки естественного языка , статистического анализа и машинного обучения в Nodejs. Код тщательно задокументирован для легкого понимания человека и имеет тестовый охват ~ 100% для надежности для создания решений производственного уровня.
Wink-BM25-Text-Search- Copyright 2017-22 Graype Systems Private Limited.
Он имеет лицензию в соответствии с условиями лицензии MIT.