Pesquisa rápida de texto completo com base no BM25
O wink-bm25-text-search , baseado no BM25-um algoritmo de elevances R Robabilistic R para recuperação de documentos, é um pacote completo de pesquisa de texto para desenvolver aplicativos em ambientes Node.js ou navegador. Ele cria um índice de pesquisa na memória a partir de documentos JSON de entrada, que é otimizado para tamanho e velocidade.
Explore Exemplo de pesquisa de texto Wink BM25 para aprofundar:
Seu código está disponível no Repo Showcase-BM25-Text-Search, juntamente com uma postagem detalhada do blog.
É fácil adicionar sabor semântico à pesquisa por:
Atribuindo pesos numéricos diferentes aos campos. Um peso de campo negativo puxará a pontuação do documento sempre que ocorrer uma partida com esse campo.
Usando recursos ricos em processamento de texto de piscadela-NLP, como detecção de negação , capa , lemmatização , detecção de palavras e detecção de entidades nomeadas para executar pesquisas inteligentes.
Definindo diferentes tarefas de preparação de texto separadamente para os campos e o texto da consulta.
Use o 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! Observação:
Node.js versão 16 ou 18 é necessário para o winknlp.
O Wink-NLP-Utils permanece disponível para apoiar o código legado. Consulte o Wink-BM25-Text-Search Versão 3.0.1 para obter exemplos de wink-nlp-util.
defineConfig( config ) Define a configuração do objeto config . Este objeto define a seguir 3 propriedades:
O fldWeights (obrigatório) é um objeto em que cada chave é o nome do campo do documento e o valor é o peso numérico, ou seja, a importância desse campo.
O bm25Params (opcional) também é um objeto que define até 3 chaves viz. k1 , b e k . Seus valores padrão são respectivamente 1.2 , 0.75 e 1 . Nota: k1 controla a saturação de TF; b controla o grau de normalização e k gerencia o IDF.
O ovFldNames (opcional) é uma matriz que contém os nomes dos campos, cujo valor original deve ser retido. Isso é útil na redução do espaço de pesquisa usando o filtro na chamada da API do search() .
definePrepTasks( tasks [, field ] ) Define as tasks de preparação de texto para transformar o texto de entrada bruto em uma matriz de tokens necessários durante as operações addDoc() e search() . Ele retorna a contagem de tasks .
As tasks devem ser uma variedade de funções. A primeira função nesta matriz deve aceitar uma string como entrada; e a última função deve retornar uma matriz de tokens como strings de javascript. Cada função deve aceitar um argumento de entrada e retornar um único valor.
O segundo argumento - field é opcional. Ele define o field do documento para o qual as tasks serão definidas; Na ausência desse argumento, as tasks se tornam o padrão para todo o resto. A configuração deve ser definida via defineConfig() antes desta chamada.
addDoc( doc, uniqueId ) Adiciona o doc com o uniqueId ao modelo BM25. Antes da adição de documentos, defineConfig() e definePrepTasks() devem ser chamados. Ele aceita documentos JSON estruturados como entrada para criar o modelo. A seguir, é apresentado um exemplo de estrutura de documentos dos dados de amostra que JSON contido neste pacote:
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
Os dados da amostra são criados usando trechos de artigos da Wikipedia, como um em Barack Obama.
Ele tem um alias learn( doc, uniqueId ) para manter a uniformidade do nível da API em vários pacotes de piscadela, como o Wink-Naive-Bayes-Text-Classifier.
consolidate( fp ) Consolida o modelo BM25 para todos os documentos adicionados. O fp define a precisão na qual os valores de frequência de termo são armazenados. O valor padrão é 4 e é bom o suficiente para a maioria das situações. É um pré -requisito para search() e os documentos não podem ser adicionados após a consolidação.
search( text [, limit, filter, params ] ) Procura o text e retorna o número limit de resultados. O filter deve ser uma função que deve retornar verdadeira ou falsa com base nos params . Pense nisso como a função de filtro da matriz JavaScript. Recebe dois argumentos viz. (a) Um objeto que contém o nome do campo/pares de valor, conforme definido via ovFldNames em defineConfig() e (b) os params .
Os três últimos argumentos limit , filter e params são opcionais. O valor padrão do limit é 10 .
O resultado é uma matriz de [ uniqueId, relevanceScore ] , classificada no relevanceScore .
Como addDoc() , ele também possui um alias predict( doc, uniqueId ) para manter a uniformidade do nível da API em vários pacotes de piscadela, como o Wink-Naive-Bayes-Text-Classifier.
exportJSON()O modelo BM25 pode ser exportado como texto JSON que pode ser salvo em um arquivo. É uma boa idéia exportar JSON antes da consolidação e usar o mesmo sempre que mais documentos precisam ser adicionados; Enquanto o JSON exportado após a consolidação é bom apenas para a operação de pesquisa.
importJSON( json ) Um modelo JSON BM25 existente pode ser importado para pesquisa. É essencial ligar para definePrepTasks() antes de tentar pesquisar.
reset()Ele redefine completamente o modelo BM25 re-unindo todas as variáveis, exceto as tarefas preparatórias.
Ele fornece os seguintes métodos de acessórios:
getDocs() retorna as frequências do termo e o comprimento de cada documento.getTokens() retorna o token: index .getIDF() retorna IDF para cada token. Os tokens são referenciados por meio de seu índice numérico, que é acessado via getTokens() .getConfig() Retorna a configuração BM25F, conforme configurado por defineConfig() .getTotalCorpusLength() retorna o número total de tokens em todos os documentos adicionados.getTotalDocs() retorna o total de documentos adicionados.NOTA: Esses acessores expõem parte da estrutura de dados internos e é preciso abster -se de modificá -lo. Significa exclusivamente para fins somente leitura. Qualquer modificação intencional ou não intencional pode resultar em mau funcionamento do pacote.
Se você encontrar um bug e o mesmo ainda não foi relatado, levante um novo problema ou considere consertá -lo e enviar uma solicitação de tração.
O WinkJS é uma família de pacotes de código aberto para processamento de linguagem natural , análise estatística e aprendizado de máquina em NodeJs. O código está minuciosamente documentado para fácil compreensão humana e possui uma cobertura de teste de ~ 100% para a confiabilidade para criar soluções de grau de produção.
Pesquisa Wink-BM25-Text é Copyright 2017-22 Graype Systems Private Limited.
Está licenciado nos termos da licença do MIT.