Sebbe33 commited on
Commit
86b7493
·
verified ·
1 Parent(s): 2c021ba

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +158 -0
app.py ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter, Language
3
+ import tiktoken
4
+
5
+ #
6
+ # BEISPIELHAFTE CODE-SNIPPETS
7
+ # ===========================
8
+ # Da das Original-Beispiel auf "code_snippets" verweist, kannst du hier
9
+ # eigene Code-Beispiele oder Strings einfügen. Für die Demo setzen wir
10
+ # einfach ein paar Strings ein.
11
+ #
12
+ CHARACTER_LENGTH = "length_function=lambda x: len(x)"
13
+ TOKEN_LENGTH = """enc = tiktoken.get_encoding("cl100k_base")
14
+ length_function = lambda text: len(enc.encode(text))
15
+ """
16
+ CHARACTER = """CharacterTextSplitter(
17
+ separator="\\n\\n",
18
+ chunk_size={chunk_size},
19
+ chunk_overlap={chunk_overlap},
20
+ length_function={length_function}
21
+ )
22
+ """
23
+ RECURSIVE_CHARACTER = """RecursiveCharacterTextSplitter(
24
+ chunk_size={chunk_size},
25
+ chunk_overlap={chunk_overlap},
26
+ length_function={length_function}
27
+ )
28
+ """
29
+ LANGUAGE = """RecursiveCharacterTextSplitter.from_language(
30
+ language="{language}",
31
+ chunk_size={chunk_size},
32
+ chunk_overlap={chunk_overlap},
33
+ length_function={length_function}
34
+ )
35
+ """
36
+
37
+ # Streamlit UI
38
+ st.title("Text Splitter Playground")
39
+ st.info("""\
40
+ Splitte einen Text in Teilstücke (Chunks), basierend auf deinen Einstellungen:
41
+
42
+ - **Chunk Size**: Maximalgröße eines Teilstücks (in Zeichen oder Tokens)
43
+ - **Chunk Overlap**: Überlappung zwischen den Teilstücken
44
+ - **Length Function**: Gibt an, ob die Teilstück-Größe in Zeichen oder Tokens gemessen werden soll
45
+ - **Splitter Choice**: Definiert den Text-Splitter (Charakter-basiert, rekursiv oder basierend auf einer Sprache)
46
+ """)
47
+
48
+ col1, col2, col3, col4 = st.columns([1, 1, 1, 2])
49
+
50
+ with col1:
51
+ chunk_size = st.number_input(
52
+ min_value=1,
53
+ label="Chunk Size",
54
+ value=1000
55
+ )
56
+
57
+ with col2:
58
+ chunk_overlap = st.number_input(
59
+ min_value=1,
60
+ max_value=chunk_size - 1,
61
+ label="Chunk Overlap",
62
+ value=int(chunk_size * 0.2)
63
+ )
64
+
65
+ if chunk_overlap >= chunk_size:
66
+ st.warning("Achtung: Chunk Overlap sollte kleiner als die Chunk Size sein!")
67
+
68
+ with col3:
69
+ length_function_option = st.selectbox(
70
+ "Length Function",
71
+ ["Characters", "Tokens"]
72
+ )
73
+
74
+ splitter_choices = ["RecursiveCharacter", "Character"] + [f"Language.{v.name}" for v in Language]
75
+
76
+ with col4:
77
+ splitter_choice = st.selectbox(
78
+ "Select a Text Splitter",
79
+ splitter_choices
80
+ )
81
+
82
+ # Auswählen der passenden length_function
83
+ if length_function_option == "Characters":
84
+ # Messen in Zeichen
85
+ length_function = len
86
+ length_function_str = CHARACTER_LENGTH
87
+ elif length_function_option == "Tokens":
88
+ # Messen in Tokens mithilfe tiktoken
89
+ enc = tiktoken.get_encoding("cl100k_base")
90
+ def length_function(text: str) -> int:
91
+ return len(enc.encode(text))
92
+ length_function_str = TOKEN_LENGTH
93
+ else:
94
+ raise ValueError("Ungültige Option für length_function.")
95
+
96
+ # Code-Text bauen, der den vom User ausgewählten Splitter zeigt
97
+ if splitter_choice == "Character":
98
+ import_text = CHARACTER.format(
99
+ chunk_size=chunk_size,
100
+ chunk_overlap=chunk_overlap,
101
+ length_function=length_function_str
102
+ )
103
+ elif splitter_choice == "RecursiveCharacter":
104
+ import_text = RECURSIVE_CHARACTER.format(
105
+ chunk_size=chunk_size,
106
+ chunk_overlap=chunk_overlap,
107
+ length_function=length_function_str
108
+ )
109
+ elif "Language." in splitter_choice:
110
+ lang = splitter_choice.split(".")[1].lower()
111
+ import_text = LANGUAGE.format(
112
+ chunk_size=chunk_size,
113
+ chunk_overlap=chunk_overlap,
114
+ language=lang,
115
+ length_function=length_function_str
116
+ )
117
+ else:
118
+ raise ValueError("Ungültige Wahl beim Text Splitter.")
119
+
120
+ # Anzeigen des generierten Beispiel-Codes
121
+ st.info("**Beispielcode:**\n\n" + import_text)
122
+
123
+ # Text-Eingabe
124
+ doc = st.text_area("Füge hier deinen Text ein:")
125
+
126
+ # Button zum Splitten des Textes
127
+ if st.button("Split Text"):
128
+ # Erzeugen des Splitter-Objekts basierend auf der Auswahl
129
+ if splitter_choice == "Character":
130
+ splitter = CharacterTextSplitter(
131
+ separator="\n\n",
132
+ chunk_size=chunk_size,
133
+ chunk_overlap=chunk_overlap,
134
+ length_function=length_function
135
+ )
136
+ elif splitter_choice == "RecursiveCharacter":
137
+ splitter = RecursiveCharacterTextSplitter(
138
+ chunk_size=chunk_size,
139
+ chunk_overlap=chunk_overlap,
140
+ length_function=length_function
141
+ )
142
+ elif "Language." in splitter_choice:
143
+ lang = splitter_choice.split(".")[1].lower()
144
+ splitter = RecursiveCharacterTextSplitter.from_language(
145
+ language=lang,
146
+ chunk_size=chunk_size,
147
+ chunk_overlap=chunk_overlap,
148
+ length_function=length_function
149
+ )
150
+ else:
151
+ raise ValueError("Ungültige Wahl beim Text Splitter.")
152
+
153
+ # Aufteilen des Textes
154
+ splits = splitter.split_text(doc)
155
+
156
+ # Ausgabe der erstellten Textsplitter
157
+ for idx, split in enumerate(splits, start=1):
158
+ st.text_area(f"Teilstück {idx}", split, height=150)