BM25に基づく高速フルテキスト検索
BM25に基づくwink-bm25-text-search - ドキュメント取得のためのPロバビリスティックRエレベンスアルゴリズムは、node.jsまたはブラウザー環境のいずれかでアプリを開発するための全文検索パッケージです。入力JSONドキュメントからメモリ内検索インデックスを構築します。これは、サイズと速度に最適化されています。
Wink BM25テキスト検索の例を探索して、掘り下げてください。
そのコードは、詳細なブログ投稿とともに、Showcase-BM25-Text-Search Repoで利用できます。
検索にセマンティックフレーバーを追加するのは簡単です。
異なる数値重みをフィールドに割り当てます。負のフィールド重量は、そのフィールドとの一致が発生するたびにドキュメントのスコアを引き下げます。
否定検出、ステミング、整形化化、停止単語検出、名前付きエンティティ検出など、negation検出、ステム化、レンマ化など、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! 注記:
node.jsバージョン16または18は、winknlpに必要です。
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 、および1 0.75 。注: k1 TF飽和を制御します。 b正規化の程度を制御し、 k IDFを管理します。
ovFldNames (オプション)は、フィールドの名前を含む配列で、元の値を保持する必要があります。これはsearch() API呼び出しのフィルターを使用して検索スペースを削減するのに役立ちます。
definePrepTasks( tasks [, field ] )生の着信テキストをaddDoc()およびsearch()操作中に必要なトークンの配列に変換するテキスト準備tasksを定義します。 tasksの数を返します。
tasks関数の配列でなければなりません。この配列の最初の関数は、文字列を入力として受け入れる必要があります。最後の関数は、JavaScript文字列としてトークンの配列を返す必要があります。各関数は、1つの入力引数を受け入れ、単一の値を返す必要があります。
2番目の引数 - fieldはオプションです。 tasksが定義されるドキュメントのfieldを定義します。この議論がない場合、 tasks他のすべてのデフォルトになります。この呼び出しの前に、構成はdefineConfig()を介して定義する必要があります。
addDoc( doc, uniqueId ) BM25モデルにuniqueIdのdocを追加します。ドキュメントを追加する前に、 defineConfig()およびdefinePrepTasks()を呼び出す必要があります。構造化されたJSONドキュメントを、モデルを作成するための入力として受け入れます。以下は、このパッケージに含まれるJSONのサンプルデータのドキュメント構造の例です。
{
title: 'Barack Obama',
body: 'Barack Hussein Obama II born August 4, 1961 is an American politician...'
tags: 'democratic nobel peace prize columbia michelle...'
}
サンプルデータは、バラクオバマのようなウィキペディアの記事からの抜粋を使用して作成されます。
これは、Wink-Naive-Bayes-Text-ClassifierなどのさまざまなWinkパッケージにわたってAPIレベルの均一性を維持するためのエイリアスlearn( doc, uniqueId )を持っています。
consolidate( fp )追加されたすべてのドキュメントのBM25モデルを統合します。 fp 、項の周波数値が保存される精度を定義します。デフォルト値は4で、ほとんどの状況で十分です。 search()の前提条件であり、統合後にドキュメントを追加できません。
search( text [, limit, filter, params ] ) textを検索し、結果のlimit数まで返します。 filter 、 paramsに基づいてtrueまたはfalseを返す必要がある関数である必要があります。 JavaScriptアレイのフィルター関数と考えてください。 2つの引数を受け取ります。 (a) defineConfig()のovFldNamesを介して定義されているフィールド名/値ペアを含むオブジェクト、および(b) params 。
最後の3つの引数は、 limit 、 filter 、およびparamsがオプションです。 limitのデフォルト値は10です。
結果は、 relevanceScoreでソートされた[ uniqueId, 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は著作権2017-22 Graype Systems Private Limitedです。
MITライセンスの条件に基づいてライセンスされています。