
การค้นหาข้อความที่รวดเร็วเบาและปรับแต่งได้และการค้นหาข้อความความหมายใน Python
Neofuzz เป็นไลบรารีการค้นหาที่คลุมเครือโดยใช้ vectorization และเทคนิคการค้นหาเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณ
ตอนนี้คุณสามารถสั่งซื้อผลการค้นหาใหม่โดยใช้ระยะทาง Levenshtein! บางครั้งกระบวนการ N-Gram หรือกระบวนการเวกเตอร์ไม่ได้สั่งผลลัพธ์อย่างถูกต้อง ในกรณีเหล่านี้คุณสามารถดึงตัวอย่างจำนวนมากขึ้นจากคลังข้อมูลที่จัดทำดัชนีจากนั้นปรับแต่งผลลัพธ์เหล่านั้นด้วยระยะทาง Levenshtein
from neofuzz import char_ngram_process
process = char_ngram_process ()
process . index ( corpus )
process . extract ( "your query" , limit = 30 , refine_levenshtein = True )ห้องสมุดการค้นหาที่คลุมเครือส่วนใหญ่อาศัยการปรับให้เหมาะสมกับอัลกอริทึมการค้นหาแบบฟัซซี่คู่เดียวกัน (ระยะทาง hamming ระยะทาง Levenshtein) บางครั้งน่าเสียดายที่เนื่องจากความซับซ้อนของอัลกอริทึมเหล่านี้ไม่มีการเพิ่มประสิทธิภาพจำนวนมากจะทำให้คุณมีความเร็วที่คุณต้องการ
Neofuzz ทำให้การรับรู้ว่าคุณไม่สามารถเกินขีด จำกัด ความเร็วได้โดยอาศัยอัลกอริทึมแบบดั้งเดิมและใช้การทำให้เป็นเวกเตอร์ข้อความและการค้นหาเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณในพื้นที่เวกเตอร์เพื่อเร่งกระบวนการนี้
เมื่อพูดถึงภาวะที่กลืนไม่เข้าคายไม่ออกของความเร็วเมื่อเทียบกับความแม่นยำ Neofuzz จะมีความเร็วเต็มรูปแบบ
คุณสามารถติดตั้ง neofuzz จาก PYPI:
pip install neofuzz หากคุณต้องการประสบการณ์การเล่นและการเล่นคุณสามารถสร้างกระบวนการที่รวดเร็วและสกปรกโดยทั่วไปด้วยกระบวนการ char_ngram_process()
from neofuzz import char_ngram_process
# We create a process that takes character 1 to 5-grams as features for
# vectorization and uses a tf-idf weighting scheme.
# We will use cosine distance for the nearest neighbour search.
process = char_ngram_process ( ngram_range = ( 1 , 5 ), metric = "cosine" , tf_idf = True )
# We index the options that we are going to search in
process . index ( options )
# Then we can extract the ten most similar items the same way as in
# thefuzz
process . extract ( "fuzz" , limit = 10 )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[( 'fuzzer' , 67 ),
( 'Januzzi' , 30 ),
( 'Figliuzzi' , 25 ),
( 'Fun' , 20 ),
( 'Erika_Petruzzi' , 20 ),
( 'zu' , 20 ),
( 'Zo' , 18 ),
( 'blog_BuzzMachine' , 18 ),
( 'LW_Todd_Bertuzzi' , 18 ),
( 'OFU' , 17 )]คุณสามารถปรับแต่งพฤติกรรมของ Neofuzz โดยการทำกระบวนการที่กำหนดเอง ภายใต้ประทุนทุกกระบวนการของ Neofuzz ขึ้นอยู่กับสององค์ประกอบเดียวกัน:
หากคุณสนใจคำ/เนื้อหาความหมายของข้อความมากขึ้นคุณสามารถใช้เป็นคุณสมบัติได้ สิ่งนี้มีประโยชน์มากโดยเฉพาะกับข้อความที่ยาวขึ้นเช่นงานวรรณกรรม
from neofuzz import Process
from sklearn . feature_extraction . text import TfidfVectorizer
# Vectorization with words is the default in sklearn.
vectorizer = TfidfVectorizer ()
# We use cosine distance because it's waay better for high-dimentional spaces.
process = Process ( vectorizer , metric = "cosine" )คุณอาจพบว่าความเร็วของกระบวนการค้นหาที่คลุมเครือของคุณไม่เพียงพอ ในกรณีนี้อาจเป็นที่พึงปรารถนาที่จะลดมิติของเวกเตอร์ที่ผลิตด้วยวิธีการสลายตัวของเมทริกซ์หรือโมเดลหัวข้อ
ที่นี่ตัวอย่างฉันใช้ NMF (โมเดลหัวข้อที่ยอดเยี่ยมและเร็วอย่างไม่น่าเชื่อเช่นกัน) เพิ่มความเร็วในการค้นหาไปป์ไลน์การค้นหาที่คลุมเครือของฉัน
from neofuzz import Process
from sklearn . feature_extraction . text import TfidfVectorizer
from sklearn . decomposition import NMF
from sklearn . pipeline import make_pipeline
# Vectorization with tokens again
vectorizer = TfidfVectorizer ()
# Dimensionality reduction method to 20 dimensions
nmf = NMF ( n_components = 20 )
# Create a pipeline of the two
pipeline = make_pipeline ( vectorizer , nmf )
process = Process ( pipeline , metric = "cosine" )ด้วย Neofuzz คุณสามารถใช้การฝังความหมายเพื่อประโยชน์ของคุณได้อย่างง่ายดายและสามารถใช้ทั้งแบบจำลองภาษาที่ใช้ความสนใจ (BERT) เพียงแค่คำศัพท์ทางประสาทหรือเอกสารที่ใช้งานง่าย (Word2vec, Doc2vec, FastText ฯลฯ ) หรือแม้แต่ LLM ของ OpenAI
เราขอแนะนำให้คุณลอง Emgetter ซึ่งมี vectorizers ที่เข้ากันได้กับ Sklearn จำนวนมาก
pip install embetter from embetter . text import SentenceEncoder
from neofuzz import Process
# Here we will use a pretrained Bert sentence encoder as vectorizer
vectorizer = SentenceEncoder ( "all-distilroberta-v1" )
# Then we make a process with the language model
process = Process ( vectorizer , metric = "cosine" )
# Remember that the options STILL have to be indexed even though you have a pretrained vectorizer
process . index ( options )