การค้นหาข้อความแบบเต็มอย่างรวดเร็วตาม BM25
wink-bm25-text-search ซึ่งใช้ BM25-อัลกอริทึม R robabilistic R elies elide สำหรับการดึงเอกสารเป็นแพ็คเกจการค้นหาข้อความเต็มรูปแบบเพื่อพัฒนาแอพในสภาพแวดล้อม Node.js หรือเบราว์เซอร์ มันสร้างดัชนีการค้นหาในหน่วยความจำจากเอกสารอินพุต JSON ซึ่งปรับให้เหมาะสมสำหรับขนาดและความเร็ว
สำรวจตัวอย่างการค้นหาข้อความ Wink BM25 เพื่อขุดลึกลงไป:
รหัสของมันมีอยู่ใน repo showcase-BM25-text-search พร้อมกับโพสต์บล็อกโดยละเอียด
เป็นเรื่องง่ายที่จะเพิ่ม รสชาติความหมาย ในการค้นหาโดย:
การกำหนดน้ำหนักตัวเลขที่แตกต่างกันให้กับฟิลด์ น้ำหนักสนามเชิงลบจะดึงคะแนนของเอกสารลงเมื่อใดก็ตามที่การแข่งขันกับฟิลด์นั้นเกิดขึ้น
การใช้คุณสมบัติการประมวลผลข้อความที่หลากหลายของ Wink-NLP เช่น การตรวจจับการปฏิเสธ , การสืบทอด , lemmatization , หยุดการตรวจจับคำ และ การตรวจจับเอนทิตีที่มีชื่อ เพื่อทำการค้นหาอัจฉริยะ
การกำหนดงานการเตรียมข้อความที่แตกต่างกันแยกต่างหากสำหรับฟิลด์และข้อความสอบถาม
ใช้ 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 จัดการ IDF
ovFldNames (ไม่บังคับ) เป็นอาร์เรย์ที่มีชื่อของฟิลด์ซึ่งจะต้องเก็บค่าดั้งเดิมไว้ สิ่งนี้มีประโยชน์ในการลดพื้นที่การค้นหาโดยใช้ ตัวกรอง ใน search() การโทร API
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...'
}
ข้อมูลตัวอย่างถูกสร้างขึ้นโดยใช้ข้อความที่ตัดตอนมาจากบทความ Wikipedia เช่นหนึ่งใน Barack Obama
มันมีนามแฝง learn( doc, uniqueId ) เพื่อรักษาระดับความสม่ำเสมอของ API ในแพ็คเกจ Wink ต่างๆเช่น Wink-Naive-Bayes-text-classifier
consolidate( fp ) รวมโมเดล BM25 สำหรับเอกสารที่เพิ่มเข้ามาทั้งหมด fp กำหนดความแม่นยำที่ค่าความถี่คำศัพท์จะถูกเก็บไว้ ค่าเริ่มต้นคือ 4 และดีพอสำหรับสถานการณ์ส่วนใหญ่ มันเป็นข้อกำหนดเบื้องต้นสำหรับ search() และเอกสารไม่สามารถเพิ่มการรวมโพสต์ได้
search( text [, limit, filter, params ] ) ค้นหา text และส่งคืนไม่ limit จำนวนผลลัพธ์ filter ควรเป็นฟังก์ชั่นที่ต้องส่งคืนจริงหรือเท็จตาม params คิดว่ามันเป็นฟังก์ชั่นตัวกรองของ JavaScript Array ได้รับสองข้อโต้แย้ง ได้แก่ (a) วัตถุที่มีชื่อฟิลด์ชื่อ/ค่าคู่ตามที่กำหนดผ่านชื่อ ovFldNames ใน defineConfig() และ (b) params
limit อาร์กิวเมนต์สามข้อสุดท้าย filter และ params เป็นทางเลือก ค่าเริ่มต้นของ limit คือ 10
ผลที่ได้คืออาร์เรย์ของ [ uniqueId, relevanceScore ] เรียงลำดับบนเกี่ยวข้อง relevanceScore
เช่นเดียวกับ addDoc() นอกจากนี้ยังมีนามแฝง predict( doc, uniqueId ) เพื่อรักษาความสม่ำเสมอในระดับ API ในแพ็คเกจ Wink ต่างๆเช่น Wink-Naive-Bayes-text-classifier
exportJSON()รุ่น BM25 สามารถส่งออกเป็นข้อความ JSON ที่อาจบันทึกไว้ในไฟล์ เป็นความคิดที่ดีที่จะส่งออก JSON ก่อนที่จะรวมและใช้งานเดียวกันเมื่อใดก็ตามที่ต้องเพิ่มเอกสารเพิ่มเติม ในขณะที่ JSON ส่งออกหลังจากการรวมเป็นสิ่งที่ดีสำหรับการดำเนินการค้นหาเท่านั้น
importJSON( json ) รุ่น JSON BM25 ที่มีอยู่สามารถนำเข้าเพื่อค้นหา มันเป็นสิ่งสำคัญที่จะเรียก definePrepTasks() ก่อนที่จะพยายามค้นหา
reset()มันรีเซ็ตแบบจำลอง BM25 อย่างสมบูรณ์โดยการเริ่มต้นตัวแปรทั้งหมดใหม่ยกเว้นงานเตรียมการ
มันมีวิธีการต่อไปนี้ต่อไปนี้:
getDocs() ส่งคืนความถี่คำและความยาวของแต่ละเอกสารgetTokens() ส่งคืน token: indexgetIDF() ส่งคืน IDF สำหรับแต่ละโทเค็น โทเค็นถูกอ้างอิงผ่านดัชนีตัวเลขซึ่งเข้าถึงได้ผ่าน getTokens()getConfig() ส่งคืนการกำหนดค่า BM25F ตามที่ตั้งค่าโดย defineConfig()getTotalCorpusLength() ส่งคืนจำนวนโทเค็นทั้งหมดในเอกสารทั้งหมดที่เพิ่มเข้ามาgetTotalDocs() ส่งคืนเอกสารทั้งหมดที่เพิ่มเข้ามาหมายเหตุ: accessors เหล่านี้เปิดเผยโครงสร้างข้อมูลภายในบางส่วนและต้องละเว้นจากการแก้ไข มันมีความหมายเฉพาะเพื่อจุดประสงค์แบบอ่านอย่างเดียว การดัดแปลงโดยเจตนาหรือไม่ได้ตั้งใจอาจส่งผลให้เกิดความผิดปกติอย่างรุนแรงของแพ็คเกจ
หากคุณพบข้อผิดพลาดและยังไม่ได้รับรายงานให้เพิ่มปัญหาใหม่หรือพิจารณาแก้ไขและส่งคำขอดึง
WinkJS เป็นตระกูลของแพ็คเกจโอเพนซอร์สสำหรับ การประมวลผลภาษาธรรมชาติ การวิเคราะห์ทางสถิติ และ การเรียนรู้ของเครื่องจักร ใน NodeJS รหัสนี้ได้ รับการบันทึกไว้อย่างละเอียด เพื่อความเข้าใจของมนุษย์ที่ง่ายและมี ความครอบคลุมการทดสอบประมาณ 100% สำหรับความน่าเชื่อถือในการสร้างโซลูชันการผลิตเกรด
Wink-BM25-Text-Search เป็นลิขสิทธิ์ 2017-22 GREYPE Systems Private Limited
ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาต MIT