BM25를 기반으로 한 빠른 전체 텍스트 검색
BM25를 기반으로하는 wink-bm25-text-search 문서 검색을위한 Probabilistic r 고도 알고리즘을 기반으로합니다. 입력 JSON 문서에서 메모리 내 검색 색인을 구축하며 크기와 속도에 최적화됩니다.
Wink BM25 텍스트 검색 예제를 탐색하여 더 깊이 파헤칩니다.
코드는 Showcase-BM25-Text-Search Repo와 함께 자세한 블로그 게시물과 함께 제공됩니다.
검색에 시맨틱 풍미를 추가하는 것은 쉽습니다.
다른 숫자 가중치를 필드에 할당합니다. 마이너스 필드 무게는 해당 필드와 일치 할 때마다 문서의 점수를 낮추게됩니다.
부정 감지 , 스템 밍 , 레마 화 , 중지 단어 감지 및 지능 검색을 수행하기 위해 명명 된 엔티티 감지 와 같은 Wink-NLP의 풍부한 텍스트 처리 기능을 사용합니다.
필드 및 쿼리 텍스트에 대해 다른 텍스트 준비 작업을 별도로 정의합니다.
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! 메모:
WinkNlp에는 node.js 버전 16 또는 18이 필요합니다.
Wink-NLP-Utils는 레거시 코드를 지원할 수 있습니다. Wink-NLP-Util 예제는 Wink-BM25-Text Search 버전 3.0.1을 참조하십시오.
defineConfig( config ) config 객체에서 구성을 정의합니다. 이 개체는 다음 3 가지 속성을 정의합니다.
fldWeights (필수)는 각 키가 문서의 필드 이름 이고 값 은 숫자 중량 , 즉 해당 필드의 중요성 인 객체입니다.
bm25Params (선택 사항)는 또한 최대 3 개의 키를 정의하는 객체입니다. k1 , b 및 k . 기본값은 각각 1.2 , 0.75 및 1 입니다. 참고 : k1 TF 포화를 제어합니다. b 정규화 정도를 제어하고 k IDF를 관리합니다.
ovFldNames (선택 사항)는 원래 값을 유지 해야하는 필드의 이름을 포함하는 배열입니다. search() API Call에서 필터를 사용하여 검색 공간을 줄이는 데 유용합니다.
definePrepTasks( tasks [, field ] ) 텍스트 준비 tasks 정의하여 생신 텍스트를 addDoc() 및 search() 작업 중에 필요한 토큰 배열로 변환합니다. tasks 수를 반환합니다.
tasks 다양한 함수 여야합니다. 이 배열의 첫 번째 함수는 문자열을 입력으로 수락해야합니다. 마지막 함수는 토큰 배열을 JavaScript 문자열로 반환해야합니다. 각 함수는 하나의 입력 인수를 수락하고 단일 값을 반환해야합니다.
두 번째 인수 - field 선택 사항입니다. tasks 정의 될 문서의 field 정의합니다. 이 주장이 없으면 tasks 다른 모든 것에 대한 기본값이됩니다. 이 호출 전에 구성은 defineConfig() 통해 정의해야합니다.
addDoc( doc, uniqueId ) BM25 모델에 uniqueId doc 을 추가합니다. 문서를 추가하기 전에 defineConfig() 및 definePrepTasks() 호출해야합니다. 그것은 구성된 JSON 문서를 모델 생성을위한 입력으로 받아들입니다. 다음은이 패키지에 포함 된 샘플 데이터의 문서 구조입니다.
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
샘플 데이터는 Barack Obama One과 같은 Wikipedia 기사의 발췌를 사용하여 작성됩니다.
Wink-Naive-Bayes-Text-Classifier와 같은 다양한 Wink 패키지에서 API 레벨 균일 성을 유지하기 위해 Alias learn( doc, uniqueId ) 이 있습니다.
consolidate( fp ) 추가 된 모든 문서의 BM25 모델을 통합합니다. fp 용어 주파수 값이 저장되는 정밀도를 정의합니다. 기본값은 4이며 대부분의 상황에서 충분합니다. search() 에 대한 전제 조건이며 문서는 통합 후 추가 할 수 없습니다.
search( text [, limit, filter, params ] ) text 를 검색하고 결과의 limit 수로 돌아갑니다. filter params 에 따라 true 또는 false를 반환 해야하는 함수 여야합니다. JavaScript 배열의 필터 기능으로 생각하십시오. 그것은 두 가지 주장을받습니다. (a) defineConfig() 의 ovFldNames 통해 정의 된 필드 이름/값 쌍을 포함하는 객체 및 (b) params .
마지막 세 인수 limit , filter 및 params 는 선택 사항입니다. limit 의 기본값은 10 입니다.
결과는 [ uniqueId, relevanceScore ] 의 배열로, relevanceScore 에 정렬됩니다.
addDoc() 과 마찬가지로 Wink-Naive-Bayes-Text-Classifier와 같은 다양한 Wink 패키지에서 API 레벨 균일 성을 유지하기위한 별칭 predict( doc, uniqueId ) 도 있습니다.
exportJSON()BM25 모델은 파일에 저장 될 수있는 JSON 텍스트로 내보낼 수 있습니다. 통합 전에 JSON을 내보내고 더 많은 문서를 추가해야 할 때마다 동일하게 사용하는 것이 좋습니다. 통합 후 수출 된 JSON은 검색 작업에만 좋습니다.
importJSON( json ) 기존 JSON BM25 모델을 검색하기 위해 가져올 수 있습니다. 검색을 시도하기 전에 definePrepTasks() 호출하는 것이 필수적입니다.
reset()준비 작업을 제외한 모든 변수를 다시 시작하여 BM25 모델을 완전히 재설정합니다.
액세서 방법을 제공합니다.
getDocs() 각 문서의 주파수와 길이를 반환합니다.getTokens() token: index 매핑을 반환합니다.getIDF() 각 토큰에 대해 IDF를 반환합니다. 토큰은 수치 지수를 통해 참조되며, 이는 getTokens() 를 통해 액세스됩니다.getConfig() defineConfig() 에 의해 설정된대로 bm25f 구성을 반환합니다.getTotalCorpusLength() 추가 된 모든 문서에서 총 토큰 수를 반환합니다.getTotalDocs() 추가 된 총 문서를 반환합니다.참고 :이 액세서는 내부 데이터 구조의 일부를 노출 시키며 하나는 수정을 자제해야합니다. 읽기 전용 목적을위한 독점적입니다. 의도적이거나 의도하지 않은 수정은 패키지의 심각한 오작동을 초래할 수 있습니다.
버그를 발견하고 같은 버그가보고되지 않은 경우 새 문제를 제기하거나 수정하고 풀 요청을 보내는 것을 고려하십시오.
WinkJS는 Nodejs의 자연 언어 처리 , 통계 분석 및 기계 학습을 위한 오픈 소스 패키지 제품군입니다. 이 코드는 쉽게 인간 이해력을 위해 철저히 문서화되어 있으며 생산 등급 솔루션을 구축하기위한 신뢰성을 위해 ~ 100%의 테스트 범위를 가지고 있습니다.
Wink-BM25-Text-Search는 Copyright 2017-22 Graype Systems Private Limited입니다.
MIT 라이센스의 조건에 따라 라이센스가 부여됩니다.