Spaces:
Sleeping
Sleeping
feature/refactoring-to-config-yamls (#1)
Browse files- refactored interfaces to load data from yamls (c968e7e49a06f10fa6dbb5db88515babfa8c1912)
- added pre-commit hooks (86c6b7a57b59dd8e472b98e98631564c39b326a0)
- reformatted with black (8baa175c53a2ccfea9fefd5a45ac29b7235d5cd9)
- added gitignore (41de85cf1736b8be3aacb7ae3b65f6280db360d8)
- created new generic class WrappedGradioObjects, and GradioTabWrapper (7408f28aba5894a10feb2fe1c1976ce721e74745)
- allows to read tabs from yaml (70533e977986bab9ef25d7417627b4cb3d56cc97)
Co-authored-by: Mättu <[email protected]>
- .gitignore +160 -0
- .pre-commit-config.yaml +13 -0
- app.py +4 -55
- packages.txt +1 -0
- poetry.lock +0 -0
- poetry.toml +2 -0
- pyproject.toml +20 -0
- resources/interfaces/gbert_interface.yml +12 -0
- resources/interfaces/gpt2_interface.yml +11 -0
- resources/interfaces/legal_german_roberta_interface.yml +16 -0
- resources/interfaces/ner_interface.yml +13 -0
- resources/interfaces/qa_interface.yml +24 -0
- resources/interfaces/simplification_interface.yml +7 -0
- resources/interfaces/summarization_interface.yml +13 -0
- resources/interfaces/zero_shot_interface.yml +48 -0
- resources/tabs/app_tab.yml +9 -0
- resources/tabs/legal_tab.yml +4 -0
- resources/templates/template_interface.yml +20 -0
- resources/templates/template_tab.yml +3 -0
- src/nlp_circle_demo/__pycache__/interface.cpython-310.pyc +0 -0
- src/nlp_circle_demo/wrapped_gradio_objects.py +78 -0
.gitignore
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Byte-compiled / optimized / DLL files
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
|
6 |
+
# C extensions
|
7 |
+
*.so
|
8 |
+
|
9 |
+
# Distribution / packaging
|
10 |
+
.Python
|
11 |
+
build/
|
12 |
+
develop-eggs/
|
13 |
+
dist/
|
14 |
+
downloads/
|
15 |
+
eggs/
|
16 |
+
.eggs/
|
17 |
+
lib/
|
18 |
+
lib64/
|
19 |
+
parts/
|
20 |
+
sdist/
|
21 |
+
var/
|
22 |
+
wheels/
|
23 |
+
share/python-wheels/
|
24 |
+
*.egg-info/
|
25 |
+
.installed.cfg
|
26 |
+
*.egg
|
27 |
+
MANIFEST
|
28 |
+
|
29 |
+
# PyInstaller
|
30 |
+
# Usually these files are written by a python script from a template
|
31 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32 |
+
*.manifest
|
33 |
+
*.spec
|
34 |
+
|
35 |
+
# Installer logs
|
36 |
+
pip-log.txt
|
37 |
+
pip-delete-this-directory.txt
|
38 |
+
|
39 |
+
# Unit test / coverage reports
|
40 |
+
htmlcov/
|
41 |
+
.tox/
|
42 |
+
.nox/
|
43 |
+
.coverage
|
44 |
+
.coverage.*
|
45 |
+
.cache
|
46 |
+
nosetests.xml
|
47 |
+
coverage.xml
|
48 |
+
*.cover
|
49 |
+
*.py,cover
|
50 |
+
.hypothesis/
|
51 |
+
.pytest_cache/
|
52 |
+
cover/
|
53 |
+
|
54 |
+
# Translations
|
55 |
+
*.mo
|
56 |
+
*.pot
|
57 |
+
|
58 |
+
# Django stuff:
|
59 |
+
*.log
|
60 |
+
local_settings.py
|
61 |
+
db.sqlite3
|
62 |
+
db.sqlite3-journal
|
63 |
+
|
64 |
+
# Flask stuff:
|
65 |
+
instance/
|
66 |
+
.webassets-cache
|
67 |
+
|
68 |
+
# Scrapy stuff:
|
69 |
+
.scrapy
|
70 |
+
|
71 |
+
# Sphinx documentation
|
72 |
+
docs/_build/
|
73 |
+
|
74 |
+
# PyBuilder
|
75 |
+
.pybuilder/
|
76 |
+
target/
|
77 |
+
|
78 |
+
# Jupyter Notebook
|
79 |
+
.ipynb_checkpoints
|
80 |
+
|
81 |
+
# IPython
|
82 |
+
profile_default/
|
83 |
+
ipython_config.py
|
84 |
+
|
85 |
+
# pyenv
|
86 |
+
# For a library or package, you might want to ignore these files since the code is
|
87 |
+
# intended to run in multiple environments; otherwise, check them in:
|
88 |
+
# .python-version
|
89 |
+
|
90 |
+
# pipenv
|
91 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94 |
+
# install all needed dependencies.
|
95 |
+
#Pipfile.lock
|
96 |
+
|
97 |
+
# poetry
|
98 |
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
99 |
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
100 |
+
# commonly ignored for libraries.
|
101 |
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
102 |
+
#poetry.lock
|
103 |
+
|
104 |
+
# pdm
|
105 |
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
106 |
+
#pdm.lock
|
107 |
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
108 |
+
# in version control.
|
109 |
+
# https://pdm.fming.dev/#use-with-ide
|
110 |
+
.pdm.toml
|
111 |
+
|
112 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
113 |
+
__pypackages__/
|
114 |
+
|
115 |
+
# Celery stuff
|
116 |
+
celerybeat-schedule
|
117 |
+
celerybeat.pid
|
118 |
+
|
119 |
+
# SageMath parsed files
|
120 |
+
*.sage.py
|
121 |
+
|
122 |
+
# Environments
|
123 |
+
.env
|
124 |
+
.venv
|
125 |
+
env/
|
126 |
+
venv/
|
127 |
+
ENV/
|
128 |
+
env.bak/
|
129 |
+
venv.bak/
|
130 |
+
|
131 |
+
# Spyder project settings
|
132 |
+
.spyderproject
|
133 |
+
.spyproject
|
134 |
+
|
135 |
+
# Rope project settings
|
136 |
+
.ropeproject
|
137 |
+
|
138 |
+
# mkdocs documentation
|
139 |
+
/site
|
140 |
+
|
141 |
+
# mypy
|
142 |
+
.mypy_cache/
|
143 |
+
.dmypy.json
|
144 |
+
dmypy.json
|
145 |
+
|
146 |
+
# Pyre type checker
|
147 |
+
.pyre/
|
148 |
+
|
149 |
+
# pytype static type analyzer
|
150 |
+
.pytype/
|
151 |
+
|
152 |
+
# Cython debug symbols
|
153 |
+
cython_debug/
|
154 |
+
|
155 |
+
# PyCharm
|
156 |
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
157 |
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
158 |
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
159 |
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
160 |
+
#.idea/
|
.pre-commit-config.yaml
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
repos:
|
2 |
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
3 |
+
rev: v3.2.0
|
4 |
+
hooks:
|
5 |
+
- id: trailing-whitespace
|
6 |
+
- id: end-of-file-fixer
|
7 |
+
- id: check-yaml
|
8 |
+
- id: check-added-large-files
|
9 |
+
|
10 |
+
- repo: https://github.com/psf/black
|
11 |
+
rev: 22.10.0
|
12 |
+
hooks:
|
13 |
+
- id: black
|
app.py
CHANGED
@@ -1,56 +1,5 @@
|
|
1 |
-
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
simplifaction_text = '<a href="https://huggingface.co/haining/scientific_abstract_simplification">Scientific Abstract Simplification</a> </br> Bei dieser Aufgabe geht es darum, komplexe Sachverhalte einfach zu erklären. Dieses Beispielmodell kann die Abstracts von wissenschaftlichen Publikationen so vereinfachen, dass sie auch für Laien verständlich werden. Ähnliche Methoden könnten verwendet werden, um beispielsweise Schweizer Rechtstexte zu vereinfachen. Dieses Modell funktioniert nur auf Englisch.'
|
7 |
-
legal_text = '<a href="https://huggingface.co/joelito/legal-german-roberta-large">Roberta German</a> </br><a href="https://huggingface.co/xlm-roberta-large">Roberta</a> </br> Hier zeigen wir ein Modell, welches an unserem Institut darauf vortrainiert wurde, die rechtliche Sprache besser zu verstehen. Dabei wird in einem Text immer ein Wort (mit dem Stichwort <mask>) maskiert, und das Modell muss das fehlende Wort voraussagen. Dadurch, dass das Modell auf die rechtliche Sprache spezifiziert wurde, sind die Voraussagen deutlich besser, wie das nachfolgende Beispiel zeigt (BGE 142 II 268 S. 271, Erwägung 4.1): Unser spezialisiertes Modell gibt richtigerweise das Wort “Verhältnismässigkeit” aus, während ein generisches XLM-RoBERTa-Modell deutlich allgemeinere Wörter wie Freiheit, Demokratie oder Öffentlichkeit voraussagt. Beide Modelle haben 354 Millionen Parameter.'
|
8 |
-
gbert_desc = '<a href="https://huggingface.co/harshildarji/gbert-legal-ner">GBert Legal</a> </br>Bei dieser Aufgabe geht es darum, automatisch Eigennamen oder Entitäten, engl. named entities, in einem Text zu erkennen und einer Klasse zuzuordnen. So wäre beispielsweise Max Mustermann ein Eigenname der Klasse Person; Berner Fachhochschule wäre ein Eigenname der Klasse Organisation. Das hier verwendete Beispielmodell wurde auf juristische Texte des Deutschen trainiert und erkennt Eigennamen, die für die juristischen Domäne relevant sind, wie zum Beispiel Lawyer (= Anwalt) oder Law (=Gesetz).'
|
9 |
-
zero_shot_desc = '<a href="https://huggingface.co/Sahajtomar/German_Zeroshot]">German Zeroshot</a> </br> Bei dieser Aufgabe handelt es sich um eine Textklassifizierungsaufgabe. Das heißt, das Modell bekommt einen Textinhalt vorgelegt und muss aus einer Liste vordefinierter Labels entscheiden, welches dieser Labels den Inhalt des Textes am besten beschreibt. Der Krux bei der ganzen Sache ist, dass das Modell keine Spezialisierung für die Labels erfahren hat und sozusagen beim ersten Mal die richtige Auswahl treffen muss; daher zero shot, denn es hat nur einen Versuch. Erreicht wird dies, in dem ein vortrainiertes Modell auf einen Datensatz für Natural Language Inference (dt. natürlichsprachliche Inferenz oder Rückschluss auf natürliche Sprache) spezialisiert wird. Bei dieser Aufgabe bekommt das Modell zwei Texte vorgelegt und muss lernen, in welchem Verhältnis die beiden Texte zueinanderstehen. Folgende Klassen stehen dabei zur Auswahl: <ul><li>entailment: Text A ist eine logische Schlussfolgerung von Text B</li><li>contradiction: Text A steht im Widerspruch zu Text B</li><li>neutral: es lassen sich keine Schlussfolgerungen dieser Art ziehen</li></ul></br></br>Nehmen wir als Beispiel den Ausgangstext «Die Kinder lächeln und winken in die Kamera». Nach der Spezialisierung sollte das Modell in der Lage sein zu sagen, dass die Aussage «Es sind Kinder anwesend.» eine logische Schlussfolgerung des Ausgangstextes ist, während die Aussage «Die Kinder runzeln die Stirn.» im Widerspruch zum Ausgangstext steht.</br></br>Es hat sich gezeigt, dass Modelle, die auf Natural Language Inference spezialisiert wurden, auch sehr gut darin sind, Texten thematisch passende Labels zuzuordnen. Wenn wir wieder den Ausgangstext von vorhin nehmen, wäre das Modell in der Lage zu sagen, dass von den möglichen Kandidatenlabels [Wirtschaft, Familie, Feier, Tragödie] Familie und Feier diejenigen Labels sind, die den Inhalt des Textes am besten beschreiben.</br></br>Das hier verwendete Beispielmodell wurde auf deutschsprachige Texte trainiert. '
|
10 |
-
|
11 |
-
|
12 |
-
qaExamples = [["Mein Name ist Wolfgang und ich lebe in Berlin", "Wo wohne ich?"], [
|
13 |
-
"Der Amazonas-Regenwald, auf Englisch auch als Amazonien oder Amazonas-Dschungel bekannt, ist ein feuchter Laubwald, der den größten Teil des Amazonas-Beckens Südamerikas bedeckt. Dieses Becken umfasst 7.000.000 Quadratkilometer (2.700.000 Quadratmeilen), von denen 5.500.000 Quadratkilometer (2.100.000 Quadratmeilen) vom Regenwald bedeckt sind. Diese Region umfasst Gebiete von neun Nationen. Der größte Teil des Waldes befindet sich in Brasilien mit 60% des Regenwaldes, gefolgt von Peru mit 13%, Kolumbien mit 10% und geringen Mengen in Venezuela, Ecuador, Bolivien, Guyana, Suriname und Französisch-Guayana. Staaten oder Abteilungen in vier Nationen enthalten \"Amazonas\" in ihren Namen. Der Amazonas repräsentiert mehr als die Hälfte der verbleibenden Regenwälder des Planeten und umfasst den größten und artenreichsten tropischen Regenwald der Welt mit geschätzten 390 Milliarden Einzelbäumen, die in 16.000 Arten unterteilt sind.", "Welcher Name wird auch verwendet, um den Amazonas-Regenwald auf Englisch zu beschreiben?"]]
|
14 |
-
|
15 |
-
sumExamples = [
|
16 |
-
"Paris is the capital and most populous city of France, with an estimated population of 2,175,601 residents as of 2018, in an area of more than 105 square kilometres (41 square miles). The City of Paris is the centre and seat of government of the region and province of Île-de-France, or Paris Region, which has an estimated population of 12,174,880, or about 18 percent of the population of France as of 2017."]
|
17 |
-
|
18 |
-
legalExample = ["Die Beschwerdeführerin rügt sodann eine Verletzung des Verhältnismässigkeitsprinzips. Sie ist der Auffassung, dass die Publikationstätigkeit der WEKO den Grundsatz der <mask> gemäss Art. 5 Abs. 2 und Art. 36 BV wahren müsse."]
|
19 |
-
|
20 |
-
bertExample = ["Die Beschwerdeführerin rügt sodann eine Verletzung des Verhältnismässigkeitsprinzips. Sie ist der Auffassung, dass die Publikationstätigkeit der WEKO den Grundsatz der [MASK] gemäss Art. 5 Abs. 2 und Art. 36 BV wahren müsse."]
|
21 |
-
|
22 |
-
gbertExample = ["1. Das Bundesarbeitsgericht ist gemäß § 9 Abs. 2 Satz 2 ArbGG iVm. § 201 Abs. 1 Satz 2 GVG für die beabsichtigte Klage gegen den Bund zuständig ."]
|
23 |
-
|
24 |
-
zeroShotExample = [["COVID-19 (Akronym von englisch coronavirus disease 2019, deutsch Coronavirus-Krankheit-2019), in den deutschsprachigen Ländern umgangssprachlich meist nur als „Corona“ oder „Covid“ bezeichnet, ist eine meldepflichtige Infektionskrankheit mit einem breiten aber unspezifischen Symptomspektrum, die durch eine Infektion (Ansteckung) mit dem Betacoronavirus SARS-CoV-2 verursacht wird. Das Virus wurde erstmals im Dezember 2019 in Wuhan (Volksrepublik China) beschrieben. Es verbreitete sich sehr schnell weltweit und ist Ursache der COVID-19-Pandemie. Bis 18. Oktober 2022 wurden weltweit rund 622 Millionen COVID-Infizierte registriert, es wird aber in vielen Ländern eine hohe Dunkelziffer vermutet. Laut einer Schätzung der Weltgesundheitsorganisation (WHO) gab es zwischen Anfang 2020 und Ende 2021 eine weltweite, durch COVID-19 verursachte Übersterblichkeit von 14,83 Millionen Toten.", "Wirtschaft, Familie, Politik, Finanzen, Medizin, Gesundheit", True]]
|
25 |
-
|
26 |
-
qaInterface = gr.Interface.load("huggingface/deepset/gelectra-large-germanquad",
|
27 |
-
title=None,
|
28 |
-
description=qa_text,
|
29 |
-
examples=qaExamples
|
30 |
-
)
|
31 |
-
|
32 |
-
gptInterface = gr.Interface.load(
|
33 |
-
"huggingface/gpt2", title=None, description=gpt2_text)
|
34 |
-
|
35 |
-
summarizationInterface = gr.Interface.load(
|
36 |
-
"huggingface/Einmalumdiewelt/T5-Base_GNAD", title=None, description=summarization_text)
|
37 |
-
|
38 |
-
simplicationInterface = gr.Interface.load(
|
39 |
-
"huggingface/haining/scientific_abstract_simplification", title=None, description=simplifaction_text)
|
40 |
-
|
41 |
-
robertaGer = gr.Interface.load(
|
42 |
-
"huggingface/joelito/legal-german-roberta-large", title=None, description=legal_text, examples=legalExample)
|
43 |
-
|
44 |
-
roberta = gr.Interface.load(
|
45 |
-
"huggingface/deepset/gbert-large", title=None, description=legal_text, examples=bertExample)
|
46 |
-
|
47 |
-
gbert = gr.Interface.load("huggingface/harshildarji/gbert-legal-ner", title=None, description=gbert_desc, examples=gbertExample)
|
48 |
-
|
49 |
-
zeroShot = gr.Interface.load("huggingface/Sahajtomar/German_Zeroshot", title=None, description=zero_shot_desc, examples=zeroShotExample)
|
50 |
-
|
51 |
-
legalInterface = gr.TabbedInterface([robertaGer, roberta], ["Roberta Legal", "Bert"])
|
52 |
-
|
53 |
-
demo = gr.TabbedInterface([gptInterface, legalInterface ,qaInterface, summarizationInterface, simplicationInterface, gbert, zeroShot], [
|
54 |
-
"GPT", "Legal", "Question Answering", "Summarization", "Simplification", "Named Entity Recognition", "Zero-Shot-Klassifizierung"])
|
55 |
-
|
56 |
-
demo.launch()
|
|
|
1 |
+
from nlp_circle_demo.wrapped_gradio_objects import GradioTabWrapper
|
2 |
|
3 |
+
if __name__ == "__main__":
|
4 |
+
demo = GradioTabWrapper.from_yaml("resources/tabs/app_tab.yml")
|
5 |
+
demo.launch()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
packages.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
PyYAML
|
poetry.lock
ADDED
The diff for this file is too large to render.
See raw diff
|
|
poetry.toml
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
[virtualenvs]
|
2 |
+
create = false
|
pyproject.toml
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[tool.poetry]
|
2 |
+
name = "nlp-circle-demo"
|
3 |
+
version = "0.1.0"
|
4 |
+
description = ""
|
5 |
+
authors = ["Your Name <[email protected]>"]
|
6 |
+
readme = "README.md"
|
7 |
+
packages = []
|
8 |
+
|
9 |
+
[tool.poetry.dependencies]
|
10 |
+
python = "^3.10"
|
11 |
+
gradio = "^3.26.0"
|
12 |
+
pyyaml = "^6.0"
|
13 |
+
|
14 |
+
[tool.poetry.dev-dependencies]
|
15 |
+
pre-commit = "^3.2"
|
16 |
+
black = "^23.3"
|
17 |
+
|
18 |
+
[build-system]
|
19 |
+
requires = ["poetry-core"]
|
20 |
+
build-backend = "poetry.core.masonry.api"
|
resources/interfaces/gbert_interface.yml
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: German BERT
|
2 |
+
name: huggingface/deepset/gbert-large
|
3 |
+
description: >
|
4 |
+
Hier zeigen wir ein Vergleichsmodell, welches ebenfalls maskierte Wörter (hier mit dem Stichwort [Mask]) zu erraten
|
5 |
+
versucht. Dieses Modell wurde allerdings nicht auf rechtliche Sprache spezialisiert, weshalb die prognostizierten
|
6 |
+
Wörter deutlich weniger spezifisch sind. Beide Modelle haben 354 Millionen Parameter.
|
7 |
+
examples:
|
8 |
+
# This is how we can do nested lists
|
9 |
+
- >
|
10 |
+
Die Beschwerdeführerin rügt sodann eine Verletzung des Verhältnismässigkeitsprinzips. Sie ist der
|
11 |
+
Auffassung, dass die Publikationstätigkeit der WEKO den Grundsatz der [MASK] gemäss Art. 5 Abs. 2
|
12 |
+
und Art. 36 BV wahren müsse.
|
resources/interfaces/gpt2_interface.yml
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: GPT2 # will be used as tab title and for the link.
|
2 |
+
name: huggingface/gpt2 # path to model
|
3 |
+
description: >
|
4 |
+
GPT-3.5, auf dem ChatGPT beruht. Das Modell vervollständigt eingegebene Texte, in dem
|
5 |
+
es immer ein wahrscheinliches nächstes Wort voraussagt. Allerdings hat es auch einen
|
6 |
+
kleinen Zufallsfaktor, damit der gleiche Input nicht immer das gleiche Resultat liefern.
|
7 |
+
Das hier vorgestellte deutschsprachige GPT-2 Modell hat 124 Millionen Parameter, ist also
|
8 |
+
1400x kleiner als ChatGPT - und somit auch erkennbar schlechter in der Textgenerierung.
|
9 |
+
examples:
|
10 |
+
- Paris is the capital of
|
11 |
+
- Auf Deutsch funktioniert das Modell deutlich
|
resources/interfaces/legal_german_roberta_interface.yml
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Legal German RoBERTa
|
2 |
+
name: huggingface/joelito/legal-german-roberta-large
|
3 |
+
description: >
|
4 |
+
Hier zeigen wir ein Modell, welches an unserem Institut darauf vortrainiert wurde, die rechtliche Sprache
|
5 |
+
besser zu verstehen. Dabei wird in einem Text immer ein Wort (mit dem Stichwort <mask>) maskiert, und das
|
6 |
+
Modell muss das fehlende Wort voraussagen. Dadurch, dass das Modell auf die rechtliche Sprache spezifiziert
|
7 |
+
wurde, sind die Voraussagen deutlich besser, wie das nachfolgende Beispiel zeigt (BGE 142 II 268 S. 271,
|
8 |
+
Erwägung 4.1): Unser spezialisiertes Modell gibt richtigerweise das Wort “Verhältnismässigkeit” aus, während
|
9 |
+
ein generisches Modell (im anderen Tab) deutlich allgemeinere Wörter wie Freiheit, Demokratie oder Öffentlichkeit
|
10 |
+
voraussagt. Beide Modelle haben 354 Millionen Parameter.
|
11 |
+
examples:
|
12 |
+
# This is how we can do nested lists
|
13 |
+
- >
|
14 |
+
Die Beschwerdeführerin rügt sodann eine Verletzung des Verhältnismässigkeitsprinzips. Sie ist der
|
15 |
+
Auffassung, dass die Publikationstätigkeit der WEKO den Grundsatz der <mask> gemäss Art. 5 Abs. 2
|
16 |
+
und Art. 36 BV wahren müsse.
|
resources/interfaces/ner_interface.yml
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Named Entity Recognition # will be used as tab title and for the link.
|
2 |
+
name: huggingface/harshildarji/gbert-legal-ner # path to model
|
3 |
+
description: >
|
4 |
+
Bei dieser Aufgabe geht es darum, automatisch Eigennamen oder Entitäten, engl. named entities,
|
5 |
+
in einem Text zu erkennen und einer Klasse zuzuordnen. So wäre beispielsweise Max Mustermann ein
|
6 |
+
Eigenname der Klasse Person; Berner Fachhochschule wäre ein Eigenname der Klasse Organisation. Das
|
7 |
+
hier verwendete Beispielmodell wurde auf juristische Texte des Deutschen trainiert und erkennt
|
8 |
+
Eigennamen, die für die juristischen Domäne relevant sind, wie zum Beispiel Lawyer (= Anwalt) oder
|
9 |
+
Law (=Gesetz).'
|
10 |
+
examples:
|
11 |
+
- >
|
12 |
+
1. Das Bundesarbeitsgericht ist gemäß § 9 Abs. 2 Satz 2 ArbGG iVm. § 201 Abs. 1 Satz 2 GVG für
|
13 |
+
die beabsichtigte Klage gegen den Bund zuständig.
|
resources/interfaces/qa_interface.yml
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Question Answering
|
2 |
+
name: huggingface/deepset/gelectra-large-germanquad
|
3 |
+
description: >
|
4 |
+
Dieses deutschsprachige Modell wurde darauf spezialisiert, in einem Text die Antwort auf eine
|
5 |
+
gestellte Frage zu finden. Es basiert auf XLM-RoBERTa, einem mehrsprachigen Modell mit 270
|
6 |
+
Millionen Parameter.
|
7 |
+
examples:
|
8 |
+
-
|
9 |
+
- Mein Name ist Wolfgang und ich lebe in Berlin
|
10 |
+
- Wo wohne ich?
|
11 |
+
-
|
12 |
+
- >
|
13 |
+
Der Amazonas-Regenwald, auf Englisch auch als Amazonien oder Amazonas-Dschungel bekannt,
|
14 |
+
ist ein feuchter Laubwald, der den größten Teil des Amazonas-Beckens Südamerikas bedeckt.
|
15 |
+
Dieses Becken umfasst 7.000.000 Quadratkilometer (2.700.000 Quadratmeilen), von denen
|
16 |
+
5.500.000 Quadratkilometer (2.100.000 Quadratmeilen) vom Regenwald bedeckt sind. Diese
|
17 |
+
Region umfasst Gebiete von neun Nationen. Der größte Teil des Waldes befindet sich in
|
18 |
+
Brasilien mit 60% des Regenwaldes, gefolgt von Peru mit 13%, Kolumbien mit 10% und geringen
|
19 |
+
Mengen in Venezuela, Ecuador, Bolivien, Guyana, Suriname und Französisch-Guayana. Staaten
|
20 |
+
oder Abteilungen in vier Nationen enthalten \"Amazonas\" in ihren Namen. Der Amazonas
|
21 |
+
repräsentiert mehr als die Hälfte der verbleibenden Regenwälder des Planeten und umfasst
|
22 |
+
den größten und artenreichsten tropischen Regenwald der Welt mit geschätzten 390 Milliarden
|
23 |
+
Einzelbäumen, die in 16.000 Arten unterteilt sind.
|
24 |
+
- Welcher Name wird auch verwendet, um den Amazonas-Regenwald auf Englisch zu beschreiben?
|
resources/interfaces/simplification_interface.yml
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Text-Vereinfachung # will be used as tab title and for the link.
|
2 |
+
name: huggingface/haining/scientific_abstract_simplification # path to model
|
3 |
+
description: > # Adding > here allows multiline strings
|
4 |
+
Bei dieser Aufgabe geht es darum, komplexe Sachverhalte einfach zu erklären. Dieses Beispielmodell kann die
|
5 |
+
Abstracts von wissenschaftlichen Publikationen so vereinfachen, dass sie auch für Laien verständlich werden.
|
6 |
+
Ähnliche Methoden könnten verwendet werden, um beispielsweise Schweizer Rechtstexte zu vereinfachen. Dieses
|
7 |
+
Modell funktioniert nur auf Englisch.
|
resources/interfaces/summarization_interface.yml
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Text-Zusammenfassung # will be used as tab title and for the link.
|
2 |
+
name: huggingface/Einmalumdiewelt/T5-Base_GNAD # path to model
|
3 |
+
description: >
|
4 |
+
Hier wurde ein sogenanntes T5-Sprachmodell auf den Task der Text-Zusammenfassung
|
5 |
+
spezialisiert. Das Modell versteht nur Deutsch und hat 220 Millionen Parameter.
|
6 |
+
examples:
|
7 |
+
# TODO: Hier ein deutsches Beispiel
|
8 |
+
- >
|
9 |
+
Paris is the capital and most populous city of France, with an estimated population
|
10 |
+
of 2,175,601 residents as of 2018, in an area of more than 105 square kilometres
|
11 |
+
(41 square miles). The City of Paris is the centre and seat of government of the region
|
12 |
+
and province of Île-de-France, or Paris Region, which has an estimated population of
|
13 |
+
12,174,880, or about 18 percent of the population of France as of 2017.
|
resources/interfaces/zero_shot_interface.yml
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Zero-Shot Interface
|
2 |
+
name: huggingface/Sahajtomar/German_Zeroshot
|
3 |
+
description: >
|
4 |
+
Bei dieser Aufgabe handelt es sich um eine Textklassifizierungsaufgabe. Das heißt, das Modell
|
5 |
+
bekommt einen Textinhalt vorgelegt und muss aus einer Liste vordefinierter Labels entscheiden,
|
6 |
+
welches dieser Labels den Inhalt des Textes am besten beschreibt. Der Krux bei der ganzen Sache ist,
|
7 |
+
dass das Modell keine Spezialisierung für die Labels erfahren hat und sozusagen beim ersten Mal die
|
8 |
+
richtige Auswahl treffen muss; daher zero shot, denn es hat nur einen Versuch. Erreicht wird dies, in
|
9 |
+
dem ein vortrainiertes Modell auf einen Datensatz für Natural Language Inference (dt. natürlichsprachliche
|
10 |
+
Inferenz oder Rückschluss auf natürliche Sprache) spezialisiert wird. Bei dieser Aufgabe bekommt
|
11 |
+
das Modell zwei Texte vorgelegt und muss lernen, in welchem Verhältnis die beiden Texte zueinanderstehen.
|
12 |
+
Folgende Klassen stehen dabei zur Auswahl:
|
13 |
+
<ul>
|
14 |
+
<li>entailment: Text A ist eine logische Schlussfolgerung von Text B</li>
|
15 |
+
<li>contradiction: Text A steht im Widerspruch zu Text B</li>
|
16 |
+
<li>neutral: es lassen sich keine Schlussfolgerungen dieser Art ziehen</li>
|
17 |
+
</ul>
|
18 |
+
</br></br>
|
19 |
+
Nehmen wir als Beispiel den Ausgangstext «Die Kinder lächeln und winken in die Kamera». Nach der Spezialisierung
|
20 |
+
sollte das Modell in der Lage sein zu sagen, dass die Aussage «Es sind Kinder anwesend.» eine logische
|
21 |
+
Schlussfolgerung des Ausgangstextes ist, während die Aussage «Die Kinder runzeln die Stirn.» im Widerspruch
|
22 |
+
zum Ausgangstext steht.
|
23 |
+
</br></br>
|
24 |
+
Es hat sich gezeigt, dass Modelle, die auf Natural Language Inference spezialisiert wurden, auch sehr gut darin sind,
|
25 |
+
Texten thematisch passende Labels zuzuordnen. Wenn wir wieder den Ausgangstext von vorhin nehmen, wäre das Modell in
|
26 |
+
der Lage zu sagen, dass von den möglichen Kandidatenlabels [Wirtschaft, Familie, Feier, Tragödie] Familie und Feier
|
27 |
+
diejenigen Labels sind, die den Inhalt des Textes am besten beschreiben.</br></br>Das hier verwendete Beispielmodell
|
28 |
+
wurde auf deutschsprachige Texte trainiert.
|
29 |
+
examples:
|
30 |
+
-
|
31 |
+
- >
|
32 |
+
COVID-19 (Akronym von englisch coronavirus disease 2019, deutsch Coronavirus-Krankheit-2019), in den
|
33 |
+
deutschsprachigen Ländern umgangssprachlich meist nur als „Corona“ oder „Covid“ bezeichnet, ist eine
|
34 |
+
meldepflichtige Infektionskrankheit mit einem breiten aber unspezifischen Symptomspektrum, die durch eine
|
35 |
+
Infektion (Ansteckung) mit dem Betacoronavirus SARS-CoV-2 verursacht wird. Das Virus wurde erstmals im
|
36 |
+
Dezember 2019 in Wuhan (Volksrepublik China) beschrieben. Es verbreitete sich sehr schnell weltweit und ist
|
37 |
+
Ursache der COVID-19-Pandemie. Bis 18. Oktober 2022 wurden weltweit rund 622 Millionen COVID-Infizierte registriert,
|
38 |
+
es wird aber in vielen Ländern eine hohe Dunkelziffer vermutet. Laut einer Schätzung der Weltgesundheitsorganisation
|
39 |
+
(WHO) gab es zwischen Anfang 2020 und Ende 2021 eine weltweite, durch COVID-19 verursachte Übersterblichkeit von
|
40 |
+
14,83 Millionen Toten.
|
41 |
+
-
|
42 |
+
- Wirtschaft
|
43 |
+
- Familie
|
44 |
+
- Politik
|
45 |
+
- Finanzen
|
46 |
+
- Medizin
|
47 |
+
- Gesundheit
|
48 |
+
- True
|
resources/tabs/app_tab.yml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: NLP Demo-Seite
|
2 |
+
dependencies:
|
3 |
+
- interfaces/gpt2_interface.yml
|
4 |
+
- tabs/legal_tab.yml
|
5 |
+
- interfaces/qa_interface.yml
|
6 |
+
- interfaces/summarization_interface.yml
|
7 |
+
- interfaces/simplification_interface.yml
|
8 |
+
- interfaces/ner_interface.yml
|
9 |
+
- interfaces/zero_shot_interface.yml
|
resources/tabs/legal_tab.yml
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Legal # will be used as tab title
|
2 |
+
dependencies:
|
3 |
+
- interfaces/legal_german_roberta_interface.yml
|
4 |
+
- interfaces/gbert_interface.yml
|
resources/templates/template_interface.yml
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Some Title # will be used as tab title and for the link.
|
2 |
+
name: huggingface/deepset/gelectra-large-germanquad # path to model
|
3 |
+
description: > # Adding > here allows multiline strings
|
4 |
+
This
|
5 |
+
is
|
6 |
+
a
|
7 |
+
string
|
8 |
+
accross
|
9 |
+
multiple
|
10 |
+
lines
|
11 |
+
examples:
|
12 |
+
# This is how we can do nested lists
|
13 |
+
- # First example
|
14 |
+
- Foo
|
15 |
+
- Bar
|
16 |
+
- # Second example
|
17 |
+
- >
|
18 |
+
Hello
|
19 |
+
world
|
20 |
+
- Hello who?
|
resources/templates/template_tab.yml
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
title: Some Title # will be used as tab title
|
2 |
+
dependencies:
|
3 |
+
- templates/template_interface.yaml # provide all dependant interfaces as a list
|
src/nlp_circle_demo/__pycache__/interface.cpython-310.pyc
ADDED
Binary file (3.6 kB). View file
|
|
src/nlp_circle_demo/wrapped_gradio_objects.py
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import yaml
|
3 |
+
|
4 |
+
|
5 |
+
class WrappedGradioObject:
|
6 |
+
def __init__(self, title, gradio_element):
|
7 |
+
self.title = title
|
8 |
+
self.gradio_element = gradio_element
|
9 |
+
|
10 |
+
def launch(self):
|
11 |
+
return self.gradio_element.launch()
|
12 |
+
|
13 |
+
@staticmethod
|
14 |
+
def read_yaml(path):
|
15 |
+
with open(path) as f:
|
16 |
+
return yaml.safe_load(f)
|
17 |
+
|
18 |
+
|
19 |
+
class GradioInterfaceWrapper(WrappedGradioObject):
|
20 |
+
@classmethod
|
21 |
+
def from_yaml(cls, path):
|
22 |
+
"""Initializes Interface from YAML file."""
|
23 |
+
content_dict = cls.read_yaml(path)
|
24 |
+
return cls.create_interface(**content_dict)
|
25 |
+
|
26 |
+
@classmethod
|
27 |
+
def create_interface(cls, name, title, description, examples=None):
|
28 |
+
"""Creates Gradio-Element containing an interface."""
|
29 |
+
description = cls._prepend_link_to_description(name, title, description)
|
30 |
+
interface = gr.load(
|
31 |
+
name,
|
32 |
+
title=None, # Having the Tab-Name is sufficient.
|
33 |
+
description=description,
|
34 |
+
examples=examples,
|
35 |
+
)
|
36 |
+
return cls(title, interface)
|
37 |
+
|
38 |
+
@staticmethod
|
39 |
+
def _prepend_link_to_description(name, title, description):
|
40 |
+
without_huggingface = name.removeprefix("huggingface/")
|
41 |
+
link = f"https://huggingface.co/{without_huggingface}"
|
42 |
+
return f'<a href="{link}">{title}</a> </br> {description}'
|
43 |
+
|
44 |
+
|
45 |
+
class GradioTabWrapper(WrappedGradioObject):
|
46 |
+
@classmethod
|
47 |
+
def from_gradio_object_list(cls, title, gradio_objects):
|
48 |
+
"""Constructs a GradioTabWrapper from a title and a list of WrappedGradioObjects."""
|
49 |
+
interface = gr.TabbedInterface(
|
50 |
+
[obj.gradio_element for obj in gradio_objects],
|
51 |
+
[obj.title for obj in gradio_objects],
|
52 |
+
)
|
53 |
+
return cls(title, interface)
|
54 |
+
|
55 |
+
@classmethod
|
56 |
+
def from_yaml(cls, path):
|
57 |
+
content_dict = cls.read_yaml(path)
|
58 |
+
gradio_objects = [
|
59 |
+
cls._read_dependency(dependency)
|
60 |
+
for dependency in content_dict["dependencies"]
|
61 |
+
]
|
62 |
+
return cls.from_gradio_object_list(
|
63 |
+
content_dict["title"],
|
64 |
+
gradio_objects,
|
65 |
+
)
|
66 |
+
|
67 |
+
@staticmethod
|
68 |
+
def _read_dependency(path):
|
69 |
+
full_path = f"resources/{path}"
|
70 |
+
if path.startswith("interfaces"):
|
71 |
+
return GradioInterfaceWrapper.from_yaml(full_path)
|
72 |
+
if path.startswith("tabs"):
|
73 |
+
return GradioTabWrapper.from_yaml(full_path)
|
74 |
+
raise ValueError(
|
75 |
+
"Gradio Object Type could not be inferred from path name. Make sure "
|
76 |
+
"that all interface object yamls are in resources/interfaces, and that "
|
77 |
+
"all tab object yamls are in resources/tabs."
|
78 |
+
)
|