Schnelle Volltextsuche basierend auf BM25
Die wink-bm25-text-search basierend auf BM25-einem P-Robabilistischen R-Aufstandsalgorithmus für das Abrufen von Dokumenten ist ein Volltextsuchespaket zum Entwickeln von Apps in Node.JS- oder Browser-Umgebungen. Es erstellt einen In-Memory-Suchindex aus Eingabe-JSON-Dokumenten, der für Größe und Geschwindigkeit optimiert ist.
Entdecken Sie Wink BM25 Text Search Beispiel, um tiefer zu graben:
Sein Code ist im Showcase-BM25-Text-Search-Repo zusammen mit einem detaillierten Blog-Beitrag verfügbar.
Es ist einfach, der Suche nach einem semantischen Geschmack von: hinzuzufügen.
Zuweisen verschiedener numerischer Gewichte zu den Feldern. Ein negatives Feldgewicht führt die Punktzahl des Dokuments, wenn ein Match mit diesem Feld auftritt.
Verwenden von reichhaltigen Textverarbeitungsfunktionen von Wink-NLP wie Negationserkennung , Stamm , Lemmatisierung , Stoppen der Worterkennung und der benannten Entitätserkennung, um intelligente Suchvorgänge durchzuführen.
Definieren verschiedener Textvorbereitungsaufgaben separat für die Felder und Abfragetext.
Verwenden Sie NPM, um zu installieren:
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! Notiz:
Node.js Version 16 oder 18 ist für Winknlp erforderlich.
Die Wink-NLP-Utils bleibt zur Unterstützung des Legacy-Codes verfügbar. Weitere Beispiele finden Sie in Wink-BM25-Text-Search-Version 3.0.1 für Wink-NLP-Util-Beispiele.
defineConfig( config ) Definiert die Konfiguration aus dem config . Dieses Objekt definiert folgende 3 Eigenschaften:
Die fldWeights (obligatorisch) sind ein Objekt, bei dem jeder Schlüssel der Feldname des Dokuments ist und der Wert das numerische Gewicht ist, dh die Bedeutung dieses Feldes.
Das bm25Params (optional) ist auch ein Objekt, das bis zu 3 Schlüssel definiert. k1 , b und k . Ihre Standardwerte betragen jeweils 1.2 , 0.75 und 1 . Hinweis: k1 steuert die TF -Sättigung; b kontrolliert den Grad der Normalisierung und k verwaltet IDF.
Die ovFldNames (optional) sind ein Array, das die Namen der Felder enthält, deren ursprünglicher Wert beibehalten werden muss. Dies ist nützlich, um den Suchraum mit dem Filter in search() API -Aufruf zu reduzieren.
definePrepTasks( tasks [, field ] ) Definiert die tasks zur Umwandlung von rohem eingehenden Text in ein Array von Token, die während addDoc() und search() operationen erforderlich sind. Es gibt die Anzahl der tasks zurück.
Die tasks sollten eine Reihe von Funktionen sein. Die erste Funktion in diesem Array muss eine Zeichenfolge als Eingabe akzeptieren. und die letzte Funktion muss ein Array von Token als JavaScript -Zeichenfolgen zurückgeben. Jede Funktion muss ein Eingabeargument akzeptieren und einen einzelnen Wert zurückgeben.
Das zweite Argument - field ist optional. Es definiert das field des Dokuments, für das die tasks definiert werden. In Abwesenheit dieses Arguments werden die tasks zum Standard für alles andere. Die Konfiguration muss vor diesem Aufruf über defineConfig() definiert werden.
addDoc( doc, uniqueId ) Fügt den doc mit dem uniqueId zum BM25 -Modell hinzu. Vor dem Hinzufügen von Dokumenten müssen defineConfig() und definePrepTasks() aufgerufen werden. Es akzeptiert strukturierte JSON -Dokumente als Eingabe zum Erstellen des Modells. Im Folgenden finden Sie eine Beispiel -Dokumentstruktur der Beispieldaten, die JSON in diesem Paket enthalten ist:
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
Die Beispieldaten werden mit Auszügen aus Wikipedia -Artikeln wie einem auf Barack Obama erstellt.
Es hat einen Alias learn( doc, uniqueId ) um die Gleichmäßigkeit der API-Ebene über verschiedene Wink-Pakete wie wink-naive-bayes-textklassifizierende aufrechtzuerhalten.
consolidate( fp ) Konsolidiert das BM25 -Modell für alle zusätzlichen Dokumente. Das fp definiert die Genauigkeit, bei der Term Frequenzwerte gespeichert werden. Der Standardwert beträgt 4 und ist für die meisten Situationen gut genug. Es ist eine Voraussetzung für search() und Dokumente können nach der Konsolidierung nicht hinzugefügt werden.
search( text [, limit, filter, params ] ) Sucht nach dem text und kehrt bis zur limit der Ergebnisse zurück. Der filter sollte eine Funktion sein, die basierend auf params wahr oder false zurückgeben muss. Betrachten Sie es als Filterfunktion von JavaScript Array. Es erhält zwei Argumente, nämlich. (a) Ein Objekt, das Feldname/Wertpaare enthält, wie über ovFldNames in defineConfig() und (b) die params definiert.
Die letzten drei limit , filter und params sind optional. Der Standardwert der limit beträgt 10 .
Das Ergebnis ist eine Reihe von [ uniqueId, relevanceScore ] , die auf die relevanceScore sortiert sind.
Wie addDoc() hat es auch einen Alias- predict( doc, uniqueId ) um die Gleichmäßigkeit der API-Ebene über verschiedene Wink-Pakete wie wink-naive-bayes-textklassifierer aufrechtzuerhalten.
exportJSON()Das BM25 -Modell kann als JSON -Text exportiert werden, der in einer Datei gespeichert werden kann. Es ist eine gute Idee, JSON vor der Konsolidierung zu exportieren und dasselbe zu verwenden, wenn weitere Dokumente hinzugefügt werden müssen. Während JSON nach der Konsolidierung exportiert wurde, ist nur für die Suchoperation gut.
importJSON( json ) Ein vorhandenes JSON BM25 -Modell kann zur Suche importiert werden. Es ist wichtig, definePrepTasks() aufzurufen, bevor Sie versuchen zu suchen.
reset()Es setzt das BM25-Modell vollständig zurück, indem alle Variablen wieder initialisiert werden, mit Ausnahme der vorbereitenden Aufgaben.
Es bietet folgende Accessor -Methoden:
getDocs() gibt die Begriffsfrequenzen und die Länge jedes Dokuments zurück.getTokens() gibt das token: index -Mapping zurück.getIDF() gibt IDF für jedes Token zurück. Tokens werden über ihren numerischen Index referenziert, auf den über getTokens() zugegriffen wird.getConfig() gibt die BM25F -Konfiguration zurück, die von defineConfig() eingerichtet wurde.getTotalCorpusLength() gibt die Gesamtzahl der Token über alle hinzugefügten Dokumente zurück.getTotalDocs() gibt insgesamt hinzugefügte Dokumente zurück.HINWEIS: Diese Accessors stellen einen Teil der internen Datenstruktur frei und man muss es unterlassen, sie zu ändern. Es ist ausschließlich für schreibgeschützte Zwecke gedacht. Jede absichtliche oder unbeabsichtigte Änderung kann zu einer schwerwiegenden Fehlfunktion des Pakets führen.
Wenn Sie einen Fehler erkennen und das Gleiche noch nicht gemeldet wurde, langen Sie ein neues Problem an oder erwägen Sie, ihn zu beheben und eine Pull -Anfrage zu senden.
WinkJS ist eine Familie von Open -Source -Paketen für die Verarbeitung natürlicher Sprache , statistische Analyse und maschinelles Lernen in NodeJs. Der Code ist gründlich für das einfache menschliche Verständnis dokumentiert und verfügt über eine Testabdeckung von ~ 100% für die Zuverlässigkeit, um Lösungen für die Produktionsstufe zu erstellen.
Wink-BM25-Text-Search ist Copyright 2017-22 Graype Systems Private Limited.
Es ist unter den Bedingungen der MIT -Lizenz lizenziert.