From dd208d565bb729b5dde8d4a3b288b5fd231f46d6 Mon Sep 17 00:00:00 2001
From: Fabian Gallenkamp <fabian.gallenkamp@uni-hamburg.de>
Date: Tue, 5 Mar 2019 11:28:03 +0100
Subject: [PATCH] Added method, tool; fixed links

---
 app.py                            | 124 ++++++++++++++++--------------
 sample_db.sqlite                  | Bin 94208 -> 94208 bytes
 templates/export/softwares.jinja2 |   2 +-
 3 files changed, 69 insertions(+), 57 deletions(-)

diff --git a/app.py b/app.py
index d69cfcb..82ec4cc 100644
--- a/app.py
+++ b/app.py
@@ -182,7 +182,7 @@ def index():
     softwares = Software.query.all()
     for software_tool in softwares:
         template.stream(software=software_tool).dump(
-            '../digitale-Methoden-wiki/Tool_' + software_tool.name.replace(' ', '') + '.asciidoc', encoding='utf-8')
+            '../digitale-Methoden-wiki/Tool_' + software_tool.name.replace(' ', '').replace('/', '') + '.asciidoc', encoding='utf-8')
 
     softwareincategory = []
     software_categorys = SoftwareCategory.query.all()
@@ -435,137 +435,140 @@ Furthermore the server-client-model is the established communication paradigms f
                      description="Analyse statistical significant co-occurence of words in different contextual units.",
                      parent=method3)
     db.session.add(method4)
-    method3 = Method(id=32,name="classification/machine learning",
+    method4 = Method(id=32,name="context volatility",
+                     description="'Analyse contextual change for certain words over a period of time.'(<<Niekler_etal2018>>,1316)",
+                     parent=method3)
+    db.session.add(method4)
+    method3 = Method(id=33,name="classification/machine learning",
                      description="Various techniques to (semi-)automatically identify specific classes. ",
                      parent=method2)
     db.session.add(method3)
-    method4 = Method(id=33,name="supervised classification",
+    method4 = Method(id=34,name="supervised classification",
                      description="Use given training examples in order to classify certain entities.",
                      parent=method3)
     db.session.add(method4)
-    method4 = Method(id=34,name="latent semantic analysis",
+    method4 = Method(id=35,name="latent semantic analysis",
                      description="'The basic idea of latent semantic analysis (LSA) is, that text do have a higher order (=latent semantic) structure which, however, is obscured by word usage (e.g. through the use of synonyms or polysemy). By using conceptual indices that are derived statistically via a truncated singular value decomposition (a two-mode factor analysis) over a given document-term matrix, this variability problem can be overcome.'(link:https://cran.r-project.org/web/packages/lsa/lsa.pdf[CRAN-R])",
                      parent=method3)
     db.session.add(method4)
-    method4 = Method(id=35,name="topic modelling",
+    method4 = Method(id=36,name="topic modelling",
                      description="Probabilistic models to infer semantic clusters. See especially <<Papilloud_etal2018>>.",
                      parent=method3)
     db.session.add(method4)
-    method5 = Method(id=36,name="latent dirichlet allocation",
+    method5 = Method(id=37,name="latent dirichlet allocation",
                      description="""'The application of LDA is based on three nested concepts: the text collection to be modelled is referred to as the corpus; one item within the corpus is a document, with words within a document called terms.(...) +
 The aim of the LDA algorithm is to model a comprehensive representation of the corpus by inferring latent content variables, called topics. Regarding the level of analysis, topics are heuristically located on an intermediate level between the corpus and the documents and can be imagined as content-related categories, or clusters. (...) Since topics are hidden in the first place, no information about them is directly observable in the data. The LDA algorithm solves this problem by inferring topics from recurring patterns of word occurrence in documents.'(<<Maier_etal2018>>,94)""",
                      parent=method4)
     db.session.add(method5)
-    method5 = Method(id=37,name="non-negative-matrix-factorization",
+    method5 = Method(id=38,name="non-negative-matrix-factorization",
                      description="Inclusion of non-negative constraint.",
                      parent=method4)
     db.session.add(method5)
-    method5 = Method(id=38,name="structural topic modelling",
+    method5 = Method(id=39,name="structural topic modelling",
                      description="Inclusion of meta-data. Refer especially to <<roberts2013>>.",
                      parent=method4)
     db.session.add(method5)
-    method4 = Method(id=39,name="sentiment analysis",
+    method4 = Method(id=40,name="sentiment analysis",
                      description="'Subjectivity and sentiment analysis focuses on the automatic identification of private states, such as opinions, emotions, sentiments, evaluations, beliefs, and speculations in natural language. While subjectivity classification labels text as either subjective or objective, sentiment classification adds an additional level of granularity, by further classifying subjective text as either positive, negative, or neutral.' (<<Ignatow_etal2017>> pp. 148)",
                      parent=method3)
     db.session.add(method4)
-    method4 = Method(id=40,name="automated narrative, argumentative structures, irony, metaphor detection/extraction",
+    method4 = Method(id=41,name="automated narrative, argumentative structures, irony, metaphor detection/extraction",
                      description="For automated narrative methapor analysis see (<<Ignatow_etal2017>>, 89-106. For argumentative structures(Task: Retrieving sentential arguments for any given controversial topic) <<Stab_etal2018>> .Refer for a current overview <<Cabrio2018>>.",
                      parent=method3)
     db.session.add(method4)
-    method3 = Method(id=41,name="network analysis/modelling",
+    method3 = Method(id=42,name="network analysis/modelling",
                      description="Generate networks out of text/relationships between text.",
                      parent=method2)
     db.session.add(method3)
-    method4 = Method(id=42, name="knowledge graph construction",
+    method4 = Method(id=43, name="knowledge graph construction",
                      description="Modelling entities and their relationships.",
                      parent=method3)
     db.session.add(method4)
-
-    method2 = Method(id=43,name="data visualization",
+    method2 = Method(id=44,name="data visualization",
                      description="Visualize the mined informations.",
                      parent=method1)
     db.session.add(method2)
-    method3 = Method(id=44,name="word relationships",
+    method3 = Method(id=45,name="word relationships",
                      description="",
                      parent=method2)
     db.session.add(method3)
-    method3 = Method(id=45,name="networks",
+    method3 = Method(id=46,name="networks",
                      description="",
                      parent=method2)
     db.session.add(method3)
-    method3 = Method(id=46,name="geo-referenced",
+    method3 = Method(id=47,name="geo-referenced",
                      description="",
                      parent=method2)
     db.session.add(method3)
-    method3 = Method(id=47,name="dynamic visualizations",
-                     description="Visualizations with user interaction or time frames.",
+    method3 = Method(id=48,name="dynamic visualizations",
+                     description="Visualizations with user interaction or animations.",
                      parent=method2)
     db.session.add(method3)
-    method1 = Method(id=48,name="science practice",
+    method1 = Method(id=49,name="science practice",
                      description="General science practice",
                      parent=method)
     db.session.add(method1)
-    method2 = Method(id=49,name="digital research design",
+    method2 = Method(id=50,name="digital research design",
                      description="New possibilities in surveys or data aquisition techniques.",
                      parent=method1)
     db.session.add(method2)
-    method3 = Method(id=50,name="ecological momentary assessments (EMA)/Experience Sampling Method (ESM)",
+    method3 = Method(id=51,name="ecological momentary assessments (EMA)/Experience Sampling Method (ESM)",
                      description="Mostly equivalent. EMA focusses on medical questions or measurements in a natural environment; ESM more on subjective Questions in the real life. Four characteristics: 1) data collection in natural environments 2) Focussing on near events/impressions/actions 3) questions triggered randomly or event-based 4) multiple questions over a certain period of time [Citation after Stone and Shiffmann 1994] (<<Salganik2018>>,109)",
                      parent=method2)
     db.session.add(method3)
-    method3 = Method(id=51,name="wiki surveys",
+    method3 = Method(id=52,name="wiki surveys",
                      description="Guide open-answer questions with user feedback.",
                      parent=method2)
     db.session.add(method3)
-    method3 = Method(id=52,name="survey data linked to big data sources",
+    method3 = Method(id=53,name="survey data linked to big data sources",
                      description="",
                      parent=method2)
     db.session.add(method3)
-    method4 = Method(id=53,name="Enriched asking",
+    method4 = Method(id=54,name="Enriched asking",
                      description="",
                      parent=method3)
     db.session.add(method4)
-    method4 = Method(id=54,name="Amplified asking",
+    method4 = Method(id=55,name="Amplified asking",
                      description="",
                      parent=method3)
     db.session.add(method4)
-    method2 = Method(id=55,name="collaborative work",
+    method2 = Method(id=56,name="collaborative work",
                      description="",
                      parent=method1)
     db.session.add(method2)
-    method3 = Method(id=56,name="open call projects",
+    method3 = Method(id=57,name="open call projects",
                      description="(e.g. annotation).",
                      parent=method2)
     db.session.add(method3)
-    method3 = Method(id=57,name="distributed data collection",
+    method3 = Method(id=58,name="distributed data collection",
                      description="",
                      parent=method2)
     db.session.add(method3)
-    method2 = Method(id=58,name="digital communication",
+    method2 = Method(id=59,name="digital communication",
                      description="",
                      parent=method1)
     db.session.add(method2)
-    method1 = Method(id=59,name="statistical modeling",
+    method1 = Method(id=60,name="statistical modeling",
                      description="",
                      parent=method)
     db.session.add(method1)
-    method2 = Method(id=60,name="regression analysis",
+    method2 = Method(id=61,name="regression analysis",
                      description="",
                      parent=method1)
     db.session.add(method2)
-    method2 = Method(id=61,name="time-series analysis",
+    method2 = Method(id=62,name="time-series analysis",
                      description="",
                      parent=method1)
     db.session.add(method2)
-    method2 = Method(id=62,name="agent-based modeling",
+    method2 = Method(id=63,name="agent-based modeling",
                      description="",
                      parent=method1)
     db.session.add(method2)
-    method1 = Method(id=63,name="social complexity modeling/ social simulation",
+    method1 = Method(id=64,name="social complexity modeling/ social simulation",
                      description="",
                      parent=method)
     db.session.add(method1)
-    method2 = Method(id=64,name="nowcasting",
+    method2 = Method(id=65,name="nowcasting",
                      description="Using methods to predict the future for estimation of current values. (Example: predict influenza epidemiology combining CDC Data and Google Trends(<<Salganik2018>>,46–50)).",
                      parent=method1)
     db.session.add(method2)
@@ -603,8 +606,9 @@ The aim of the LDA algorithm is to model a comprehensive representation of the c
     reference = Reference(name="Stab_etal2018",
                           cited="Stab, C., Daxenberger, J., Stahlhut, C., Miller, T., Schiller, B., Tauchmann, C., . . . Gurevych, I. (2018). ArgumenText: Searching for Arguments in Heterogeneous Sources. In Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Demonstrations (pp. 21–25).")
     db.session.add(reference)
-
-
+    reference = Reference(name="Niekler_etal2018",
+                          cited="Niekler, A., Bleier, A., Kahmann, C., Posch, L., Wiedemann, G., Erdogan, K., . . . Strohmaier, M. (2018). ILCM - A Virtual Research Infrastructure for Large-Scale Qualitative Data. In Proceedings of the Eleventh International Conference on Language Resources and Evaluation (LREC-2018). European Language Resource Association. Retrieved from http://aclweb.org/anthology/L18-1209")
+    db.session.add(reference)
 
     lic_unknown = License(name="Unknown")
     lic_bsd = License(name="BSD")
@@ -617,12 +621,6 @@ The aim of the LDA algorithm is to model a comprehensive representation of the c
     lic_byncnd3 = License(name="CC BY-NC-ND", version="3.0")
     lic_ccdl = License(name="CCDL", version="1.0")
     lic_prop = License(name="Proprietary")
-    db.session.add(lic_gpl3)
-    db.session.add(lic_gpl3)
-    db.session.add(lic_agpl3)
-    db.session.add(lic_apache2)
-    db.session.add(lic_mit)
-    db.session.add(lic_prop)
 
     prol_r = Programminglanguage(name="R")
     prol_py = Programminglanguage(name="Python")
@@ -633,13 +631,7 @@ The aim of the LDA algorithm is to model a comprehensive representation of the c
     prol_jupyternb = Programminglanguage(name="Jupyter Notebook")
     prol_js = Programminglanguage(name="Javascript")
     prol_c = Programminglanguage(name="C")
-    db.session.add(prol_r)
-    db.session.add(prol_py)
-    db.session.add(prol_java)
-    db.session.add(prol_objc)
-    db.session.add(prol_jupyternb)
-    db.session.add(prol_js)
-    db.session.add(prol_c)
+    prol_ruby = Programminglanguage(name="Ruby")
 
     cat_tracking = SoftwareCategory(name="user-consented tracking", short_description="Collection of sensor data on (mobile) devices in accordance with data protection laws.")
     cat_scraping = SoftwareCategory(name="scraping", short_description="Tools in the area of web-scraping")
@@ -661,13 +653,9 @@ The aim of the LDA algorithm is to model a comprehensive representation of the c
     cat_ocr = SoftwareCategory(name="optical character recognition (OCR)",short_description="OCR is the mechanical or electronic conversion of images of typed, handwritten or printed text into machine-encoded text.")
     cat_oe = SoftwareCategory(name="online experiments", short_description="")
     cat_agent = SoftwareCategory(name="Agent-based modeling", short_description="")
+    cat_jour = SoftwareCategory(name="Investigative Journalism", short_description="")
     cat_misc = SoftwareCategory(name="miscellaneous", short_description="")
 
-
-    db.session.add(cat_tracking)
-    db.session.add(cat_scraping)
-    db.session.add(cat_int)
-
     tool = Software(name="AWARE",
                     short_description="'AWARE is an Android framework dedicated to instrument, infer, log and share mobile context information, for application developers, researchers and smartphone users. AWARE captures hardware-, software-, and human-based data. The data is then analyzed using AWARE plugins. They transform data into information you can understand.' link:http://www.awareframework.com/what-is-aware/[Source, visited: 27.02.2019]",
                     developer="",
@@ -1468,6 +1456,30 @@ The aim of the LDA algorithm is to model a comprehensive representation of the c
     db.session.add(Link(software=tool, type="website", url="http://ccl.northwestern.edu/netlogo/", comment=""))
     db.session.add(Link(software=tool, type="repository", url="https://github.com/NetLogo/NetLogo", comment=""))
 
+    tool = Software(name="DocumentCloud",
+                    short_description="'DocumentCloud is a platform founded on the belief that if journalists were more open about their sourcing, the public would be more inclined to trust their reporting. The platform is a tool to help journalists share, analyze, annotate and, ultimately, publish source documents to the open web.' link:https://www.documentcloud.org/about[Source, visited: 04.03.2019]",
+                    developer="Ted Han and Aron Pilhofer",
+                    maintainer="Ted Han and Aron Pilhofer",
+                    softwarecategory=cat_jour,
+                    architecture="standalone",
+                    license=lic_mit,
+                    programminglanguages=[prol_ruby])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://www.documentcloud.org/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/documentcloud/documentcloud", comment=""))
+
+    tool = Software(name="NEW/S/LEAK",
+                    short_description="'DocumentCloud is a platform founded on the belief that if journalists were more open about their sourcing, the public would be more inclined to trust their reporting. The platform is a tool to help journalists share, analyze, annotate and, ultimately, publish source documents to the open web.' link:https://www.documentcloud.org/about[Source, visited: 04.03.2019]",
+                    developer="Gregor Wiedemann and Seid Muhie Yimam and Chris Biemann",
+                    maintainer="Gregor Wiedemann and Seid Muhie Yimam and Chris Biemann",
+                    softwarecategory=cat_jour,
+                    architecture="standalone",
+                    license=lic_agpl3,
+                    programminglanguages=[prol_ruby])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://www.documentcloud.org/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/documentcloud/documentcloud", comment=""))
+
     tool = Software(name="spades",
                     short_description="",
                     developer="",
diff --git a/sample_db.sqlite b/sample_db.sqlite
index 5062764ab07c1a65ebd949829019a7a2a00a8134..8cd791705c5b26174d75e40e411ddc71e54c423e 100644
GIT binary patch
delta 4747
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
ZrcaGwlxJkyzBPu?o|%V@r5IjW005?%0geCw

delta 3056
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

diff --git a/templates/export/softwares.jinja2 b/templates/export/softwares.jinja2
index c355f74..540a918 100644
--- a/templates/export/softwares.jinja2
+++ b/templates/export/softwares.jinja2
@@ -8,6 +8,6 @@
 == {{ softwarecategory[0].name }}
 _{{softwarecategory[0].short_description}}_
 {% for software in softwarecategory[1] %}
-link:Tool_{{ software.name.replace(' ','') }}[{{ software.name }}] ({% for link in software.links %}link:{{link.url}}[{{link.type}}{{'-'+link.comment if link.comment else '' }}] {% endfor %}):: {{software.short_description}} < {{software.license}} | {{software.architecture}} | {% for prol in software.programminglanguages %}{{prol.name}} {% endfor %} >
+link:Tool_{{ software.name.replace(' ', '').replace('/', '') }}[{{ software.name }}] ({% for link in software.links %}link:{{link.url}}[{{link.type}}{{'-'+link.comment if link.comment else '' }}] {% endfor %}):: {{software.short_description}} < {{software.license}} | {{software.architecture}} | {% for prol in software.programminglanguages %}{{prol.name}} {% endfor %} >
 {% endfor %}
 {% endfor %}
\ No newline at end of file
-- 
GitLab