البحث الكامل السريع استنادًا إلى BM25
يعد wink-bm25-text-search ، استنادًا إلى BM25-خوارزمية R ripabilistic R robabilistic لاسترجاع المستند ، حزمة بحث كاملة عن النص لتطوير تطبيقات في إما node.js أو بيئات المتصفح. إنه يبني فهرس البحث في الذاكرة من مستندات الإدخال JSON ، والذي تم تحسينه للحجم والسرعة.
استكشاف مثال البحث عن نص Wink BM25 للحفر أعمق:
رمزها متاح في برنامج عرض معرض BM25-Text-Search مع منشور مدونة مفصل.
من السهل إضافة نكهة دلالية إلى البحث بواسطة:
تعيين أوزان رقمية مختلفة للحقول. سيقوم وزن الحقل السلبي بسحب درجة المستند كلما حدث تطابق مع هذا الحقل.
باستخدام ميزات المعالجة النصية الغنية لـ 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-BM25-Text-Search الإصدار 3.0.1 لأمثلة Wink-NLP-UTIL.
defineConfig( config ) يحدد التكوين من كائن config . يحدد هذا الكائن خصائص 3 التالية:
fldWeights (إلزامية) هو كائن حيث يكون كل مفتاح اسم حقل المستند والقيمة هي الوزن العددي أي أهمية هذا الحقل.
bm25Params (اختياري) هو أيضًا كائن يحدد ما يصل إلى 3 مفاتيح بمعنى. k1 ، b ، و k قيمها الافتراضية هي على التوالي 1.2 و 0.75 و 1 . ملاحظة: تحكم k1 في تشبع TF ؛ b يتحكم في درجة التطبيع ، ويدير k جيش الدفاع الإسرائيلي.
ovFldNames (اختيارية) هي صفيف يحتوي على أسماء الحقول ، التي يجب الاحتفاظ بقيمة أصلية. هذا مفيد في تقليل مساحة البحث باستخدام Filter في استدعاء API search() .
definePrepTasks( tasks [, field ] ) يحدد tasks إعداد النص لتحويل النص الوارد الخام إلى مجموعة من الرموز المطلوبة أثناء عمليات addDoc() ، و search() . يعيد عدد tasks .
يجب أن تكون tasks مجموعة من الوظائف. يجب أن تقبل الوظيفة الأولى في هذه الصفيف سلسلة كمدخلات ؛ ويجب أن تُرجع الوظيفة الأخيرة مجموعة من الرموز كأسلاك JavaScript. يجب أن تقبل كل وظيفة وسيطة إدخال واحدة وإرجاع قيمة واحدة.
الحجة الثانية - field اختياري. يحدد field المستند الذي سيتم تعريف tasks من أجله ؛ في غياب هذه الحجة ، تصبح tasks افتراضيًا لكل شيء آخر. يجب تعريف التكوين عبر defineConfig() قبل هذه المكالمة.
addDoc( doc, uniqueId ) يضيف doc مع uniqueId إلى طراز BM25. قبل إضافة مستندات ، يجب استدعاء 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...'
}
يتم إنشاء بيانات العينة باستخدام مقتطفات من مقالات ويكيبيديا مثل واحدة في باراك أوباما.
إنه يحتوي على اسم مستعار learn( doc, uniqueId ) للحفاظ على توحيد مستوى واجهة برمجة التطبيقات عبر حزم غصن مختلفة مثل كلاستير النصوص من Wink-Naive-Bayes.
consolidate( fp ) يدمج نموذج BM25 لجميع المستندات المضافة. يحدد fp الدقة التي يتم عندها تخزين قيم التردد. القيمة الافتراضية 4 وهي جيدة بما يكفي لمعظم المواقف. إنه شرط أساسي search() ولا يمكن إضافة مستندات بعد توحيد النشر.
search( text [, limit, filter, params ] ) يبحث عن text وإرجاع ما يصل إلى limit النتائج. يجب أن يكون filter وظيفة يجب أن تُرجع صحيحًا أو خطأ بناءً على params . فكر في الأمر كوظيفة مرشح JavaScript Array. يتلقى وسيطتين بمعنى. (أ) كائن يحتوي على اسم الحقل/أزواج القيمة على النحو المحدد عبر ovFldNames في defineConfig() ، و (ب) params .
limit الأقصى الثلاثة للوسائط ، filter params اختياري. القيمة الافتراضية limit هي 10 .
والنتيجة هي مجموعة من [ uniqueId, relevanceScore ] ، مرتبة على relevanceScore .
مثل addDoc() ، فإنه يحتوي أيضًا على اسم مستعار predict( doc, uniqueId ) للحفاظ على توحيد مستوى API عبر حزم غصنة مختلفة مثل Wink-Naive-Bayes-Text-Classifier.
exportJSON()يمكن تصدير نموذج BM25 كنص JSON الذي يمكن حفظه في ملف. من الجيد تصدير JSON قبل التوحيد واستخدام نفسه كلما تحتاج المزيد من المستندات إلى إضافة ؛ في حين أن JSON تم تصديره بعد التوحيد هو جيد فقط لعملية البحث.
importJSON( json ) يمكن استيراد نموذج JSON BM25 الحالي للبحث. من الضروري استدعاء definePrepTasks() قبل محاولة البحث.
reset()إنه يعيد تعيين نموذج BM25 تمامًا عن طريق إعادة تخصيص جميع المتغيرات ، باستثناء المهام التحضيرية.
يوفر طرق الملحقات التالية:
getDocs() يعيد مصطلح الترددات وطول كل وثيقة.getTokens() إرجاع token: index .getIDF() إرجاع IDF لكل رمز. تتم الرجوع إلى الرموز عبر فهرسها العددي ، والذي يتم الوصول إليه عبر getTokens() .getConfig() إرجاع تكوين BM25F كما تم إعداده بواسطة defineConfig() .getTotalCorpusLength() يعيد إجمالي عدد الرموز في جميع المستندات المضافة.getTotalDocs() إرجاع إجمالي المستندات المضافة.ملاحظة: تعرض هذه الوصول إلى بعض بنية البيانات الداخلية ويجب على المرء الامتناع عن تعديلها. ويقصده حصريًا لغرض القراءة فقط. قد يؤدي أي تعديل مقصود أو غير مقصود إلى خلل خطير في الحزمة.
إذا اكتشفت خطأ ولم يتم الإبلاغ عن نفس الشيء ، فثر مشكلة جديدة أو فكر في إصلاحه وإرسال طلب سحب.
WinkJS هي عائلة من الحزم مفتوحة المصدر لمعالجة اللغة الطبيعية والتحليل الإحصائي والتعلم الآلي في NodeJs. تم توثيق الرمز بدقة لفهم الإنسان السهل ولديه تغطية اختبار تبلغ حوالي 100 ٪ للموثوقية لبناء حلول درجة الإنتاج.
Wink-BM25-Text-Search هو حقوق الطبع والنشر 2017-22 Graype Systems Private Limited.
وهي مرخصة بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.