| Обсудить в Slack
SearchArray превращает столбцы String Pandas в индекс термина. Это способствует эффективному BM25 / TFIDF, забивающим фразы и индивидуальных токенов.
Думайте Lucene, но как колонна 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 задокументирован в этих ноутбуках:
Guide Guide | SearchArray Offline Experiment | О внутренних органах
pip install searcharray
def tokenize(value: str) -> List[str] ) при индексации.data_dir для индекса для отображения памяти индексЧтобы упростить лексический поиск в стеке данных Python.
Многие практикующие ML / AI достигают векторного поиска, а затем понимают, что им нужно посыпать некоторую степень BM25 / лексического поиска. Давайте получим традиционный полнотекстовый поиск, чтобы вести себя как другие части стека данных.
SearchArray создает ориентированный на пандас способ создания и использования индекса поиска как часть массива Pandas. В некотором смысле, он создает поисковую систему в Пандах - чтобы позволить кому -либо прототипить идеи и выполнять повторное движение без внешних систем.
Вы можете увидеть полный эксперимент по релевантности на сквозняке в этой ноутбуке Colab
Т.е. давайте возьмем данные о данных с кучей текста, например, название фильма и обзоры:
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])
А так как это просто панда, мы, конечно, просто получить лучшие матчи
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': [...
Больше вариантов использования можно увидеть в ноутбуке Colab
Общие цели состоит в том, чтобы воссоздать многие лексические функции (термин / поиск фразы) поисковой системы, такой как Solr или Elasticsearch, но в DataFrame Pandas.
Мы хотим, чтобы индекс был как можно более эффективным и быстрым в поиске. Мы хотим использовать его, чтобы иметь минимальные накладные расходы.
Мы хотим, чтобы вы имели возможность работать с разумным набором данных (100X-1M DOCS) относительно эффективно для офлайн-оценки. И 1000 -е для быстрого повторения в сервисе.
Вместо того, чтобы создавать для «больших данных», наша цель-построить для малых данных . То есть сосредоточиться на возможностях и выразительности пандов, чрезмерно ограничивая функциональность в пользу масштабируемости.
С этой целью, приложения SearchArray будут сфокусированы на экспериментах и ведущих кандидатах. Для экспериментов мы хотим, чтобы какие -либо идеи, выраженные в пандах, имели несколько четкий путь / «контракт» в том, как они будут реализованы в классической лексической поисковой системе. Для переиздания мы хотим загрузить некоторые лучшие результаты N из базовой системы и иметь возможность их модифицировать.
Мы знаем в поиске, тряпке и других методах гибридного поиска в поисках. Тем не менее, часто его составьте с точки зрения гигантской, странной, большей лексической поисковой системы, которая выглядит странно для большинства ученых данных, соединяемых с векторной базой данных. Мы хотим, чтобы Lexical Search был более доступным для ученых данных и инженеров ML, создающих эти системы.
Библиотеки Python уже очень хорошо справляются с токенами. Даже превышение того, что может сделать Лусене ... давая вам возможность имитировать и/или превышать способности токенизации Lucene.
В SearchArray токенизатор - это функция, которая принимает строку и издает серию жетонов. Т.е. тупо, токенизация по умолчанию:
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 )Создайте свой собственный, используя библиотеки Stemming, или любую функциональность Python, которую вы хотите.
Solr имеет свой собственный уникальный функциональный запрос Syntaxhttps: //solr.apache.org/guide/7_7/function-queries.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 по ослабке актуальности