-
Notifications
You must be signed in to change notification settings - Fork 4
/
app_emoji.py
102 lines (85 loc) · 3.33 KB
/
app_emoji.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Hier importieren wir die benötigten Softwarebibliotheken.
from os.path import abspath, exists
from sys import argv
from streamlit import (text_input, header, title, subheader,
container, markdown, link_button, divider, set_page_config)
from pyterrier import started, init
# Die PyTerrier-Bibliothek muss zuerst gestartet werden,
# um alle seine Bestandteile importieren zu können.
if not started():
init()
from pyterrier import IndexFactory
from pyterrier.batchretrieve import BatchRetrieve
from pyterrier.text import get_text
# Diese Funktion baut die App für die Suche im gegebenen Index auf.
def app(index_dir) -> None:
# Konfiguriere den Titel der Web-App (wird im Browser-Tab angezeigt)
set_page_config(
page_title="Schul-Suchmaschine",
page_icon="🔍",
layout="centered",
)
# Gib der App einen Titel und eine Kurzbeschreibung:
title("Schul-Suchmaschine")
markdown("Hier kannst du unsere neue Schul-Suchmaschine nutzen:")
# Erstelle ein Text-Feld, mit dem die Suchanfrage (query)
# eingegeben werden kann.
query = text_input(
label="🔍 Suchanfrage",
placeholder="Suche...",
value="Schule",
)
# Wenn die Suchanfrage leer ist, dann kannst du nichts suchen.
if query == "":
markdown("Bitte gib eine Suchanfrage ein.")
return
# Öffne den Index.
index = IndexFactory.of(abspath(index_dir))
# Initialisiere den Such-Algorithmus.
searcher = BatchRetrieve(
index,
wmodel="BM25",
num_results=10,
)
# Initialisiere das Modul, zum Abrufen der Texte.
text_getter = get_text(index, metadata=["url", "title", "text"])
# Baue die Such-Pipeline zusammen.
pipeline = searcher >> text_getter
# Führe die Such-Pipeline aus und suche nach der Suchanfrage.
results = pipeline.search(query)
# Zeige eine Unter-Überschrift vor den Suchergebnissen an.
divider()
header("Suchergebnisse")
# Wenn die Ergebnisliste leer ist, gib einen Hinweis aus.
if len(results) == 0:
markdown("Keine Suchergebnisse 🙁")
return
# Wenn es Suchergebnisse gibt, dann zeige an, wie viele.
markdown(f"{len(results)} Suchergebnisse 🙂")
# Gib nun der Reihe nach, alle Suchergebnisse aus.
for _, row in results.iterrows():
# Pro Suchergebnis, erstelle eine Box (container).
with container(border=True):
# Zeige den Titel der gefundenen Webseite an.
subheader(row["title"])
# Speichere den Text in einer Variablen (text).
text = row["text"]
# Schneide den Text nach 500 Zeichen ab.
text = text[:500]
# Ersetze Zeilenumbrüche durch Leerzeichen.
text = text.replace("\n", " ")
# Zeige den Dokument-Text an.
markdown(text)
# Gib Nutzern eine Schaltfläche, um die Seite zu öffnen.
link_button("Seite öffnen", url=row["url"])
# Die Hauptfunktion, die beim Ausführen der Datei aufgerufen wird.
def main():
# Lade den Pfad zum Index aus dem ersten Kommandozeilen-Argument.
index_dir = argv[1]
# Wenn es noch keinen Index gibt, kannst du die Suchmaschine nicht starten.
if not exists(index_dir):
exit(1)
# Rufe die App-Funktion von oben auf.
app(index_dir)
if __name__ == "__main__":
main()