Semantische Suche nach Schlagzeilen und Story-Texten
tldrstory ist eine semantische Suchanwendung für Schlagzeilen und Textinhalte im Zusammenhang mit Geschichten. tldrstory wendet Zero-Shot-Labeling auf Text an, was eine dynamische Kategorisierung von Inhalten ermöglicht. Dieses Framework erstellt auch einen txtai-Index, der die Suche nach Textähnlichkeiten ermöglicht. Eine anpassbare Streamlit-Anwendung und ein FastAPI-Backend-Dienst ermöglichen Benutzern die Überprüfung und Analyse der verarbeiteten Daten.
tldrstory verfügt über einen entsprechenden Medium-Artikel, der die Konzepte in dieser README-Datei und mehr behandelt. Hör zu!
Die folgenden Links sind Beispielanwendungen, die mit tldrstory erstellt wurden.
Der einfachste Weg zur Installation ist über Pip und PyPI
pip install tldrstory
Sie können tldrstory auch direkt von GitHub installieren. Die Verwendung einer virtuellen Python-Umgebung wird empfohlen.
pip install git+https://github.com/neuml/tldrstory
Python 3.8+ wird unterstützt
Unter diesem Link finden Sie Hilfe bei der Lösung umgebungsspezifischer Installationsprobleme.
Nach der Installation muss eine Anwendung für die Ausführung konfiguriert werden. Eine tldrstory-Anwendung besteht aus drei separaten Prozessen:
In diesem Abschnitt erfahren Sie, wie Sie die Anwendung „Sportnachrichten“ starten.
mkdir sports
wget https://raw.githubusercontent.com/neuml/tldrstory/master/apps/sports/app.yml -O sports/app.yml
wget https://raw.githubusercontent.com/neuml/tldrstory/master/apps/sports/api.yml -O sports/api.yml
wget https://raw.githubusercontent.com/neuml/tldrstory/master/apps/sports/index-simple.yml -O sports/index.yml
wget https://raw.githubusercontent.com/neuml/tldrstory/master/src/python/tldrstory/app.py -O sports/app.py
python -m tldrstory.index sports/index.yml
CONFIG=sports/api.yml API_CLASS=tldrstory.api.API uvicorn " txtai.api:app " &
streamlit run sports/app.py sports/app.yml " Sports " " ? "
Standardmäßig unterstützt tldrstory das Lesen von Daten aus RSS und der Reddit-API. Zusätzliche Datenquellen können definiert und konfiguriert werden.
Im Folgenden sehen Sie ein Beispiel für eine benutzerdefinierte Datenquellendefinition. neuspo ist eine Echtzeit-Sportereignis- und Nachrichtenanwendung. Diese Datenquelle lädt 4 vordefinierte Einträge in die Artikeldatenbank.
from tldrstory . source . source import Source
class Neuspo ( Source ):
"""
Articles have the following schema:
uid - unique id
source - source name
date - article date
title - article title
url - reference url for data
entry - entry date
"""
def run ( self ):
# List of articles created
articles = []
articles . append ( self . article ( "0" , "Neuspo" , self . now (), "Eagles defeat the Giants 22 - 21" ,
"https://neuspo.com/stream/34952e3919d685982c17735018b0197f" , self . now ()))
articles . append ( self . article ( "1" , "Neuspo" , self . now (), "Giants lose to the Eagles 22 - 21" ,
"https://t.co/e9FFgo0wgR?amp=1" , self . now ()))
articles . append ( self . article ( "2" , "Neuspo" , self . now (), "Rays beat Dodgers 6 to 4" ,
"https://neuspo.com/stream/6cb820b3ebadc086aa36b5cc4a0f575d" , self . now ()))
articles . append ( self . article ( "3" , "Neuspo" , self . now (), "Dodgers drop Game 2, 6-4" ,
"https://t.co/1hEQAShVnP?amp=1" , self . now ()))
return articles
Führen wir die obigen Schritte erneut aus und verwenden dabei neuspo als Datenquelle. Entfernen Sie zunächst das Verzeichnis „sports/data“, um sicherzustellen, dass wir eine neue Datenbank erstellen. Anschließend können wir das Wesentliche oben im Sportverzeichnis herunterladen.
# Delete the sports/data directory before running
wget https://gist.githubusercontent.com/davidmezzetti/9a6064d9a741acb89bd46eba9f906c26/raw/7058e97da82571005b2654b4ab908f25b9a04fe2/neuspo.py -O sports/neuspo.py
Bearbeiten Sie sports/index.yml und entfernen Sie den RSS-Bereich. Ersetzen Sie es durch Folgendes.
# Custom data source for neuspo
source : sports.neuspo.Neuspo
Führen Sie nun die Schritte 2–4 der obigen Anweisungen erneut aus.
In den folgenden Abschnitten werden Konfigurationsparameter für jeden Prozess definiert, der Teil einer tldrstory-Anwendung ist.
Konfiguriert die Indizierung von Inhalten. Unterstützt derzeit das Abrufen von Daten über die Reddit-API, RSS und benutzerdefinierte benutzerdefinierte Quellen.
name : string
Anwendungsname
schedule : string
Zeichenfolge im Cron-Stil, die die geplante Ausführung des Indizierungsauftrags ermöglicht. Weitere Informationen zu Cron-Strings finden Sie unter diesem Link.
Konfiguration der Datenquelle.
reddit.subreddit : name of subreddit to pull from
reddit.sort : sort type
reddit.time : time range
reddit.queries : list of text queries to run
Führt eine Reihe von Reddit-API-Abfragen aus. Damit diese Methode funktioniert, muss ein Reddit-API-Schlüssel erstellt und konfiguriert werden. Authentifizierungsparameter können innerhalb der Umgebung oder in einer praw.ini-Datei festgelegt werden. Weitere Informationen zum Einrichten eines Reddit-API-Kontos finden Sie unter diesem Link. Es ist lediglich ein schreibgeschützter Zugriff erforderlich.
Weitere Informationen zum Konfigurieren der Abfrageeinstellungen finden Sie in der PRAW-Dokumentation.
rss : list of RSS urls
Liest eine Reihe von RSS-Feeds und erstellt Artikel für jeden gefundenen Artikellink.
source : string
Konfiguriert eine benutzerdefinierte Quelle. Dieser Parameter akzeptiert einen vollständigen Klassenpfad als Zeichenfolge, zum Beispiel „tldrstory.source.rss.RSS“.
Benutzerdefinierte Quellen können alle Daten verwenden, die ein Datum, eine Textzeichenfolge und eine Referenz-URL enthalten. Informationen zum Erstellen einer benutzerdefinierten Quelle finden Sie in der Dokumentation in source.py. rss.py und reddit.py sind Beispielimplementierungen.
ignore : list of url patterns
Liste der zu ignorierenden URL-Muster. Unterstützt Zeichenfolgen und reguläre Ausdrücke.
labels : dict
Etikettenkonfiguration für Zero-Shot-Klassifikator. Diese Konfiguration legt eine Kategorie zusammen mit einer Liste von Themenwerten fest.
Beispiel:
labels :
topic :
values : [Label 1, Label 2]
Das obige Beispiel konfiguriert die Kategorie „Topic“ mit zwei möglichen Labels, „Label 1“ und „Label 2“. Hier kann eine beliebige Beschriftung festgelegt werden und ein umfangreiches NLP-Modell wird verwendet, um Eingabetext in diese Beschriftungen zu kategorisieren.
path : string
Wo die Modellausgabe gespeichert werden soll; Pfad wird erstellt, falls er noch nicht vorhanden ist.
embeddings : dict
Konfiguriert einen txtai-Index, der für die Suche nach Themen verwendet wird. Weitere Einzelheiten hierzu finden Sie unter txtai-Konfiguration.
Konfiguriert eine FastAPI-gestützte Schnittstelle zum Abrufen indizierter Daten.
path : string
Pfad zu einem Modellindex.
Die Standardanwendung wird von Streamlit unterstützt und von einer YAML-Konfigurationsdatei gesteuert. Die Konfigurationsdatei legt den Anwendungsnamen, den API-Endpunkt zum Abrufen von Inhalten und die Komponentenkonfiguration fest. Stattdessen kann eine benutzerdefinierte Streamlit-Anwendung oder eine andere Anwendung verwendet werden, um Inhalte direkt vom API-Endpunkt abzurufen.
name : string
Anwendungsname
api : url
API-Endpunkt zum Abrufen von Inhalten.
description : string
Markdown-String, der zum Erstellen einer Seitenleistenbeschreibung verwendet wird.
queries.name : Queries drop down header
queries.values : List of values to use for queries drop down
Konfiguriert das Abfrage-Dropdown-Feld. Dies sollte eine Liste vorgefertigter Abfragen sein, die verwendet werden sollen. Wenn der Wert „Neueste“ vorhanden ist, werden die letzten N Artikel abgefragt. Wenn der Wert „--Search--“ vorhanden ist, wird ein weiteres Textfeld angezeigt, in das benutzerdefinierte Abfragen eingegeben werden können.
filters : list
Liste der Schiebereglerfilter. Dies sollte den im Indexierungsabschnitt konfigurierten Zero-Shot-Labels zugeordnet werden.
chart.name : Chart name
chart.x : Chart x-axis column
chart.y : Chart y-axis column
chart.scale : Color scale for list of colors
chart.colors : List of colors
Ermöglicht die Konfiguration eines Streudiagramms, das zwei Beschriftungspunkte grafisch darstellt. Dieses Diagramm kann zum Zeichnen und Anwenden von Farben auf angebrachte Etiketten verwendet werden.
" column name " : dynamic range of coloring
Datentabelle, die Ergebnisdetails anzeigt. Zusätzlich zu den Standardspalten ermöglicht dieser Abschnitt das Hinzufügen zusätzlicher Spalten basierend auf den angewendeten Zero-Shot-Labels. Im Standardmodus wird der numerische Wert der Beschriftung angezeigt, es können jedoch auch verschiedene Textbeschriftungen angewendet werden.
Zum Beispiel:
Das Obige würde für Werte zwischen 0 und 5 den Text „Label 1“ in Rot ausgeben. Werte zwischen 5 und 10 würden den Text „Label 2“ in Grün ausgeben.