Búsqueda rápida de texto completo basada en BM25
La wink-bm25-text-search , basado en BM25, un algoritmo de elevación R robilística P para la recuperación de documentos, es un paquete de búsqueda de texto completo para desarrollar aplicaciones en Node.js o en entornos de navegador. Construye un índice de búsqueda en memoria a partir de documentos de entrada JSON, que está optimizado para el tamaño y la velocidad.
Explore Wink BM25 Ejemplo de búsqueda de texto para profundizar:
Su código está disponible en el repositorio de búsqueda de textos showcase-bm25 junto con una publicación de blog detallada.
Es fácil agregar sabor semántico a la búsqueda por:
Asignación de diferentes pesos numéricos a los campos. Un peso de campo negativo reducirá la puntuación del documento cada vez que ocurra un partido con ese campo.
Uso de características de procesamiento de texto enriquecidos de Wink-NLP, como detección de negación , stemming , lemmatización , detección de palabras de detención y detección de entidades con nombre para realizar búsquedas inteligentes.
Definición de diferentes tareas de preparación de texto por separado para los campos y el texto de consulta.
Use NPM para instalar:
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! Nota:
Node.js versión 16 o 18 es necesaria para winknlp.
Wink-NLP-Utils permanece disponible para respaldar el código heredado. Consulte la versión 3.0.1 de Wink-BM25-Search Version 3.0.1 para ver los ejemplos Wink-NLP-Util.
defineConfig( config ) Define la configuración del objeto config . Este objeto define siguiendo 3 propiedades:
El fldWeights (obligatorio) es un objeto donde cada clave es el nombre del campo del documento y el valor es el peso numérico , es decir, la importancia de ese campo.
El bm25Params (opcional) también es un objeto que define hasta 3 teclas, a saber. k1 , b y k Sus valores predeterminados son respectivamente 1.2 , 0.75 y 1 . Nota: k1 controla la saturación de TF; b controla el grado de normalización, y k administra las FDI.
El ovFldNames (opcional) es una matriz que contiene los nombres de los campos, cuyo valor original debe ser retenido. Esto es útil para reducir el espacio de búsqueda usando la llamada de la API de Filter en search() .
definePrepTasks( tasks [, field ] ) Define las tasks de preparación de texto para transformar el texto entrante en bruto en una matriz de tokens requeridos durante las operaciones addDoc() y search() . Devuelve el recuento de tasks .
Las tasks deben ser una variedad de funciones. La primera función en esta matriz debe aceptar una cadena como entrada; y la última función debe devolver una matriz de tokens como cadenas JavaScript. Cada función debe aceptar un argumento de entrada y devolver un valor único.
El segundo argumento: field es opcional. Define el field del documento para el cual se definirán las tasks ; En ausencia de este argumento, las tasks se convierten en el valor predeterminado para todo lo demás. La configuración debe definirse a través de defineConfig() antes de esta llamada.
addDoc( doc, uniqueId ) Agrega el doc con el uniqueId al modelo BM25. Antes de agregar documentos, se debe llamar a los documentos, defineConfig() y definePrepTasks() . Acepta documentos JSON estructurados como entrada para crear el modelo. A continuación se muestra una estructura de documento de ejemplo de los datos de muestra JSON contenidos en este paquete:
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
Los datos de muestra se crean utilizando extractos de artículos de Wikipedia como uno en Barack Obama.
Tiene un alias learn( doc, uniqueId ) para mantener la uniformidad del nivel de API en varios paquetes de guiño, como el clasificador de texto de bayes-nleive-naive-bayes.
consolidate( fp ) Consolida el modelo BM25 para todos los documentos adicionales. El fp define la precisión a la que se almacenan los valores de frecuencia del término. El valor predeterminado es 4 y es lo suficientemente bueno para la mayoría de las situaciones. Es un requisito previo para search() y los documentos no se pueden agregar después de la consolidación.
search( text [, limit, filter, params ] ) Busca el text y devuelve al número limit de resultados. El filter debe ser una función que debe devolver verdadero o falso según params . Piense en ello como la función de filtro de JavaScript Array. Recibe dos argumentos a saber. (a) Un objeto que contiene pares de nombre/valor de campo como se define a través de ovFldNames en defineConfig() , y (b) los params .
Los últimos tres argumentos limit , filter y params son opcionales. El valor predeterminado del limit es 10 .
El resultado es una variedad de [ uniqueId, relevanceScore ] , ordenado en el relevanceScore .
Al igual que addDoc() , también tiene una predict( doc, uniqueId ) para mantener la uniformidad del nivel de API en varios paquetes de guiño, como el clasificador de texto de buzo-naive-bayes.
exportJSON()El modelo BM25 se puede exportar como texto JSON que se puede guardar en un archivo. Es una buena idea exportar JSON antes de la consolidación y usar lo mismo cuando se necesiten más documentos; mientras que JSON exportó después de la consolidación solo es bueno para la operación de búsqueda.
importJSON( json ) Se puede importar un modelo JSON BM25 existente para la búsqueda. Es esencial llamar definePrepTasks() antes de intentar buscar.
reset()Restablece completamente el modelo BM25 reinicializando todas las variables, excepto las tareas preparatorias.
Proporciona los siguientes métodos de accesorios:
getDocs() Devuelve el término frecuencias y la longitud de cada documento.getTokens() Devuelve el token: index .getIDF() Devuelve IDF para cada token. Se hace referencia a los tokens a través de su índice numérico, al que se accede a través de getTokens() .getConfig() Devuelve la configuración BM25F configurada por defineConfig() .getTotalCorpusLength() devuelve el número total de tokens en todos los documentos agregados.getTotalDocs() devuelve los documentos totales agregados.Nota: Estos accesorios exponen parte de la estructura de datos internos y uno debe abstenerse de modificarla. Se entiende exclusivamente para fines de solo lectura. Cualquier modificación intencional o involuntaria puede dar lugar a un mal funcionamiento del paquete.
Si detecta un error y aún no se ha informado lo mismo, plantea un nuevo problema o considere solucionarlo y enviar una solicitud de extracción.
WinkJS es una familia de paquetes de código abierto para el procesamiento del lenguaje natural , análisis estadístico y aprendizaje automático en NodeJS. El código está completamente documentado para una fácil comprensión humana y tiene una cobertura de prueba de ~ 100% para la confiabilidad para construir soluciones de grado de producción.
Wink-BM25-Text-Search es Copyright 2017-22 Graype Systems Private Limited.
Tiene licencia bajo los términos de la licencia MIT.