Recherche de texte intégral rapide basé sur BM25
La wink-bm25-text-search , basée sur BM25 - un algorithme d'élévation R Robabilistic R pour la récupération de documents, est un package de recherche de texte complet pour développer des applications dans des environnements Node.js ou Browser. Il construit un index de recherche en mémoire à partir des documents JSON d'entrée, qui est optimisé pour la taille et la vitesse.
Explorez l'exemple de recherche de texte Wink BM25 pour creuser plus profondément:
Son code est disponible dans le repo Showcase-BM25-Text-Search avec un article de blog détaillé.
Il est facile d'ajouter une saveur sémantique à la recherche par:
Attribuer différents poids numériques aux champs. Un poids de champ négatif réduira le score du document chaque fois qu'un match avec ce champ se produit.
L'utilisation de caractéristiques de traitement de texte riches de Wink-NLP telles que la détection de négation , la tige , la lemmatisation , la détection des mots d'arrêt et la détection des entités nommés pour effectuer des recherches intelligentes.
Définition de différentes tâches de préparation de texte séparément pour les champs et le texte de requête.
Utilisez NPM pour installer:
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! Note:
Node.js version 16 ou 18 est requis pour WinkNLP.
Le wink-nlp-utils reste disponible pour prendre en charge le code hérité. Veuillez vous référer à Wink-BM25-Text-Search version 3.0.1 pour les exemples Wink-NLP-Util.
defineConfig( config ) Définit la configuration à partir de l'objet config . Cet objet définit les 3 propriétés suivantes:
Les fldWeights (obligatoires) sont un objet où chaque clé est le nom du champ du document et la valeur est le poids numérique, c'est-à-dire l'importance de ce champ.
Le bm25Params (facultatif) est également un objet qui définit jusqu'à 3 clés à savoir. k1 , b et k Leurs valeurs par défaut sont respectivement 1.2 , 0.75 et 1 . Remarque: k1 contrôle la saturation TF; b contrôle le degré de normalisation et k gère les FDI.
Le ovFldNames (facultatif) est un tableau contenant les noms des champs, dont la valeur d'origine doit être conservée. Ceci est utile pour réduire l'espace de recherche à l'aide de Filter dans l'appel API search() .
definePrepTasks( tasks [, field ] ) Définit les tasks de préparation de texte pour transformer le texte entrant brut en un tableau de jetons requis pendant addDoc() et les opérations search() . Il renvoie le nombre de tasks .
Les tasks devraient être un tableau de fonctions. La première fonction de ce tableau doit accepter une chaîne en entrée; et la dernière fonction doit renvoyer un tableau de jetons sous forme de chaînes JavaScript. Chaque fonction doit accepter un argument d'entrée et renvoyer une seule valeur.
Le deuxième argument - field est facultatif. Il définit le field du document pour lequel les tasks seront définies; En l'absence de cet argument, les tasks deviennent la valeur par défaut de tout le reste. La configuration doit être définie via defineConfig() avant cet appel.
addDoc( doc, uniqueId ) Ajoute le doc avec le uniqueId au modèle BM25. Avant d'ajouter des documents, defineConfig() et definePrepTasks() doivent être appelés. Il accepte les documents JSON structurés en entrée pour la création du modèle. Voici un exemple de structure de document des exemples de données JSON contenues dans ce package:
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
Les exemples de données sont créés à l'aide d'extraits à partir d'articles Wikipedia tels que celui sur Barack Obama.
Il a un alias learn( doc, uniqueId ) pour maintenir l'uniformité au niveau de l'API dans divers packages Wink tels que Wink-Naive-Bayes-Text-Classificateur.
consolidate( fp ) Consolide le modèle BM25 pour tous les documents ajoutés. Le fp définit la précision à laquelle les valeurs de fréquence à terme sont stockées. La valeur par défaut est 4 et est assez bonne pour la plupart des situations. Il s'agit d'une condition préalable à search() et les documents ne peuvent pas être ajoutés après la consolidation.
search( text [, limit, filter, params ] ) Recherche le text et renvoie jusqu'au nombre limit de résultats. Le filter doit être une fonction qui doit retourner vrai ou faux en fonction params . Considérez-le comme la fonction de filtre de JavaScript Array. Il reçoit deux arguments à savoir. (a) Un objet contenant des paires de nom / valeur de champ tel que défini via ovFldNames dans defineConfig() , et (b) les params .
Les trois derniers arguments limit , filter et params sont facultatifs. La valeur par défaut de limit est de 10 .
Le résultat est un tableau de [ uniqueId, relevanceScore ] , trié sur les relevanceScore .
Comme addDoc() , il a également une predict( doc, uniqueId ) pour maintenir l'uniformité au niveau de l'API dans divers packages de clin d'attente tels que le classificateur de texte-bayes-naïf-text.
exportJSON()Le modèle BM25 peut être exporté sous forme de texte JSON qui peut être enregistré dans un fichier. C'est une bonne idée d'exporter JSON avant la consolidation et de l'utiliser chaque fois que davantage de documents doivent être ajoutés; tandis que JSON a exporté après la consolidation n'est bon que pour le fonctionnement de la recherche.
importJSON( json ) Un modèle JSON BM25 existant peut être importé pour la recherche. Il est essentiel d'appeler definePrepTasks() avant de tenter de rechercher.
reset()Il réinitialise complètement le modèle BM25 en réinitialisant toutes les variables, à l'exception des tâches préparatoires.
Il fournit des méthodes d'accessoires suivantes:
getDocs() renvoie les fréquences et la longueur du terme de chaque document.getTokens() Renvoie le token: index .getIDF() Renvoie une idf pour chaque jeton. Les jetons sont référencés via leur index numérique, accessible via getTokens() .getConfig() Renvoie la configuration BM25F comme configuré par defineConfig() .getTotalCorpusLength() Renvoie le nombre total de jetons sur tous les documents ajoutés.getTotalDocs() Renvoie les documents totaux ajoutés.Remarque: Ces accessoires exposent une partie de la structure des données internes et il faut s'abstenir de les modifier. Il est significatif exclusivement à des fins de lecture seule. Toute modification intentionnelle ou involontaire peut entraîner un grave dysfonctionnement du package.
Si vous apercevez un bogue et que la même chose n'a pas encore été signalée, soulevez un nouveau problème ou envisagez de le réparer et d'envoyer une demande de traction.
WinkJS est une famille de packages open source pour le traitement du langage naturel , l'analyse statistique et l'apprentissage automatique dans NodeJS. Le code est entièrement documenté pour une compréhension humaine facile et a une couverture de test de ~ 100% pour la fiabilité pour construire des solutions de qualité de production.
Wink-BM25-Text-Search est Copyright 2017-22 Graype Systems Private Limited.
Il est concédé sous licence de la licence du MIT.