diyclassics commited on
Commit
615deca
·
1 Parent(s): fbe3d2c

Update dashboard

Browse files
app.py CHANGED
@@ -1,90 +1,26 @@
1
  import streamlit as st
2
- import spacy
3
- import pandas as pd
4
- import datetime
5
-
6
- st.set_page_config(layout="wide")
7
-
8
- default_text = """Ita fac, mi Lucili; vindica te tibi, et tempus, quod adhuc aut auferebatur aut subripiebatur aut excidebat, collige et serva."""
9
-
10
-
11
- def format_morph(morph):
12
- morph = morph.to_dict()
13
- if morph:
14
- return ", ".join([f"{k}={v}" for k, v in morph.items()])
15
- else:
16
- return ""
17
 
 
 
 
 
18
 
19
- def analyze_text(text):
20
- doc = nlp(text)
21
- rows = []
22
- for token in doc[:100]:
23
- rows.append(
24
- (
25
- token.text,
26
- token.norm_,
27
- token.lower_,
28
- token.lemma_,
29
- token.pos_,
30
- token.tag_,
31
- token.dep_,
32
- format_morph(token.morph),
33
- token.ent_type_,
34
- )
35
- )
36
- df = pd.DataFrame(
37
- rows,
38
- columns=[
39
- "text",
40
- "norm",
41
- "lower",
42
- "lemma",
43
- "pos",
44
- "tag",
45
- "dep",
46
- "morph",
47
- "ent_type",
48
- ],
49
- )
50
- return df
51
 
 
52
 
53
- st.title("LatinCy Text Analyzer")
 
 
54
 
55
- # Using object notation
56
- model_selectbox = st.sidebar.selectbox(
57
- "Choose model:",
58
- ("la_core_web_lg", "la_core_web_md", "la_core_web_sm")
59
  )
60
 
61
- nlp = spacy.load(model_selectbox)
62
-
63
- df = None
64
 
65
- text = st.text_area(
66
- "Enter some text to analyze (max 100 tokens)", value=default_text, height=200
67
- )
68
- if st.button("Analyze"):
69
- df = analyze_text(text)
70
- st.text(f"Analyzed {len(df)} tokens with {model_selectbox} model.")
71
- st.dataframe(df, width=1000)
72
 
73
- @st.cache_data
74
- def convert_df(df):
75
- return df.to_csv(index=False, sep="\t").encode("utf-8")
76
 
77
- csv = convert_df(df)
78
 
79
- def create_timestamp():
80
- return datetime.datetime.now().strftime("%Y%m%d%H%M%S")
81
 
82
- # nb: clicking this button resets app! Open streamlit issue, as of 4.15.2023; cf. https://github.com/streamlit/streamlit/issues/4382
83
- st.markdown("*NB: Clicking the download button will reset the app after download!*")
84
- st.download_button(
85
- "Press to Download",
86
- csv,
87
- f"latincy-analysis-{create_timestamp()}.tsv",
88
- "text/csv",
89
- key="download-csv",
90
- )
 
1
  import streamlit as st
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ st.set_page_config(
4
+ page_title="Hello",
5
+ page_icon="👋",
6
+ )
7
 
8
+ st.write("# LatinCy Dashboard")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ st.sidebar.success("Select a demo above.")
11
 
12
+ st.markdown(
13
+ """
14
+ LatinCy is a collection of Latin language models for spaCy.
15
 
16
+ ### See the demos
17
+ - [Get basic spaCy data from a short text](parsing_demo)
18
+ - [Visualize a custom span label](custom_label_demo), here tokens covered by the [DCC Core Latin Vocabulary](https://dcc.dickinson.edu/latin-core-list1
19
+ """
20
  )
21
 
 
 
 
22
 
 
 
 
 
 
 
 
23
 
 
 
 
24
 
 
25
 
 
 
26
 
 
 
 
 
 
 
 
 
 
pages/1_parsing_demo.py ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import spacy
3
+ import pandas as pd
4
+ import datetime
5
+
6
+ st.set_page_config(page_title="Parsing Demo", layout="wide")
7
+ st.sidebar.header("Parsing Demo")
8
+
9
+ default_text = """Ita fac, mi Lucili; vindica te tibi, et tempus, quod adhuc aut auferebatur aut subripiebatur aut excidebat, collige et serva."""
10
+
11
+
12
+ def format_morph(morph):
13
+ morph = morph.to_dict()
14
+ if morph:
15
+ return ", ".join([f"{k}={v}" for k, v in morph.items()])
16
+ else:
17
+ return ""
18
+
19
+
20
+ def analyze_text(text):
21
+ doc = nlp(text)
22
+ rows = []
23
+ for token in doc[:100]:
24
+ rows.append(
25
+ (
26
+ token.text,
27
+ token.norm_,
28
+ token.lower_,
29
+ token.lemma_,
30
+ token.pos_,
31
+ token.tag_,
32
+ token.dep_,
33
+ format_morph(token.morph),
34
+ token.ent_type_,
35
+ )
36
+ )
37
+ df = pd.DataFrame(
38
+ rows,
39
+ columns=[
40
+ "text",
41
+ "norm",
42
+ "lower",
43
+ "lemma",
44
+ "pos",
45
+ "tag",
46
+ "dep",
47
+ "morph",
48
+ "ent_type",
49
+ ],
50
+ )
51
+ return df
52
+
53
+
54
+ st.title("LatinCy Text Analyzer")
55
+
56
+ # Using object notation
57
+ model_selectbox = st.sidebar.selectbox(
58
+ "Choose model:",
59
+ ("la_core_web_lg", "la_core_web_md", "la_core_web_sm")
60
+ )
61
+
62
+ nlp = spacy.load(model_selectbox)
63
+
64
+ df = None
65
+
66
+ text = st.text_area(
67
+ "Enter some text to analyze (max 100 tokens)", value=default_text, height=200
68
+ )
69
+ if st.button("Analyze"):
70
+ df = analyze_text(text)
71
+ st.text(f"Analyzed {len(df)} tokens with {model_selectbox} model.")
72
+ st.dataframe(df, width=1000)
73
+
74
+ @st.cache_data
75
+ def convert_df(df):
76
+ return df.to_csv(index=False, sep="\t").encode("utf-8")
77
+
78
+ csv = convert_df(df)
79
+
80
+ def create_timestamp():
81
+ return datetime.datetime.now().strftime("%Y%m%d%H%M%S")
82
+
83
+ # nb: clicking this button resets app! Open streamlit issue, as of 4.15.2023; cf. https://github.com/streamlit/streamlit/issues/4382
84
+ st.markdown("*NB: Clicking the download button will reset the app after download!*")
85
+ st.download_button(
86
+ "Press to Download",
87
+ csv,
88
+ f"latincy-analysis-{create_timestamp()}.tsv",
89
+ "text/csv",
90
+ key="download-csv",
91
+ )
pages/2_custom_label_demo.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spacy
2
+ from spacy.language import Language
3
+ from spacy.matcher import Matcher
4
+ from spacy.tokens import Token, Span
5
+ import streamlit as st
6
+ from spacy_streamlit import visualize_spans
7
+
8
+ st.set_page_config(page_title='Custom Label Demo', layout="wide")
9
+ st.sidebar.header("Custom Label Demo")
10
+
11
+ default_text = """Ita fac, mi Lucili; vindica te tibi, et tempus, quod adhuc aut auferebatur aut subripiebatur aut excidebat, collige et serva."""
12
+
13
+ @Language.factory("dcc_core")
14
+ def create_dcc_core_merger(nlp, name):
15
+ return DCCCoreMerger(nlp.vocab)
16
+
17
+ class DCCCoreMerger:
18
+ def __init__(self, vocab):
19
+ patterns = [
20
+ [
21
+ {"LEMMA": {"IN": ["ab", "abeo", "absum", "ac", "accedo", "accido", "accipio", "acer", "acies", "ad", "addo", "adduco", "adeo", "adeo", "adhibeo", "adhuc", "adsum", "aduenio", "aduersus", "aduerto", "aedes", "aeger", "aequor", "aequus", "aer", "aes", "aetas", "aeternus", "aether", "aeuum", "affero", "afficio", "ager", "agito", "agmen", "ago", "aio", "albus", "alienus", "aliquando", "aliquis", "aliter", "alius", "alo", "alter", "altus", "amicitia", "amicus", "amitto", "amnis", "amo", "amor", "amplus", "an", "anima", "animal", "animus", "annus", "ante", "antequam", "antiquus", "aperio", "appareo", "appello", "aptus", "apud", "aqua", "ara", "arbitror", "arbor", "ardeo", "argentum", "arma", "ars", "aruum", "arx", "ascendo", "aspicio", "astrum", "at", "atque", "auctor", "auctoritas", "audax", "audeo", "audio", "aufero", "augeo", "aura", "aureus", "auris", "aurum", "aut", "autem", "auxilium", "auis", "barbarus", "beatus", "bellum", "bene", "beneficium", "bonus", "bos", "breuis", "cado", "caecus", "caedes", "caedo", "caelestis", "caelum", "campus", "candidus", "canis", "cano", "capio", "caput", "careo", "carmen", "carus", "castrum", "castus", "casus", "causa", "caueo", "cedo", "celebro", "celer", "censeo", "centum", "cerno", "certo", "certus", "ceterus", "cibus", "cingo", "cinis", "circa", "citus", "ciuis", "ciuitas", "clamor", "clarus", "classis", "claudo", "coepi", "cogito", "cognosco", "cogo", "cohors", "colligo", "colo", "color", "coma", "comes", "committo", "communis", "comparo", "compono", "concedo", "condicio", "condo", "confero", "conficio", "confiteor", "coniunx", "conor", "consequor", "consilium", "consisto", "constituo", "consto", "consuetudo", "consul", "consulo", "consumo", "contemno", "contineo", "contingo", "contra", "conuenio", "conuerto", "conuiuium", "copia", "cor", "cornu", "corpus", "corrumpo", "credo", "creo", "cresco", "crimen", "culpa", "cum", "cunctus", "cupido", "cupio", "cur", "cura", "curo", "curro", "currus", "cursus", "custos", "damno", "damnum", "de", "debeo", "decem", "decerno", "decet", "decus", "deduco", "defendo", "defero", "deficio", "deinde", "dein", "denique", "descendo", "desero", "desidero", "desino", "desum", "deus", "dexter", "dico", "dies", "differo", "difficilis", "dignitas", "dignus", "diligo", "dimitto", "discedo", "disciplina", "disco", "diu", "diuersus", "diues", "diuido", "diuitiae", "diuus", "do", "doceo", "doleo", "dolor", "dolus", "dominus", "domus", "donec", "dono", "donum", "dormio", "dubito", "dubius", "duco", "dulcis", "dum", "duo", "durus", "dux", "ecce", "edico", "edo", "educo", "efficio", "effundo", "ego", "egredior", "egregius", "eligo", "enim", "eo", "eo", "epistula", "eques", "equus", "ergo", "eripio", "erro", "error", "et", "etiam", "ex", "excipio", "exemplum", "exeo", "exerceo", "exercitus", "exigo", "existimo", "experior", "exsilium", "exspecto", "extremus", "fabula", "facies", "facilis", "facinus", "facio", "factum", "fallo", "falsus", "fama", "fames", "familia", "fateor", "fatum", "fax", "felix", "femina", "fere", "fero", "ferrum", "ferus", "fessus", "fidelis", "fides", "filia", "filius", "fingo", "finis", "fio", "flamma", "fleo", "flos", "fluctus", "flumen", "fluo", "foedus", "fons", "for", "fore", "forma", "fors", "forsitan", "fortis", "fortuna", "forum", "frango", "frater", "frequens", "frons", "fructus", "frumentum", "fruor", "frustra", "fuga", "fugio", "fugo", "fundo", "funus", "furor", "gaudeo", "gaudium", "gens", "genus", "gero", "gigno", "gladius", "gloria", "gradus", "gratia", "gratus", "grauis", "habeo", "haud", "hic", "hic", "hiems", "hodie", "homo", "honestus", "honor", "hora", "hortor", "hospes", "hostis", "huc", "humanus", "humus", "iaceo", "iacio", "iam", "ibi", "ictus", "idem", "ideo", "igitur", "ignis", "ille", "illic", "illuc", "imago", "imperator", "imperium", "impero", "impetus", "impleo", "impono", "in", "incido", "incipio", "inde", "indico", "infero", "inferus", "ingenium", "ingens", "ingratus", "ingredior", "inimicus", "initium", "iniuria", "inquam", "instituo", "insula", "integer", "intellego", "intendo", "inter", "interficio", "interim", "interrogo", "intersum", "intra", "intro", "inuenio", "inuidia", "ipse", "ira", "irascor", "is", "iste", "ita", "itaque", "item", "iter", "iterum", "iubeo", "iudex", "iudicium", "iudico", "iugum", "iungo", "iuro", "ius", "iustus", "iuuenis", "iuuo", "labor", "laboro", "lacrima", "laedo", "laetus", "lapis", "lateo", "latus", "latus", "laudo", "laus", "legatus", "legio", "lego", "leuis", "lex", "liber", "liber", "libertas", "libet", "libido", "licet", "limen", "lingua", "littera", "litus", "locus", "longus", "loquor", "lumen", "luna", "lux", "maestus", "magis", "magister", "magnitudo", "magnus", "maior", "malo", "malus", "maneo", "manus", "mare", "maritus", "mater", "materia", "maximus", "medius", "melior", "membrum", "memini", "memoria", "mens", "mensa", "mereo", "metuo", "metus", "meus", "miles", "mille", "minus", "miror", "misceo", "miser", "mitto", "modo", "modus", "moenia", "mollis", "moneo", "mons", "mora", "morbus", "morior", "moror", "mors", "mortalis", "mos", "moueo", "mox", "mulier", "multitudo", "multus", "mundus", "mundus", "munus", "murus", "muto", "nam", "narro", "nascor", "natura", "natus", "nauis", "ne", "ne", "nec", "necesse", "necessitas", "nefas", "nego", "negotium", "nemo", "nemus", "neque", "nescio", "niger", "nihil", "nimius", "nisi", "ni", "nobilis", "noceo", "nolo", "nomen", "non", "nondum", "nos", "nosco", "noster", "notus", "nouus", "nox", "nudus", "nullus", "num", "numen", "numerus", "numquam", "nunc", "nuntius", "ob", "occido", "occupo", "occurro", "oculus", "odi", "odium", "offero", "officium", "olim", "omnis", "onus", "opera", "oportet", "oppidum", "ops", "optimus", "opto", "opus", "oratio", "orbis", "ordo", "orior", "oro", "os", "os", "ostendo", "otium", "paene", "par", "parco", "parens", "pareo", "pario", "paro", "pars", "parum", "paruus", "pateo", "pater", "patior", "patria", "pauci", "paulo", "pauper", "pax", "pecco", "pectus", "pecunia", "pecus", "pello", "pendo", "per", "perdo", "pereo", "pergo", "periculum", "permitto", "perpetuus", "pertineo", "peruenio", "pes", "peto", "pietas", "pius", "placeo", "plebs", "plenus", "plerusque", "plurimus", "plus", "poena", "poeta", "pondus", "pono", "pontus", "populus", "porta", "porto", "posco", "possum", "post", "postea", "posterus", "postquam", "potens", "potestas", "potis", "praebeo", "praeceptum", "praecipio", "praeda", "praemium", "praesens", "praesidium", "praesto", "praeter", "praeterea", "praetor", "precor", "premo", "pretium", "prex", "primus", "princeps", "principium", "prior", "priuatus", "pro", "probo", "procedo", "procul", "prodo", "proelium", "proficiscor", "prohibeo", "promitto", "prope", "propior", "propero", "propono", "proprius", "propter", "prosum", "protinus", "prouincia", "publicus", "pudor", "puella", "puer", "pugna", "pugno", "pulcher", "puto", "qua", "quaero", "qualis", "quam", "quamquam", "quamuis", "quando", "quantum", "quantus", "quare", "quasi", "quattuor", "que", "quemadmodum", "queror", "qui", "quia", "quicumque", "quid", "quidam", "quidem", "quiesco", "quin", "quippe", "quis", "quisquam", "quisque", "quisquis", "quo", "quomodo", "quondam", "quoniam", "quoque", "quotiens", "rapio", "rarus", "ratio", "recedo", "recens", "recipio", "rectus", "reddo", "redeo", "refero", "regio", "regius", "regnum", "rego", "relinquo", "reliquus", "reor", "reperio", "repeto", "res", "respicio", "respondeo", "retineo", "reus", "reuerto", "reuoco", "rex", "rideo", "ripa", "rogo", "rumpo", "rursus", "rus", "sacer", "sacerdos", "saeculum", "saepe", "saeuus", "salus", "sanctus", "sanguis", "sanus", "sapiens", "sapientia", "satis", "sat", "saxum", "scelus", "scientia", "scilicet", "scio", "scribo", "secundus", "securus", "sed", "sedeo", "sedes", "semel", "semper", "senatus", "senex", "sensus", "sententia", "sentio", "sepulcrum", "sequor", "sermo", "seruio", "seruo", "seruus", "seu", "si", "sic", "sicut", "sidus", "signum", "silua", "similis", "simul", "sine", "singuli", "sino", "sinus", "siue", "socius", "sol", "soleo", "solus", "soluo", "somnus", "sono", "soror", "sors", "spargo", "spatium", "species", "specto", "spero", "spes", "spiritus", "statim", "statuo", "stella", "sto", "studeo", "studium", "sub", "subeo", "subito", "sui", "sum", "summus", "sumo", "super", "superbus", "supero", "supersum", "superus", "supplicium", "supra", "surgo", "suscipio", "sustineo", "suus", "taceo", "talis", "tam", "tamen", "tamquam", "tandem", "tango", "tantus", "tardus", "tectum", "tego", "tellus", "telum", "tempestas", "templum", "tempus", "tendo", "tenebrae", "teneo", "tener", "tento", "tergum", "terra", "terreo", "tertius", "testis", "timeo", "timor", "tollo", "tot", "totus", "trado", "traho", "transeo", "tres", "tribunus", "tristis", "tu", "tum", "turba", "turbo", "turpis", "tutus", "tuus", "ubi", "ullus", "ultimus", "ultra", "umbra", "umquam", "unda", "unde", "undique", "unus", "urbs", "usque", "usus", "ut", "uterque", "utilis", "utor", "utrum", "uxor", "uaco", "uacuus", "uagus", "ualeo", "ualidus", "uanus", "uarius", "uates", "ue", "ueho", "uel", "uelut", "uenio", "uentus", "uerbum", "uereor", "uero", "uerto", "uerus", "uester", "uestigium", "uestis", "ueto", "uetus", "uia", "uicinus", "uictor", "uictoria", "uideo", "uinco", "uinculum", "uinum", "uir", "uirgo", "uirtus", "uis", "uita", "uitium", "uito", "uiuo", "uix", "uoco", "uolo", "uolucer", "uoluntas", "uoluptas", "uos", "uotum", "uox", "uulgus", "uulnus", "uultus"]}}
22
+ ]]
23
+ # Register a new token extension to flag core vocabulary
24
+ Token.set_extension("is_dcc_core", force=True, default=False)
25
+ self.matcher = Matcher(vocab)
26
+ self.matcher.add("DCC_CORE", patterns)
27
+
28
+ def __call__(self, doc):
29
+ # This method is invoked when the component is called on a Doc
30
+ doc.spans["dcc_core"] = []
31
+ matches = self.matcher(doc)
32
+ spans = [] # Collect the matched spans here
33
+ for match_id, start, end in matches:
34
+ spans.append(doc[start:end])
35
+ doc.spans["dcc_core"].append(Span(doc, start, end, "CORE"))
36
+ for span in spans:
37
+ for token in span:
38
+ token._.is_dcc_core = True # Mark token as bad HTML
39
+ return doc
40
+
41
+ st.title("LatinCy DCC Core Visualizer")
42
+
43
+ # Using object notation
44
+ model_selectbox = st.sidebar.selectbox(
45
+ "Choose model:",
46
+ ("la_core_web_lg", "la_core_web_md", "la_core_web_sm")
47
+ )
48
+
49
+ nlp = spacy.load(model_selectbox)
50
+
51
+ # Add component to pipeline
52
+ nlp.add_pipe("dcc_core", last=True)
53
+
54
+ text = st.text_area(
55
+ "Enter some text to analyze (max 100 tokens)", value=default_text, height=200
56
+ )
57
+ if st.button("Analyze"):
58
+ doc = nlp(text.replace("v", "u").replace("V", "U"))
59
+ len_doc = len([token for token in doc if not token.is_punct])
60
+ len_dcc = len(doc.spans["dcc_core"])
61
+ st.text(f"Analyzed {len_doc} tokens with {len_dcc} core vocabulary items ({round((len_dcc/len_doc)*100, 2)}%) ")
62
+ visualize_spans(doc, spans_key="dcc_core", show_table=False, displacy_options={"colors": {"CORE": "#09a3d5"}})
requirements.txt CHANGED
@@ -3,4 +3,5 @@ la-core-web-md @ https://huggingface.co/latincy/la_core_web_md/resolve/main/la_c
3
  la-core-web-sm @ https://huggingface.co/latincy/la_core_web_sm/resolve/main/la_core_web_sm-any-py3-none-any.whl#sha256=0aecb1b9c9974b48b180092ab4e25b3bdba7c4b7b6cd47942e667cb054f07e04
4
  pandas==1.5.3
5
  spacy==3.5.2
6
- streamlit==1.21.0
 
 
3
  la-core-web-sm @ https://huggingface.co/latincy/la_core_web_sm/resolve/main/la_core_web_sm-any-py3-none-any.whl#sha256=0aecb1b9c9974b48b180092ab4e25b3bdba7c4b7b6cd47942e667cb054f07e04
4
  pandas==1.5.3
5
  spacy==3.5.2
6
+ streamlit==1.21.0
7
+ spacy-streamlit==1.0.5