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 6cdb273..ae937b4 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 @@ -623,6 +623,7 @@ public class MongoPprUtils { System.out.println("SpeechDoc "+ speechDoc); // TODO: remove when no longer needed if (speechDoc == null) { Logger.error("Rede " + key + " nicht gefunden"); + return null; } return new HtmlSpeech(speechDoc); diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java index 0d86893..ea844b3 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java @@ -3,10 +3,7 @@ package org.texttechnologylab.project.gruppe_05_1.domain.html; import org.bson.Document; import org.texttechnologylab.project.gruppe_05_1.database.MongoDBHandler; import org.texttechnologylab.project.gruppe_05_1.database.MongoPprUtils; -import org.texttechnologylab.project.gruppe_05_1.domain.nlp.NlpInfo; -import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Sentiment; -import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Token; -import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Topic; +import org.texttechnologylab.project.gruppe_05_1.domain.nlp.*; import org.texttechnologylab.project.gruppe_05_1.domain.speech.SpeechMetaData; import java.util.ArrayList; @@ -69,6 +66,7 @@ public class HtmlSpeech { List dependenciesDocs = nlpDoc.get("dependencies", MongoDBHandler.DOC_LIST_CLASS); List namedEntitiesDocs = nlpDoc.get("namedEntities", MongoDBHandler.DOC_LIST_CLASS); + nlp.setNamedEntities(NamedEntity.readNamedEntitiesFromMongo(namedEntitiesDocs)); List sentimentDocs = nlpDoc.get("sentiments", MongoDBHandler.DOC_LIST_CLASS); nlp.setSentiments(List.of(Sentiment.readFirstSentimentFromMongo(sentimentDocs))); diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/NamedEntity.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/NamedEntity.java index 0f3ec5d..165df29 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/NamedEntity.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/NamedEntity.java @@ -1,12 +1,14 @@ package org.texttechnologylab.project.gruppe_05_1.domain.nlp; +import org.bson.Document; + +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.StringJoiner; public class NamedEntity { String type; // PER, LOC etc. - // int begin; // TODO: momentan nicht in MongoDB - // int end; // TODO: momentan nicht in MongoDB String text; public NamedEntity() { @@ -52,4 +54,15 @@ public class NamedEntity { .add("text='" + text + "'") .toString(); } + + public static List readNamedEntitiesFromMongo(List nadocs) { + List nes = new ArrayList<>(); + for (Document doc : nadocs) { + nes.add(new NamedEntity( + doc.getString("type"), + doc.getString("text") + )); + } + return nes; + } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/nlp/NlpUtils.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/nlp/NlpUtils.java index e01e647..32f842e 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/nlp/NlpUtils.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/nlp/NlpUtils.java @@ -360,8 +360,8 @@ public class NlpUtils { bulkOperations.add(new UpdateOneModel<>(updateFilter, update)); } if (!bulkOperations.isEmpty()) { - System.out.println("Processing of " + bulkOperations.size() + " documents finished"); - System.out.println("uploading..."); + Logger.debug("Processing of " + bulkOperations.size() + " documents finished"); + Logger.debug("uploading..."); mongoDBHandler.bulkWriteNlpData(bulkOperations); Logger.debug("Bulk write completed for " + bulkOperations.size() + " documents."); mongoDBHandler.close(); diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java index c72570d..4593a8d 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java @@ -184,12 +184,12 @@ public class FrontEndController { .map(entry -> new Token(entry.getKey(), String.valueOf(entry.getValue()), "")) // Lemma remains empty .collect(Collectors.toList()); - System.out.println("DEBUG: Sending POS List to NLP - " + posList); + Logger.debug("Sending POS List to NLP - " + posList); speech.getNlp().setPosList((List) posList); } else { - System.out.println("DEBUG: POS List is EMPTY"); + Logger.debug("POS List is EMPTY"); speech.getNlp().setPosList((List) new ArrayList()); // Ensure it's never null } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java index 9a6e689..032561d 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java @@ -72,44 +72,59 @@ public class SpeechController { Map attributes = new HashMap<>(); HtmlSpeech speech = MongoPprUtils.getSpeechByKey(redeId); + if (speech == null) { + attributes.put("error", "Rede " + redeId + " nicht vorhanden"); + ctx.render("speech.ftl", attributes); + return; + } attributes.put("s", speech); // Foto des Abgeordnetes String picture = MongoPprUtils.getParlamentarierPictureByID(parlamentarierId); attributes.put("picture", picture); - // NLP: Topic - if ((speech.getNlp() != null) && (speech.getNlp().getTopics() != null)) { - Map topics = Topic.condenseTopicInformation(speech.getNlp().getTopics()); // Daten "verdichten"... - // ... und ersetzen - speech.getNlp().setTopics( - topics.entrySet().stream() - .map(me -> new Topic(me.getKey(), me.getValue(), null)) - .collect(Collectors.toList())); + // NLP + if (speech.getNlp() != null) { + + // NLP: Topic + if ((speech.getNlp().getTopics() != null) && (speech.getNlp().getTopics().size() > 0)) { + Map topics = Topic.condenseTopicInformation(speech.getNlp().getTopics()); // Daten "verdichten"... + // ... und ersetzen + speech.getNlp().setTopics( + topics.entrySet().stream() + .map(me -> new Topic(me.getKey(), me.getValue(), null)) + .collect(Collectors.toList())); + } else { + speech.getNlp().setTopics(null); + } + + // NLP: POS + if (speech.getNlp().getTokens() != null) { + List tokens = speech.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()); + + Logger.debug("Sending POS List to NLP - " + posList); + + speech.getNlp().setPosList((List) posList); + + } else { + Logger.debug("POS List is EMPTY"); + speech.getNlp().setPosList((List) new ArrayList()); // Ensure it's never null + } + + // TODO: Token wird momentan etwas komisch abgespeichert, da im Attribut text die POS art steht, und in pos die Anzahl dieser POS arten. Umstrukturieren damit keine Verwirrung herrscht + + // NLP: Sentiments + if (speech.getNlp().getSentiments() != null) { + + } } - // NLP: POS - if (speech.getNlp() != null && speech.getNlp().getTokens() != null) { - List tokens = speech.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()); - - System.out.println("DEBUG: Sending POS List to NLP - " + posList); - - speech.getNlp().setPosList((List) posList); - - } else { - System.out.println("DEBUG: POS List is EMPTY"); - speech.getNlp().setPosList((List) new ArrayList()); // Ensure it's never null - } - - // TODO: Token wird momentan etwas komisch abgespeichert, da im Attribut text die POS art steht, und in pos die Anzahl dieser POS arten. Umstrukturieren damit keine Verwirrung herrscht - - ctx.render("speech.ftl", attributes); } diff --git a/src/main/resources/static/index.css b/src/main/resources/static/index.css index 7b4108d..94d0436 100644 --- a/src/main/resources/static/index.css +++ b/src/main/resources/static/index.css @@ -82,7 +82,14 @@ body { main { width: 80%; + flex: 1 +} + +.centered-content { + display: flex; justify-content: center; + align-items: center; + padding: 0 auto; } /* Heading Styling */ @@ -227,6 +234,18 @@ tbody tr:hover { text-align: center; } +.sentiment-positive { + color: green; +} + +.sentiment-negative { + color: red; +} + +.sentiment-neutral { + color: grey; +} + .back-link { position: fixed; bottom: 50px; diff --git a/src/main/resources/templates/speech.ftl b/src/main/resources/templates/speech.ftl index 0fd7304..fb17b71 100644 --- a/src/main/resources/templates/speech.ftl +++ b/src/main/resources/templates/speech.ftl @@ -4,7 +4,13 @@ - Rede von ${s.speakerName} <#if s.fraction??> (${s.fraction}) </#if> + + <#if s??> + Rede von ${s.speakerName} <#if s.fraction??> (${s.fraction}) </#if> + <#else> + Fehler + </#if> +