Die Menge an Informationen, die uns umgibt, nimmt ständig zu. Jeden Tag werden über 3 Millionen Blogs im Internet veröffentlicht (Internetlivestats, 2020). Die Indizierung dieser Informationen hat Google groß gemacht - ihre Suchmaschine verarbeitet satte 3,5 Milliarden + Suchanfragen pro Tag (Internetlivestats, 2020).
Inzwischen hat Covid-19 die Welt in seinem Griff. Während Wissenschaftler den Fortschritt der Krankheit messen und beobachten, erfahren wir alle ein bisschen mehr, da sie ihre Ergebnisse täglich in Artikeln und Blogs veröffentlichen. Ich war neugierig zu erfahren, was es da draußen alles gibt. Bei meinen Recherchen stieß ich auf diesen Datensatz mit 550K Artikeln über Covid-19. Damit war die Sache besiegelt: Ich wollte eine Suchmaschine für Artikel über Covid-19 entwickeln. Ich habe mein eigenes Tool entwickelt, um die Pandemie besser zu verstehen, und in diesem Blog erzähle ich Ihnen, wie ich das gemacht habe. Für diejenigen unter Ihnen, die es nicht abwarten können, klicken Sie hier, um es auszuprobieren.
Anatomie einer Covid-19 Suchmaschine
Am Ende sah meine Covid-19-Suchmaschine wie folgt aus:
Zur Erstellung dieser Lösung habe ich die folgende Technologie verwendet:
- Suchmaschine: Azure Kognitive Suche
- Datenspeicherung: Azure Blob Speicher
- Benutzeroberfläche: Docker und Streamlit
- App-Bereitstellung: Azure Container Registry und Azure App Services
Zunächst werde ich meinen Gesamtprozess skizzieren. Zunächst habe ich die Artikel im Blob-Speicher gespeichert und die kognitive Such-API verwendet, um alle Artikel zu indizieren. Dann habe ich eine einfache Benutzeroberfläche mit einer Suchleiste zur Eingabe von Suchanfragen erstellt. Die Suchleiste sendet die Suchanfrage an die kognitive Such-API, die die relevantesten Ergebnisse zurückgibt. Um die gesamte Anwendung bereitzustellen, habe ich sie in ein Docker-Image eingebettet, das ich in die Azure Container Registry gestellt habe. Azure App Services stellt dieses Image dann als Website zur Verfügung, die Sie hier finden können. Eine schematische Visualisierung der gesamten Lösung finden Sie unten.
Lassen Sie uns die einzelnen Schritte im Detail durchgehen, damit Sie die Lösung selbst nachstellen können.
Schritt 1: Holen Sie sich den Code
Bevor wir beginnen, klonen Sie das Code-Repository in einen Ordner auf Ihrem Computer. Mit kleinen Änderungen können Sie Ihre eigene Suchmaschine mit anderen Dateien erstellen. Verwenden Sie Ihr Terminal, um zum Ordner build-your-own-search-engine zu navigieren, in dem Sie den gesamten Code finden.
cd build-your-own-search-engine
Schritt 2: Abrufen der Daten
Werfen wir zunächst einen Blick auf den Datensatz, um eine Vorstellung davon zu bekommen, womit wir es zu tun haben. Der Datensatz enthält über 1,5 Millionen Artikel zum Thema Covid-19, die zwischen November 2019 und Juli 2020 aus über 400 Quellen weltweit gesammelt wurden. Sie können den kompletten Satz hier herunterladen (bitte beachten Sie, dass er >7 GB groß ist).
In der Schnittstelle möchte ich das Artikeldatum, die Quelle, den Titel und den Inhalt anzeigen können. Daher bin ich an den folgenden Variablen im Datensatz interessiert:
- Identifikator: zur eindeutigen Identifizierung der Dokumente
- Zeitstempel: zum Sortieren der Artikel nach Aktualität
- Quelle: um zu überprüfen, woher die Daten stammen
- Artikeltitel: um den Artikel zu indizieren und als Suchergebnis anzuzeigen
- Artikeltext: um den Artikel zu indizieren und als Suchergebnis anzuzeigen
Der Einfachheit halber empfehle ich Ihnen, die vorbereitete Teilmenge der Artikel zu verwenden, die im Repository gespeichert ist (data/aylien_covid_news_data_sample.jsonl). Wenn Sie jedoch die gesamte Menge verwenden möchten, folgen Sie den nächsten Schritten.
Nachdem Sie den Datensatz heruntergeladen haben, entpacken Sie ihn und legen ihn in den Ordner data im geklonten Verzeichnis ab. Öffnen Sie Ihr Terminal, gehen Sie in den Datenordner und führen Sie den folgenden Code aus.
python preprocessing_sample.py
Dadurch wird eine Datei namens "aylien_covid_news_data_sample.jsonl" erstellt. In dieser Datei befinden sich 50 Beispieldatensätze. Wenn Sie alle Daten haben möchten, führen Sie stattdessen das Skript preprocessing_all.py aus. Dadurch wird eine Reihe von Dateien mit jeweils 100K Dokumenten erstellt. Beachten Sie, dass das Herunterladen, die Vorverarbeitung, das Hochladen und die Indizierung aller Datensätze sehr viel Zeit in Anspruch nimmt. Deshalb empfehle ich Ihnen, stattdessen die vorbereitete Teilmenge zu verwenden.
Schritt 3: Speichern Sie die Daten in der Cloud
Wir müssen die Daten im Azure Blob Storage speichern. Wenn Sie noch kein Azure-Konto haben, können Sie sich kostenlos anmelden. Legen Sie zunächst ein Speicherkonto an und erstellen Sie dann einen Container. Stellen Sie sicher, dass der Name des Containers "covid-news" lautet oder ändern Sie den verwendeten Containernamen später im setup_acs.py Skript. Laden Sie schließlich die erstellte Datei "aylien_covid_news_data_sample.jsonl" in den von Ihnen erstellten Container hoch.
Schauen Sie sich die Verbindungszeichenfolge des Speicherkontos an. Sie können Ihren Verbindungsstring im Azure-Portal hier finden:
Wir müssen diese Zeichenfolge als Umgebungsvariable namens SA_CONN_STR auf Ihrem Rechner registrieren. Die Verbindungszeichenfolge, die Sie von der Benutzeroberfläche kopieren, enthält am Ende einen veralteten Teil, der unsere Lösung stören würde. Löschen Sie daher den Teil der Zeichenkette nach ==;. Fügen Sie dann die folgende Zeile zu Ihrer ~/.bash_profile hinzu und ersetzen Sie den Teil zwischen den Anführungszeichen durch den entsprechenden Teil Ihrer Verbindungszeichenkette:
export SA_CONN_STR='DefaultEndpointsProtocol=https;AccountName=XXX;AccountKey=XXX==;'
Öffnen Sie ein neues Terminal und überprüfen Sie, ob Ihre Verbindungszeichenfolge korrekt als Umgebungsvariable gespeichert ist, indem Sie ausführen:
echo $SA_CONN_STR
Wenn Sie es richtig gemacht haben, sollte dies die Verbindungszeichenfolge ausgeben. Wenn Sie hier nicht weiterkommen, googeln Sie, wie Sie Umgebungsvariablen zu Ihrem Betriebssystem hinzufügen können.
Schritt 4: Erstellen Sie die Suchmaschine
Navigieren Sie im Azure-Portal zum Azure-Suchdienst. Erstellen Sie einen neuen Suchdienst. Notieren Sie sich die URL von der Übersichtsseite. Dies ist der ACS_ENDPOINT. Navigieren Sie dann zur Registerkarte Schlüssel im linken Fensterbereich. Der primäre Administratorschlüssel ist Ihr ACS_API_KEY. Fügen Sie außerdem Ihre Client-IP auf der Registerkarte Netzwerk hinzu. Vergessen Sie nicht, auf Speichern zu klicken!
Registrieren Sie nun auch den ACS_ENDPOINT und ACS_API_KEY auf Ihrem Rechner als Umgebungsvariablen.
Sie finden sie über das Azure-Portal hier:
Wenn Sie Ihre Umgebungsvariablen exportieren, beachten Sie bitte den nachgestellten Schrägstrich im ACS_ENDPOINT.
export ACS_API_KEY=XXX
export ACS_ENDPOINT='https://XXX.search.windows.net/'
Bitte beachten Sie das '/' am Ende des ACS_ENDPOINT.
Wenn Sie die Umgebungsvariablen hinzugefügt haben, öffnen Sie ein neues Terminal und führen Sie das Setup-Skript aus:
my-search-engine-demo/my-search-engine-demo/setup_acs.py
Um Artikel zu indizieren, müssen Sie vier Dinge tun:
- Erstellen Sie eine Datenquelle Lesen Sie die Dokumente
- Erstellen Sie einen Index lesen Sie die Dokumente
- Erstellen Sie einen Indexer Lesen Sie die Dokumente
- Starten Sie den Indexer und lesen Sie die Dokumentation
Ich habe ein Skript für Sie erstellt, das diese Aufgabe übernimmt. Aber bevor Sie es ausführen können, müssen Sie den Suchdienst erstellen.
Installieren Sie zunächst die Abhängigkeiten. Wahrscheinlich möchten Sie dies in einer virtuellen Umgebung tun, z.B.
virtualenv <name_env>
source <name_env>/bin/activate
pip install -r my-search-engine-demo/requirements.txt
Führen Sie dann den folgenden Befehl aus:
python my-search-engine-demo/my-search-engine-demo/setup_acs.py
Dadurch wird der Indizierungsprozess ausgelöst. Warten Sie, bis Sie die Meldung "Indexer created correctly..." und ein ausgefallenes ASCII-Bild sehen, das Ihnen mitteilt, dass die Indizierung abgeschlossen ist.
Wenn bei Ihnen Timeout-Fehler auftreten, überprüfen Sie bitte, ob Ihre IP in den Netzwerkeinstellungen im Azure-Portal für Azure Cognitive Search auf der Whitelist steht. Wenn nicht, fügen Sie bitte Ihre IP hinzu.
Schritt 5: Entwickeln Sie die Benutzeroberfläche
Für die Benutzeroberfläche werden wir eine Streamlit-App erstellen. Laut ihrer Website:
"Das Open-Source-App-Framework von Streamlit ist der einfachste Weg für Datenwissenschaftler und Ingenieure für maschinelles Lernen, in nur wenigen Stunden schöne, leistungsstarke Apps zu erstellen! Alles in reinem Python. Alles kostenlos.""
Lassen Sie uns das doch einmal ausprobieren. Sehen Sie sich die Datei "my-search-engine-demo/my-search-engine-demo/user_interface.py" im Repository an, um zu sehen, wie die Benutzeroberfläche aufgebaut ist.
Der Paginator und die Funktionen zum Herunterladen von Ergebnissen sind "nice to haves". Sie können sie also weglassen, wenn Sie möchten. Die folgenden Funktionen sind unerlässlich:
1) Erstellen Sie einen Titel 2) Rendern Sie ein Bild 3) Erstellen Sie die Suchleiste 4) Laden Sie die API-Geheimnisse 5) Senden Sie die Suchanfrage an die API 6) Rendern Sie die Ergebnisse
Sie können es lokal ausprobieren, indem Sie es ausführen:
streamlit run my-search-engine-demo/my-search-engine-demo/user_interface.py
Schritt 6: Bereitstellen der Benutzeroberfläche
Docker-Image
Für diesen Teil müssen Sie Docker auf Ihrem lokalen Rechner installieren.
Laut ihrer Website:
"Docker ist eine offene Plattform für die Entwicklung, Bereitstellung und Ausführung von Anwendungen. Docker ermöglicht es Ihnen, Ihre Anwendungen von Ihrer Infrastruktur zu trennen, so dass Sie Software schnell bereitstellen können."
Wir werden ein Docker-Image mit den erforderlichen Abhängigkeiten und dem Code für die Benutzeroberfläche erstellen.
Wir erstellen das Image aus dem Verzeichnis my-search-engine-demo/my-search-engine-demo, indem wir es ausführen:
docker build --build-arg BUILDTIME_ACS_API_KEY=${ACS_API_KEY} --build-arg BUILDTIME_ACS_ENDPOINT=${ACS_ENDPOINT} --build-arg BUILDTIME_SA_CONN_STR=${SA_CONN_STR} -t covid-19-search:latest .
Auf diese Weise erstellen wir ein Docker-Image mit dem Tag "my-search-engin-demo:latest". Die Umgebungsvariablen werden in das Image kopiert.
Um zu testen, ob Ihr Image korrekt erstellt wurde, führen Sie es lokal aus:
docker run -p 8080:8080 covid-19-search:latest
Sie sollten nun in der Lage sein, von Ihrem Browser aus mit localhost:8080 auf die Benutzeroberfläche zuzugreifen.
Der exponierte Port wird in der Dockerdatei angegeben. Wenn Sie den Dienst an einem anderen Port bereitstellen möchten, ändern Sie ihn dort.
Azure Container-Registrierung
Jetzt müssen wir eine Azure-Container-Registrierung erstellen. Schreiben Sie den Servernamen auf, etwa "XXX.Azurecr.io
Aktivieren Sie im Menü Zugangsschlüssel die Option admin und notieren Sie sich den Benutzernamen und das Passwort, mit denen Sie sich beim Server anmelden können.
Jetzt ist es an der Zeit, das Bild in die Registrierung zu übertragen. Zunächst versehen wir unser Bild mit dem Tag login server/image name:tag.
docker tag covid-19-search:latest {login server}/{image name}:{tag}
Sie wird etwa so aussehen: "XXX.Azurecr.io/covid-19-search:latest"
Zweitens melden wir uns beim Server an
docker login <<servername e.g. XXX.Azurecr.io>>
Drittens: Wir übertragen unser Bild auf den Server:
docker push server/image name:tag
Sie sollten nun das Bild in Ihrem Container Registry Repository sehen.
Azure App-Dienste
Sie sind fast fertig! Der letzte Schritt besteht darin, das Bild als Webseite zu veröffentlichen, die über das Internet zugänglich ist.
1) Gehen Sie im Azure-Portal zu Azure App Services und fügen Sie eine Web-App hinzu.
2) Geben Sie einen Namen für Ihre neue Webanwendung ein und wählen Sie eine Ressourcengruppe aus oder erstellen Sie eine neue. Wählen Sie für das Betriebssystem Linux.
3) Wählen Sie "Container konfigurieren" und wählen Sie Azure Container Registry. Verwenden Sie die Dropdown-Listen, um die von Ihnen erstellte Registry sowie das Docker-Image und den Tag auszuwählen, die Sie zuvor erzeugt haben.
Erstellen Sie jetzt Ihren Dienst. Sobald das erledigt ist, gehen Sie auf die Service-URL, um auf Ihre Website zuzugreifen!
Die obigen Schritte sollten in etwa so aussehen:
Wenn die Website zwar zugänglich ist, aber ewig zu laden scheint (die Suchleiste wird nicht angezeigt), sind Sie möglicherweise über einen Fehler gestolpert. Ich habe das Problem behoben, indem ich ein Upgrade auf ein Produktivitätspaket durchgeführt habe und danach auf das günstigere Paket zurückgegangen bin. Das könnte einige Augenbrauen hochziehen, auch meine eigene, aber es hat funktioniert. Wenn Sie die Ursache finden, lassen Sie es mich bitte wissen,
Fazit
Der Aufbau einer eigenen Suchmaschine durch Indizierung von Artikeln mit der kognitiven Such-API ist einfacher, als Sie vielleicht denken! In diesem Blog haben wir uns mit der Verwendung von Streamlit zur Interaktion mit der Suchmaschine befasst und gelernt, wie man die Lösung andockt und als Web-App bereitstellt.
Ich hoffe, dass Sie durch die Lektüre dieses Blogs eine der drei folgenden Erkenntnisse gewonnen haben. 1) Sie haben relevante Informationen zu Covid-19 gefunden. 2) Sie haben eine Möglichkeit erkannt, diese Lösung auf einen anderen Datensatz umzustellen. 3) Sie haben eine Möglichkeit erkannt, diese Lösung zu ändern, um die Suchmaschine durch eine andere Analysemaschine zu ersetzen.
Zögern Sie nicht, uns Ihre Erfahrungen in den Kommentaren mitzuteilen oder zur Codebasis beizutragen!
Unsere Ideen
Weitere Blogs
Contact




