| ناقش في صلة الركود
يقوم SearchArray بتحويل أعمدة سلسلة Pandas إلى فهرس مصطلح. انها alows فعالة BM25 / TFIDF تسجيل العبارات والرموز الفردية.
فكر في لوكين ، ولكن كعمود Pandas.
from searcharray import SearchArray
import pandas as pd
df [ 'title_indexed' ] = SearchArray . index ( df [ 'title' ])
np . sort ( df [ 'title_indexed' ]. array . score ([ 'cat' , 'in' , 'the' , 'hat' ])) # Search w/ phrase
> BM25 scores :
> array ([ 0. , 0. , 0. , ..., 15.84568033 , 15.84568033 , 15.84568033 ])تم توثيق SearchArray في دفاتر الملاحظات هذه:
دليل SearchArray | SearchArray Explline Experience | حول الأجزاء الداخلية
pip install searcharray
def tokenize(value: str) -> List[str] ) عند الفهرسة.data_dir إلى فهرس للفهرس المعين للذاكرةلتبسيط البحث المعجمي في مكدس بيانات بيثون.
يصل العديد من ممارسي ML / AI إلى حل بحث متجه ، ثم يدركون أنهم يحتاجون إلى الرش في درجة ما من البحث BM25 / المعجمي. دعنا نحصل على بحث النص التقليدي الكامل للتصرف مثل أجزاء أخرى من مكدس البيانات.
يقوم SearchArray بإنشاء طريقة تركز على Pandas لإنشاء فهرس البحث واستخدامه كجزء من مجموعة Pandas. بمعنى ما ، يقوم ببناء محرك بحث في Pandas - للسماح لأي شخص بتطوير الأفكار وأداء Reranking ، دون أنظمة خارجية.
يمكنك رؤية تجربة صلة البحث الكاملة في دفتر كولاب هذا
أي ، دعنا نأخذ نظام بيانات يحتوي على مجموعة من النص ، مثل عنوان الفيلم والمظهر العام:
In[1]: df = pd.DataFrame({'title': titles, 'overview': overviews}, index=ids)
Out[1]:
title overview
374430 Black Mirror: White Christmas This feature-length special consists of three ...
19404 The Brave-Hearted Will Take the Bride Raj is a rich, carefree, happy-go-lucky second...
278 The Shawshank Redemption Framed in the 1940s for the double murder of h...
372058 Your Name. High schoolers Mitsuha and Taki are complete s...
238 The Godfather Spanning the years 1945 to 1955, a chronicle o...
... ... ...
65513 They Came Back The lives of the residents of a small French t...
65515 The Eleventh Hour An ex-Navy SEAL, Michael Adams, (Matthew Reese...
65521 Pyaar Ka Punchnama Outspoken and overly critical Nishant Agarwal ...
32767 Romero Romero is a compelling and deeply moving look ...
فهرس النص:
In[2]: df['title_indexed'] = SearchArray.index(df['title'])
df
Out[2]:
title overview title_indexed
374430 Black Mirror: White Christmas This feature-length special consists of three ... Terms({'Black', 'Mirror:', 'White'...
19404 The Brave-Hearted Will Take the Bride Raj is a rich, carefree, happy-go-lucky second... Terms({'The', 'Brave-Hearted', 'Wi...
278 The Shawshank Redemption Framed in the 1940s for the double murder of h... Terms({'The', 'Shawshank', 'Redemp...
372058 Your Name. High schoolers Mitsuha and Taki are complete s... Terms({'Your', 'Name.'}, {'Your': ...
238 The Godfather Spanning the years 1945 to 1955, a chronicle o... Terms({'The', 'Godfather'}, {'The'...
... ... ... ...
65513 They Came Back The lives of the residents of a small French t... Terms({'Back', 'They', 'Came'},...
65515 The Eleventh Hour An ex-Navy SEAL, Michael Adams, (Matthew Reese... Terms({'The', 'Hour', 'Eleventh': ...
65521 Pyaar Ka Punchnama Outspoken and overly critical Nishant Agarwal ... Terms({'Ka', 'Pyaar', 'Punchnama':...
32767 Romero Romero is a compelling and deeply moving look ... Terms({'Romero'})
65534 Poison Paul Braconnier and his wife Blandine only hav... Terms({'Poison'})```
(لاحظ الرمز المميز الغبي - لا تقلق من أنه يمكنك تمرير الرمز المميز الخاص بك).
ثم ابحث ، الحصول على أعلى n مع Cat
In[3]: np.sort(df['title_indexed'].array.score('Cat'))
Out[3]: array([ 0. , 0. , 0. , ..., 15.84568033,
15.84568033, 15.84568033])
In[4]: df['title_indexed'].score('Cat').argsort()
Out[4]:
array([0, 18561, 18560, ..., 15038, 19012, 4392])
وبما أنها مجرد pandas ، يمكننا ، بالطبع استرداد المباريات العليا
In[5]: df.iloc[top_n_cat[-10:]]
Out[5]:
title overview title_indexed
24106 The Black Cat American honeymooners in Hungary are trapped i... Terms({'Black': 1, 'The': 1, 'Cat': 1}, ...
12593 Fritz the Cat A hypocritical swinging college student cat ra... Terms({'Cat': 1, 'the': 1, 'Fritz': 1}, ...
39853 The Cat Concerto Tom enters from stage left in white tie and ta... Terms({'The': 1, 'Cat': 1, 'Concerto': 1...
75491 The Rabbi's Cat Based on the best-selling graphic novel by Joa... Terms({'The': 1, 'Cat': 1, "Rabbi's": 1}...
57353 Cat Run When a sexy, high-end escort holds the key evi... Terms({'Cat': 1, 'Run': 1}, {'Cat': [0],...
25508 Cat People Sketch artist Irena Dubrovna (Simon) and Ameri... Terms({'Cat': 1, 'People': 1}, {'Cat': [...
11694 Cat Ballou A woman seeking revenge for her murdered fathe... Terms({'Cat': 1, 'Ballou': 1}, {'Cat': [...
25078 Cat Soup The surreal black comedy follows Nyatta, an an... Terms({'Cat': 1, 'Soup': 1}, {'Cat': [0]...
35888 Cat Chaser A Miami hotel owner finds danger when be becom... Terms({'Cat': 1, 'Chaser': 1}, {'Cat': [...
6217 Cat People After years of separation, Irina (Nastassja Ki... Terms({'Cat': 1, 'People': 1}, {'Cat': [...
يمكن رؤية المزيد من حالات الاستخدام في دفتر كولاب
تتمثل الأهداف العامة في إعادة إنشاء الكثير من الميزات المعجمية (بحث مصطلح / عبارة) لمحرك البحث مثل Solr أو Elasticsearch ، ولكن في DataFrame Pandas.
نريد أن يكون الفهرس فعالًا للذاكرة وسريع في البحث قدر الإمكان. نريد استخدامه للحصول على الحد الأدنى من النفقات العامة.
نريد منك أن تكون قادرًا على العمل مع مجموعة بيانات معقولة (100x-1m Docs) بكفاءة نسبيًا للتقييم غير المتصلة بالإنترنت. و 1000s لإعادة صياغة سريع في الخدمة.
بدلاً من بناء "البيانات الضخمة" ، فإن هدفنا هو بناء البيانات الصغيرة . وهذا يعني ، التركيز على قدرات الباندا والتعبير عنها ، على الحد من الوظائف لصالح قابلية التوسع.
تحقيقًا لهذه الغاية ، تميل تطبيقات SearchArray إلى التركيز على التجريب وأعلى مرشح N. بالنسبة للتجربة ، نريد أن يكون لأي أفكار يتم التعبير عنها في Pandas مسارًا / "عقدًا" واضحًا إلى حد ما في كيفية تنفيذها في محرك بحث معجمي كلاسيكي. بالنسبة إلى Reranking ، نريد تحميل بعض نتائج أفضل N من نظام أساسي ونكون قادرين على تعديلها.
نحن نعلم في البحث ، والخرقة ، ومشاكل الاسترجاع الأخرى التي تهيمن عليها تقنيات البحث الهجينة. ومع ذلك ، في كثير من الأحيان ، من حيث محرك بحث معجمي عملاق ، غريب ، يبدو غريباً بالنسبة لمعظم علماء البيانات الذين ينضمون إلى قاعدة بيانات متجه. نريد أن يكون البحث المعجمي أكثر ودودة لعلماء البيانات ومهندسي ML يقومون ببناء هذه الأنظمة.
مكتبات بيثون تفعل بالفعل الرمز المميز جيدًا. حتى تجاوز ما يمكن أن يفعله لوسين ... يمنحك القدرة على محاكاة و/أو تجاوز قدرات الرمز المميز لوكين.
في SearchArray ، فإن Tokenizer هي وظيفة تأخذ سلسلة وتنبعث منها سلسلة من الرموز. أي غبية ، رمزية البيضاء الافتراضية:
def ws_tokenizer ( string ):
return string . split ()ويمكنك تمرير أي رمز يطابق هذا التوقيع مع الفهرس:
def ws_lowercase_tokenizer ( string ):
return string . lower (). split ()
df [ 'title_indexed' ] = SearchArray . index ( df [ 'title' ], tokenizer = ws_lowercase_tokenizer )قم بإنشاء خاص بك باستخدام مكتبات الانتقاء ، أو أي وظيفة Python التي تريدها.
لدى SOLR SYNTAXHTTPS SOLR الخاصة به: //solr.apache.org/guide/7_7/function-iredies.html. Elasticsearch لديه مؤلم.
بدلاً من إعادة إنشاء هذه ، ما عليك سوى استخدام الباندا على أعمدة Pandas الموجودة. ثم في وقت لاحق ، إذا كنت بحاجة إلى تنفيذ هذا في SOLR أو Elasticsearch ، فحاول إعادة إنشاء الوظيفة. يمكن القول إن ما هو موجود في Solr / es سيكون مجموعة فرعية مما يمكنك فعله في الباندا.
# Calculate the number of hours into the past
df['hrs_into_past'] = (now - df['timestamp']).dt.total_seconds() / 3600
ثم اضرب بواسطة BM25 إذا كنت تريد:
df['score'] = df['title_indexed'].score('Cat') * df['hrs_into_past']
نحن نركز على المعجمية ، أي "BM25-ish" والمشاكل المجاورة. هناك أدوات رائعة أخرى للبحث في المتجهات هناك.
تفضل بزيارة قناة #SearchArray على سلاك الصلة