easyh commited on
Commit
c0ff9d9
·
1 Parent(s): b60423c

initial push

Browse files
Files changed (3) hide show
  1. app.py +204 -0
  2. img/favicon.ico +0 -0
  3. requirements.txt +7 -0
app.py ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # streamlit run app.py
2
+ #------------------------------------------------------------------------------
3
+ #------------------------------------------------------------------------------
4
+
5
+ import streamlit as st
6
+ import spacy
7
+ import spacy_streamlit
8
+ from io import StringIO
9
+ import pandas as pd
10
+
11
+ #Funktion, die eine Liste zu einem String umwandelt
12
+ def listToString(s):
13
+ str1 = ""
14
+ for ele in s:
15
+ str1 += ele
16
+ return str1
17
+
18
+ #Funktion, um einen Dataframe in einer csv zu speichern
19
+ def convert_df(df):
20
+ return df.to_csv(index=False).encode('utf-8')
21
+
22
+ #------------------------------------------------------------------------------
23
+ #------------------------------------------------------------------------------
24
+
25
+ #Styling: Seitentitel, Favicon, etc.
26
+ st.set_page_config(page_title='NerDH Visualisierer', page_icon='img/favicon.ico')
27
+ st.markdown(""" <style>
28
+ #MainMenu {visibility: hidden;}
29
+ footer {visibility: hidden;}
30
+ </style> """, unsafe_allow_html=True)
31
+ st.markdown('## NER-Visualisierer für deutsche (historische) Texte')
32
+
33
+ #------------------------------------------------------------------------------
34
+ #------------------------------------------------------------------------------
35
+
36
+ #Spacy-Modell auswählen
37
+ model = "de_history_md"
38
+ model = st.sidebar.selectbox("Wähle ein Modell:", ["de_history_md", "de_core_news_sm", "de_core_news_md", "de_core_news_lg"], key="model")
39
+ with st.spinner('Modell wird geladen...'):
40
+ nlp = spacy.load(model)
41
+ st.success('Modell ist geladen!')
42
+
43
+ #Informationen über die verschiedenen Modelle
44
+ if model == "de_history_md":
45
+ with st.sidebar.expander("Über das Modell"):
46
+ st.write("""
47
+ Das Modell basiert auf frühneuhochdeutschen Texten der digitalen Edition **Philipp Hainhofer: *Reiseberichte & Sammlungsbeschreibungen 1594-1636*** (https://hainhofer.hab.de/).
48
+ \n Trainiert wurde das Modell mit der Pipeline der Python Bibliothek [Spacy](https://spacy.io/). Das Modell kann [hier](https://github.com/easyh/NerDH/releases/latest/download/de_history_md-0.0.1.tar.gz) (586MB) heruntergeladen und als Python-Package installiert werden.
49
+ Bei der Evaluation mit den Testdaten schnitt das Modell mit einem F-Score von **0.89** ziemlich gut ab.
50
+ \n Mehr Informationen zum Prozess des Trainings etc. gibt es [hier](https://easyh.github.io/NerDH/tut/).
51
+ """)
52
+ with st.sidebar.expander("Named Entities Labels"):
53
+ st.write("""
54
+ **PERSON:** Einzelperson oder Familie
55
+ \n**ORT:** Geographische Einheit, d. h. Länder, Städte, Staaten.
56
+ \n**ORGANISATION:** Institutionen,(Ordens-)Gemeinschaften, Verbindungen, etc.
57
+ \n**OBJEKT:** Architektur, Gebäude, Kunst, etc.
58
+ \n**ZEIT:** Datum, Monat, Jahr, Uhrzeit
59
+ \n**LITERATUR:** Bücher mit eindeutigem Namen (z.B. Das Alte Testament)
60
+ """)
61
+ elif model == "de_core_news_sm":
62
+ with st.sidebar.expander("Über das Modell"):
63
+ st.write("""
64
+ Das kleinste deutsche Spacy Modell mit nur 13MB. Grund dafür sind die fehlenden Worteinbettungen (Word-Vectors). Trainiert wurde das Modell mit folgenden Quellen: [Tiger Corpus](), [Tiger2Dep]() und [WikiNER]().
65
+ Anwendungsbereich für das Modell sind haupsächtliche moderne Texte und News-Berichte (F-Score: 0.82).
66
+ Daher wird dieses Modell mit historischen Texten nicht wirklich gut abschneiden.
67
+ \n Mehr Informationen zum Prozess Modell gibts hier [hier](https://spacy.io/models/de#de_core_news_sm).
68
+ """)
69
+ with st.sidebar.expander("Named Entities Labels"):
70
+ st.write("""
71
+ **PER:** Einzelperson oder Familie
72
+ \n**LOC:** Geographische Einheit, d. h. Länder, Städte, Staaten.
73
+ \n**ORG:** Unternehmen, Agenturen, Institutionen, Regierungseinrichtungen
74
+ \n**MISC:** Gemischte Kategorie (Ereignisse, Nationalitäten, Kunstgegenstände)
75
+ """)
76
+ elif model == "de_core_news_md":
77
+ with st.sidebar.expander("Über das Modell"):
78
+ st.write("""
79
+ Das mittlere deutsche Spacy Modell mit 42MB und 20.000 Worteinbettungen. Trainiert wurde das Modell mit folgenden Quellen: [Tiger Corpus](), [Tiger2Dep]() und [WikiNER]().
80
+ Anwendungsbereich für das Modell sind haupsächtliche moderne Texte und News-Berichte (F-Score: 0.84).
81
+ Daher wird dieses Modell mit historischen Texten nicht wirklich gut abschneiden.
82
+ \n Mehr Informationen zum Prozess Modell gibts hier [hier](https://spacy.io/models/de#de_core_news_md).
83
+ """)
84
+ with st.sidebar.expander("Named Entities Labels"):
85
+ st.write("""
86
+ **PER:** Einzelperson oder Familie
87
+ \n**LOC:** Geographische Einheit, d. h. Länder, Städte, Staaten.
88
+ \n**ORG:** Unternehmen, Agenturen, Institutionen, Regierungseinrichtungen
89
+ \n**MISC:** Gemischte Kategorie (Ereignisse, Nationalitäten, Kunstgegenstände)
90
+ """)
91
+ else:
92
+ with st.sidebar.expander("Über das Modell"):
93
+ st.write("""
94
+ Das Größte von den drei deutschen Spacy Modellen mit 541MB und 500.000 Worteinbettungen. Trainiert wurde das Modell mit folgenden Quellen: [Tiger Corpus](), [Tiger2Dep]() und [WikiNER]().
95
+ Anwendungsbereich für das Modell sind haupsächtliche moderne Texte und News-Berichte (F-Score: 0.85).
96
+ Daher wird dieses Modell mit historischen Texten nicht wirklich gut abschneiden.
97
+ \n Mehr Informationen zum Prozess Modell gibts hier [hier](https://spacy.io/models/de#de_core_news_lg).
98
+ """)
99
+ with st.sidebar.expander("Named Entities Labels"):
100
+ st.write("""
101
+ **PER:** Einzelperson oder Familie
102
+ \n**LOC:** Geographische Einheit, d. h. Länder, Städte, Staaten.
103
+ \n**ORG:** Unternehmen, Agenturen, Institutionen, Regierungseinrichtungen
104
+ \n**MISC:** Gemischte Kategorie (Ereignisse, Nationalitäten, Kunstgegenstände)
105
+ """)
106
+
107
+ #------------------------------------------------------------------------------
108
+ #------------------------------------------------------------------------------
109
+
110
+ #Text hochladen
111
+ uploaded_file = st.file_uploader("Texte nur im .txt-Format und utf-8- oder utf-16 Kodierung hochladen.")
112
+ #Standardtext im Textfeld
113
+ DEFAULT_TEXT = """Vmb 12 Vhr bin Jch von Dachaw wider hinweck geritten, vnd vmb 3 Vhr zu Adelshausen, beÿ dem Hannß Wilhalm Hund, Jhrer Durchleucht Rath vnd Cammerer, eingekheret, welcher vermaint, mich v̈ber nacht zu behalten, Habe mich aber entschuldiget, vnd Jhme vnd seiner frawen versprochen, ainmal zu bequemberer zeit, mit meiner haußfrawen zu Jhm zu spatzirn. Jetzt allain ainen trunckh mit Jhme gethan, vnd vmb 4 Vhren wider fort auf Augspurg noch in die Vier meil geritten, vnd zu Abents nach 9 Vhr, Gott lob vnd danckh, glücklich vnd wol, vnd, obwol noch vnuerdienter, mit vil empfangener ehr zu Hauß ankommen."""
114
+
115
+ #Einlesen des Textes
116
+ with st.spinner("Text wird eingelesen..."):
117
+ UPLOADED_TEXT_list = []
118
+ if uploaded_file:
119
+ # To convert to a string based IO:
120
+ try:
121
+ stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
122
+ except:
123
+ stringio = StringIO(uploaded_file.getvalue().decode("utf-16"))
124
+ for line in stringio:
125
+ read_text = str(line)
126
+ clean_text = read_text.replace("\n", " ")
127
+ UPLOADED_TEXT_list.append(clean_text)
128
+ UPLOADED_TEXT = listToString(UPLOADED_TEXT_list)
129
+ text = st.text_area("Text hochladen oder ins Textfeld reinkopieren:", UPLOADED_TEXT, height=200)
130
+ else:
131
+ text = st.text_area("Text hochladen oder ins Textfeld reinkopieren:", DEFAULT_TEXT, height=200)
132
+ st.success("Text ist eingelesen!")
133
+
134
+ #------------------------------------------------------------------------------
135
+ #------------------------------------------------------------------------------
136
+
137
+ #Farben für die verschiedenen Entitäten
138
+ colors = {"PER": "#fdec3e", "PERSON": "#fdec3e", "LOC": "#7e56c2", "ORT": "#7e56c2", "ORG": "#209485" , "ORGANISATION": "#209485" , "MISC": "#eb4034", "ZEIT": "#4c9c4b"}
139
+ #Spacy-Streamlit NER Visualizer
140
+
141
+ #NER-Prozess wird gestartet, je nach Model werden hier die entsprechenden Entitäten gewechselt.
142
+ with st.spinner('Named Entities werden gesucht...'):
143
+ doc = nlp(text)
144
+ if model == "de_history_md":
145
+ spacy_streamlit.visualize_ner(doc, labels = ["PERSON", "ORT", "ORGANISATION", "OBJEKT", "LITERATUR", "ZEIT",], show_table=False, colors = colors)
146
+ else:
147
+ spacy_streamlit.visualize_ner(doc, labels = ["PER", "LOC", "ORG", "MISC"], show_table=False, colors = colors)
148
+ st.success('Suchprozess ist abgeschlossen!')
149
+
150
+ #------------------------------------------------------------------------------
151
+ #------------------------------------------------------------------------------
152
+
153
+ #Um die NER-Ergebnisse downloaden zu können, werden die Entitäten in einer csv gespeichert
154
+ results = []
155
+ for ent in doc.ents:
156
+ results.append([ent.text,ent.label_])
157
+ df_results = pd.DataFrame(results, columns = ['text', 'label'])
158
+ csv = convert_df(df_results)
159
+
160
+ #------------------------------------------------------------------------------
161
+ #------------------------------------------------------------------------------
162
+
163
+ #Download-Button
164
+ st.sidebar.markdown('\n\n')
165
+ st.sidebar.markdown('''
166
+ ### NER-Ergebnnisse in einer .csv-Datei downloaden.
167
+ Die Datei enthält alle Entitäts-Typen.
168
+ ''')
169
+ st.sidebar.download_button(
170
+ "Ergebnisse downloaden",
171
+ csv,
172
+ "ner_results.csv",
173
+ "text/csv",
174
+ key='download-csv'
175
+ )
176
+
177
+ #------------------------------------------------------------------------------
178
+ #------------------------------------------------------------------------------
179
+
180
+ #Referenzen über das Projekt
181
+ st.sidebar.markdown('\n\n')
182
+ st.sidebar.markdown('\n\n')
183
+ with st.sidebar.expander("Referenzen"):
184
+ st.write('''
185
+ Github: https://github.com/easyh/NerDH\n
186
+ Spacy: https://spacy.io/\n
187
+ NerDH-Tutorial: https://easyh.github.io/NerDH/\n
188
+ Trainingsdaten: https://hainhofer.hab.de/
189
+ ''')
190
+
191
+ #------------------------------------------------------------------------------
192
+ #------------------------------------------------------------------------------
193
+
194
+ #Button zurück zum NerDH Tutorial
195
+ st.sidebar.markdown('\n\n')
196
+ st.sidebar.write(f'''
197
+ <a target="_blank" href="https://easyh.github.io/NerDH/">
198
+ <button style="color:white;background-color: #209485; border: none; display: inline-block; border-radius: 8px; padding: 10px 22px;">
199
+ Zurück zum Tutorial
200
+ </button>
201
+ </a>
202
+ ''',
203
+ unsafe_allow_html=True
204
+ )
img/favicon.ico ADDED
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ spacy>=3.0.0,<4.0.0
2
+ spacy-streamlit
3
+ pandas
4
+ https://github.com/easyh/NerDH/releases/latest/download/de_history_md-0.0.1.tar.gz
5
+ de_core_news_sm @ https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-3.4.0/de_core_news_sm-3.4.0-py3-none-any.whl
6
+ de_core_news_md @ https://github.com/explosion/spacy-models/releases/download/de_core_news_md-3.4.0/de_core_news_md-3.4.0-py3-none-any.whl
7
+ de_core_news_lg @ https://github.com/explosion/spacy-models/releases/download/de_core_news_lg-3.4.0/de_core_news_lg-3.4.0-py3-none-any.whl