diff --git a/.gitignore b/.gitignore index c507e47..b72e534 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea/ +.vscode/ target/ .DS_Store \ No newline at end of file diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java index c513548..223bbca 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java @@ -16,6 +16,8 @@ import org.texttechnologylab.project.gruppe_05_1.database.domainimpl.mdb.Speech_ import org.texttechnologylab.project.gruppe_05_1.domain.html.HtmlSpeech; import org.texttechnologylab.project.gruppe_05_1.domain.html.Parlamentarier; import org.texttechnologylab.project.gruppe_05_1.domain.html.ParlamentarierDetails; +import org.texttechnologylab.project.gruppe_05_1.domain.nlp.NamedEntity; +import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Token; import org.texttechnologylab.project.gruppe_05_1.domain.speaker.Membership; import org.texttechnologylab.project.gruppe_05_1.domain.speech.SpeechMetaData; import org.texttechnologylab.project.gruppe_05_1.util.GeneralUtils; @@ -28,6 +30,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; +import java.util.stream.Collectors; import static com.mongodb.client.model.Filters.eq; @@ -760,4 +763,43 @@ public class MongoPprUtils { } return speechIds; } + public static Map getPOSInformationCardinalitiesForSpeechById(String speechId) { + List tokens = getHTMLSpeechByKey(speechId).getNlp().getTokens(); + Map posCounts = Token.countPOS(tokens); + + List posList = posCounts.entrySet().stream() + .map(entry -> new Token(entry.getKey(), String.valueOf(entry.getValue()), "")) // Lemma remains empty + .collect(Collectors.toList()); + + return posCounts; + } + + public static Map getNamedEntitiesInformationCardinalitiesForSpeechById(String speechId) { + Map> namedEntitiesMapOfMaps = new HashMap<>(); + + for (NamedEntity ne : getHTMLSpeechByKey(speechId).getNlp().getNamedEntities()) { + String type = ne.getType(); + String text = ne.getText(); + + if (namedEntitiesMapOfMaps.containsKey(type)) { + // Named Entity Type bekannt... + Map typeAppearance = namedEntitiesMapOfMaps.get(type); + if (typeAppearance.containsKey(text)) { + // ... und der Text auch bekannt --> erhöhe die Anzahl um 1 + typeAppearance.replace( + text, + typeAppearance.get(text) + 1) ; + } else { + typeAppearance.put(text, 1); + } + } else { + // Named Entity Type unbekannt: erstelle einen neuen Eintrag für Type sowie einen Eintrag für den ihm gehörigen Text + Map firstTextAppearance = new HashMap<>(); + firstTextAppearance.put(text, 1); + namedEntitiesMapOfMaps.put(type, firstTextAppearance); + } + } + + return namedEntitiesMapOfMaps.get("CARDINAL"); // needs fixing + } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java index 16cbe83..b8eddad 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/export/TeXUtil.java @@ -1,6 +1,7 @@ package org.texttechnologylab.project.gruppe_05_1.export; import org.texttechnologylab.project.gruppe_05_1.database.domainimpl.mdb.Speaker_MongoDB_Impl; +import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Topic; import org.texttechnologylab.project.gruppe_05_1.util.Logger; import org.texttechnologylab.project.gruppe_05_1.xml.speeches.Interfaces.Speech; @@ -16,6 +17,7 @@ import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Base64; import java.util.List; +import java.util.Map; import static org.texttechnologylab.project.gruppe_05_1.Main.RESOURCES_DIR; import static org.texttechnologylab.project.gruppe_05_1.Main.TEMP_EXPORT_DIR; @@ -49,7 +51,22 @@ public class TeXUtil { tex.append(speech.toTeX()); - return tex.toString().replace("$$SPEAKERINFO$$", speaker.toTeX()); + Map topics = Topic.condenseTopicInformation(getHTMLSpeechByKey(speechId).getNlp().getTopics()); + // loop through topics and Logger.pink them + for (Map.Entry entry : topics.entrySet()) { + Logger.pink(entry + " " + entry.getValue()); + } + + /*Map pos = getPOSInformationCardinalitiesForSpeechById(speechId); + // loop through topics and Logger.pink them + for (Map.Entry entry : pos.entrySet()) { + Logger.pink(entry + " " + entry.getValue()); + }*/ + + return tex.toString().replace("$$SPEAKERINFO$$", speaker.toTeX()) + .replace("$$NLPMETADATA$$", + generateChartView(generateBubbleChartLatex(topics), + generateBarChartLatex(getPOSInformationCardinalitiesForSpeechById(speechId)), "", "")); } public static String getSpeechToTexComponent(Speech speech) { @@ -223,4 +240,61 @@ public class TeXUtil { } catch (IOException ignored) {} return false; } + + public static String generateChartView(String bubbleChartTeX, String barChartTeX, String radarChartTeX, String sunburstCharTeX) { + StringBuilder tex = new StringBuilder(); + // 2x2 minipage layout + tex.append("\\begin{minipage}{0.5\\textwidth}\n") + .append(bubbleChartTeX) + .append("\\end{minipage}\n") + .append("\\begin{minipage}{0.5\\textwidth}\n") + .append(barChartTeX) + .append("\\end{minipage}\n") + .append("\\begin{minipage}{0.5\\textwidth}\n") + .append(radarChartTeX) + .append("\\end{minipage}\n") + .append("\\begin{minipage}{0.5\\textwidth}\n") + .append(sunburstCharTeX) + .append("\\end{minipage}\n"); + + return tex.toString(); + } + + public static String generateBubbleChartLatex(Map bubbleData) { + StringBuilder tex = new StringBuilder(); + + tex.append("Topics Information\\\\\n"); + + // draw generic table with String | Double + tex.append("\\begin{tabular}{|c|c|}\n") + .append("\\hline\n") + .append("Category & Value \\\\ \\hline\n"); + + for (Map.Entry entry : bubbleData.entrySet()) { + tex.append(entry.getKey()).append(" & ").append(entry.getValue()).append(" \\\\ \\hline\n"); + } + + tex.append("\\end{tabular}\n\n"); + + return tex.toString(); + } + + public static String generateBarChartLatex(Map barData) { + StringBuilder tex = new StringBuilder(); + + tex.append("POS Information\\\\\n"); + + // draw generic table with String | Double + tex.append("\\begin{tabular}{|c|c|}\n") + .append("\\hline\n") + .append("Category & Value \\\\ \\hline\n"); + + for (Map.Entry entry : barData.entrySet()) { + tex.append(entry.getKey()).append(" & ").append(entry.getValue()).append(" \\\\ \\hline\n"); + } + + tex.append("\\end{tabular}\n\n"); + + return tex.toString(); + } } diff --git a/src/main/resources/tex/preamble.tex b/src/main/resources/tex/preamble.tex index ec2bf02..bfcfc8c 100644 --- a/src/main/resources/tex/preamble.tex +++ b/src/main/resources/tex/preamble.tex @@ -4,6 +4,8 @@ \usepackage{geometry} \usepackage{xcolor} \usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage{pgfplots} \pagestyle{fancy}