constantinSch commited on
Commit
30bad82
1 Parent(s): 818612d
Files changed (1) hide show
  1. app.py +119 -0
app.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Import libraries
2
+ import spacy
3
+ from spacy import displacy
4
+ import gradio as gr
5
+ import re
6
+ from huggingface_hub import hf_hub_download
7
+
8
+ # Spacy.load().
9
+ nlp = spacy.load("de_pipeline")
10
+
11
+ # Define examples to be displayed below the textbox
12
+ examples = ["""Zur gleichen Zeit wurde das Olympiastadion gebaut, leicht und transparent. Damals wollte man eines unbedingt vermeiden: Monumentalität. Die spiegelt ein ungeliebtes Denkmal: Die Kongresshalle in Nürnberg, der größte erhaltene Bau des Nationalsozialismus. Auch sie gehört zu unserer Geschichte.""",
13
+ """Ich bin jetzt noch in Zivil, ab Montag habe ich auch Uniform an. Das ist wieder ein neues Gefühl. Aber ich freue mich auf die neue Aufgabe, die bei der Polizeistation Waldmünchen anfängt. Tolle Sache.""",
14
+ """Der Schyrenplatz ist nach dem Ort Scheyern benannt, wo die Stammburg der Wittelsbacher stand. Es gibt hier gleich um die Ecke von der Wittelsbacher Brücke zwei Kioske auf engstem Raum.""",
15
+ """Nun steht es aber erstmal da, Berlins neuestes "Möbelstück", am Boulevard Unter den Linden. Am 20. Juli wird das Humboldt Forum für ein größeres Publikum geöffnet und mehrere Ausstellungen können erstmals betrachtet werden.""",
16
+ """Der Bauherr Ludwig II. / und Schloss Neuschwanstein / sind in der Kulturgeschichte / so eng miteinander verzahnt / wie kaum ein anderes Bauwerk / mit dem Bauherrn.""",
17
+ """Das Verfahren gegen die zehn Rechtsextremisten findet ausgerechnet im Saal A101 statt, also jenem Saal des Münchner Justizzentrums, in dem fünf Jahre lang der sogenannte NSU-Prozess verhandelt wurde.""",
18
+ """Vor knapp einem Monat wurde das Würzburger Mozartfest im Kaisersaal der Residenz eröffnet.""",
19
+ """Würzburg war schon immer ein wichtiges politisches Zentrum, ehemals fürstbischöfliche Residenz, heute Sitz der Regierung von Unterfranken.""",
20
+ """Was ein Hotel für diese stolze Summe bietet, das schauen wir uns jetzt einmal an - und öffnen ehrfürchtig die Türen zur Ludwig-Suite im Hotel Vier Jahreszeiten, wo Royals und Celebrities nächtigen.""",
21
+ """Das Münchner Hofbräuhaus hat das Dresdner Hofbrauhaus wegen der Verletzung von Rechten verklagt. Am Montag beschäftigt sich das Münchner Landgericht mit dem Streit, der um die Frage kreist, ob "au" dasselbe ist wie "äu".""",
22
+ """Einer der schönsten Märkte im Dachauer Land / ist Altomünster mit seiner Klosterkirche. / Gleich daneben steht der Kapplerbräu mit seinem Brauereimuseum."""
23
+ ]
24
+ # Add title, description
25
+ title = "LandmarkNER"
26
+ description = """<center>
27
+ Named Entity Recognition (NER) Modell zur Erkennung bayerischer Landmarken, trainiert mit Untertiteln von Videos des Bayerischen Rundfunks. Ausgabe der Wikipedia Titel mit <a href="https://huggingface.co/facebook/mgenre-wiki">mGENRE</a>.
28
+ </center></p>"""
29
+
30
+ # Define Landmark NER function to be implemented in gradio
31
+ def ner(Eingabe):
32
+ # remove separators
33
+ Eingabe = Eingabe.replace(" / ", " ")
34
+ # remove timecodes and special character lines
35
+ regex_tc = r"^\*.*\*$|^♪.*\.$|(?!^.*[a-zA-Z].*$)^.+"
36
+ Eingabe_1 = re.sub(regex_tc, " ", Eingabe, 0, re.MULTILINE)
37
+ # remove all whitespace characters (space, tab, newline, return, formfeed)
38
+ Eingabe_2 = " ".join(Eingabe_1.split())
39
+ doc = nlp(Eingabe_2)
40
+ #ents = [(e.text) for e in doc.ents]
41
+ output = displacy.render(doc, style="ent")
42
+ return '<br>' + output +'<br>'
43
+
44
+
45
+ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
46
+ import pickle
47
+ # or a memory efficient but a bit slower prefix tree (trie) -- it is implemented with `marisa_trie` from
48
+ # https://huggingface.co/facebook/mgenre-wiki/blob/main/
49
+ file_path_marisa_trie = hf_hub_download("facebook/mgenre-wiki", "titles_lang_all105_marisa_trie_with_redirect.pkl")
50
+
51
+ from genre.trie import MarisaTrie
52
+ with open(file_path_marisa_trie, "rb") as f:
53
+ trie = pickle.load(f)
54
+
55
+ tokenizer = AutoTokenizer.from_pretrained("facebook/mgenre-wiki")
56
+ model = AutoModelForSeq2SeqLM.from_pretrained("facebook/mgenre-wiki").eval()
57
+
58
+ def entity_linking_custom(Eingabe):
59
+ # remove separators
60
+ Eingabe = Eingabe.replace(" / ", " ")
61
+ # remove timecodes and special character lines
62
+ regex_tc = r"^\*.*\*$|^♪.*\.$|(?!^.*[a-zA-Z].*$)^.+"
63
+ Eingabe_1 = re.sub(regex_tc, " ", Eingabe, 0, re.MULTILINE)
64
+ # remove all whitespace characters (space, tab, newline, return, formfeed)
65
+ Eingabe_2 = " ".join(Eingabe_1.split())
66
+ doc = nlp(Eingabe_2)
67
+ reshaped_text = []
68
+ for ent in doc.ents:
69
+ reshaped_text.append(doc.text.replace(ent.text, '[START]' + ent.text + '[END]'))
70
+ generated_text = []
71
+ for sent in reshaped_text:
72
+ outputs = model.generate(
73
+ **tokenizer(sent, return_tensors="pt"),
74
+ num_beams=5,
75
+ num_return_sequences=5,
76
+ # OPTIONAL: use constrained beam search
77
+ prefix_allowed_tokens_fn=lambda batch_id, sent: trie.get(sent.tolist()),
78
+ )
79
+ generated_text.append(tokenizer.batch_decode(outputs, skip_special_tokens=True))
80
+ output = []
81
+ re_lang = r" >> [a-z]+"
82
+ for el in generated_text:
83
+ gen_text = el[0]
84
+ shortened_text = re.sub(re_lang, "", gen_text, 0, re.MULTILINE)
85
+ if shortened_text:
86
+ output.append(shortened_text)
87
+ return "\n".join(output)
88
+
89
+ # So sorry about this, but it did not work otherwise
90
+ def update(input):
91
+ return input
92
+ def clear(input):
93
+ input = ' ' + ' '
94
+ return input
95
+
96
+ # Define blocks
97
+ demo = gr.Blocks()
98
+
99
+ with demo:
100
+ gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>"
101
+ + title
102
+ + "</h1>")
103
+ gr.Markdown(description)
104
+ with gr.Column():
105
+ inp = gr.Textbox(placeholder="Füge einen eigenen Text ein oder wähle eines der Beispiele unten aus. Lass dir dann Landmarken im Text markieren oder deren Wikipedia Titel anzeigen.", label = "Eingabe", lines=3)
106
+ butt1 = gr.Button("Landmarken markieren")
107
+ out_ner = gr.HTML(label="Ausgabe des Textes mit markierten Landmarken", show_label=True)
108
+ butt1.click(ner, inputs=inp, outputs=out_ner)
109
+ butt2 = gr.Button("Wikipedia Titel anzeigen")
110
+ out_rs = gr.Textbox(label = "Ausgabe Wikipedia Titel", show_label=True)
111
+ butt2.click(entity_linking_custom, inputs=inp, outputs=out_rs)
112
+ gr.Markdown("""
113
+ ### Beispiele""")
114
+ example = gr.Radio(choices = examples, value=0,label = "Beispiel auswählen", show_label=True)
115
+ example.change(update, inputs = example, outputs=inp)
116
+ example.change(clear, inputs = inp, outputs=[out_ner,out_rs])
117
+
118
+ demo.launch()
119
+