| Diskusikan di Relevance Slack
Searcharray mengubah kolom string panda menjadi indeks istilah. Ini menyiarkan skor frasa dan token individu BM25 / TFIDF yang efisien.
Pikirkan Lucene, tetapi sebagai kolom panda.
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 didokumentasikan dalam buku catatan ini:
Panduan Searcharray | Eksperimen Offline Searcharray | Tentang internal
pip install searcharray
def tokenize(value: str) -> List[str] ) saat pengindeksan.data_dir ke indeks untuk indeks memetakan memoriUntuk menyederhanakan pencarian leksikal di tumpukan data Python.
Banyak praktisi ML / AI mencapai solusi pencarian vektor, kemudian menyadari bahwa mereka perlu menaburkan dalam beberapa tingkat pencarian BM25 / leksikal. Mari kita dapatkan pencarian teks lengkap tradisional untuk berperilaku seperti bagian lain dari tumpukan data.
Searcharray menciptakan cara yang berpusat pada panda untuk membuat dan menggunakan indeks pencarian hanya sebagai bagian dari array panda. Dalam arti tertentu, ia membangun mesin pencari di panda - untuk memungkinkan siapa saja untuk membuat prototipe ide dan melakukan reranking, tanpa sistem eksternal.
Anda dapat melihat eksperimen relevansi pencarian ujung ke ujung penuh dalam buku catatan Colab ini
Yaitu, mari kita ambil kerangka data yang memiliki banyak teks, seperti judul film dan ikhtisar:
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 ...
Indeks teks:
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'})```
(Perhatikan tokenisasi bodoh - jangan khawatir Anda dapat melewati tokenizer Anda sendiri).
Lalu cari, mendapatkan N dengan 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])
Dan karena itu hanya panda, tentu saja kita dapat mengambil pertandingan teratas
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': [...
Lebih banyak kasus penggunaan dapat dilihat di Colab Notebook
Tujuan keseluruhannya adalah untuk menciptakan kembali banyak fitur leksikal (pencarian istilah / frasa) dari mesin pencari seperti Solr atau Elasticsearch, tetapi dalam bingkai data PANDAS.
Kami ingin indeks menjadi seefisien memori dan cepat mencari. Kami ingin menggunakannya memiliki overhead minimal.
Kami ingin Anda dapat bekerja dengan dataset yang masuk akal (100x-1m Docs) relatif efisien untuk evaluasi offline. Dan 1000 untuk reranking cepat dalam suatu layanan.
Alih-alih membangun untuk 'data besar', tujuan kami adalah membangun data kecil . Artinya, fokus pada kemampuan dan ekspresi panda, lebih membatasi fungsionalitas yang mendukung skalabilitas.
Untuk tujuan ini, aplikasi Searcharray akan cenderung berfokus pada eksperimen dan kandidat teratas. Untuk eksperimen, kami ingin ide -ide yang diungkapkan dalam panda memiliki jalur yang agak jelas / "kontrak" dalam bagaimana mereka akan diimplementasikan dalam mesin pencari leksikal klasik. Untuk reranking, kami ingin memuat beberapa hasil N atas dari sistem dasar dan dapat memodifikasinya.
Kita tahu dalam pencarian, kain, dan masalah pengambilan lainnya mendominasi teknik pencarian hibrida. Namun sering kali dilemparkan dalam hal mesin pencari leksikal raksasa, aneh, yang terlihat aneh bagi sebagian besar ilmuwan data yang bergabung dengan database vektor. Kami ingin pencarian leksikal lebih mudah didekati oleh para ilmuwan data dan insinyur ML yang membangun sistem ini.
Perpustakaan Python sudah melakukan tokenisasi dengan sangat baik. Bahkan melebihi apa yang dapat dilakukan Lucene ... memberi Anda kemampuan untuk mensimulasikan dan/atau melebihi kemampuan tokenisasi Lucene.
Di Searcharray, tokenizer adalah fungsi mengambil string dan memancarkan serangkaian token. IE DUMB, Tokenisasi Whitespace default:
def ws_tokenizer ( string ):
return string . split ()Dan Anda dapat melewati tokenizer apa pun yang cocok dengan tanda tangan ini untuk diindeks:
def ws_lowercase_tokenizer ( string ):
return string . lower (). split ()
df [ 'title_indexed' ] = SearchArray . index ( df [ 'title' ], tokenizer = ws_lowercase_tokenizer )Buat sendiri menggunakan perpustakaan batang, atau fungsionalitas python apa pun yang Anda inginkan.
Solr memiliki fungsi uniknya sendiri SyntaxHttps: //solr.apache.org/guide/7_7/function-queries.html. Elasticsearch tidak menyakitkan.
Alih -alih menciptakan kembali ini, cukup gunakan panda pada kolom panda yang ada. Kemudian, jika Anda perlu mengimplementasikan ini di Solr atau Elasticsearch, cobalah untuk menciptakan kembali fungsionalitas tersebut. Bisa dibilang apa yang ada di Solr / ES akan menjadi subset dari apa yang dapat Anda lakukan di panda.
# Calculate the number of hours into the past
df['hrs_into_past'] = (now - df['timestamp']).dt.total_seconds() / 3600
Lalu kalikan dengan BM25 jika Anda mau:
df['score'] = df['title_indexed'].score('Cat') * df['hrs_into_past']
Kami fokus pada leksikal, yaitu "BM25-ish" dan masalah yang berdekatan. Ada alat hebat lainnya untuk pencarian vektor di luar sana.
Kunjungi saluran #SearchArray di Relevance Slack