From e65abe88bcd0da42c821ab369a94e7981d8592fb Mon Sep 17 00:00:00 2001 From: vysitor Date: Thu, 20 Mar 2025 15:30:43 +0100 Subject: [PATCH] Work on Sentiment, Bug with empty topic list fixed --- .../gruppe_05_1/domain/html/HtmlSpeech.java | 2 + .../gruppe_05_1/domain/nlp/Sentiment.java | 25 +++++++ .../gruppe_05_1/rest/SpeechController.java | 70 +++++++++++-------- src/main/resources/templates/nlp.ftl | 4 +- 4 files changed, 70 insertions(+), 31 deletions(-) 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 c002048..dfc795d 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 @@ -4,6 +4,7 @@ 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.speech.SpeechMetaData; @@ -70,6 +71,7 @@ public class HtmlSpeech { List namedEntitiesDocs = nlpDoc.get("namedEntities", MongoDBHandler.DOC_LIST_CLASS); List sentimentsDocs = nlpDoc.get("sentiments", MongoDBHandler.DOC_LIST_CLASS); + nlp.setSentiments(Sentiment.readSentimentsFromMongo(sentimentsDocs)); List topicsDocs = nlpDoc.get("topics", MongoDBHandler.DOC_LIST_CLASS); nlp.setTopics(Topic.readTopicsFromMongo(topicsDocs)); diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/Sentiment.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/Sentiment.java index a2f04e3..ce29182 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/Sentiment.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/nlp/Sentiment.java @@ -1,5 +1,9 @@ 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; @@ -94,4 +98,25 @@ public class Sentiment { .add("positive=" + positive) .toString(); } + + /** + * + * @param sentimentDocs Die Sentiment-Dokumente (Speech --> analysisResults --> sentiment) aus der MongoDB lesen. + * Das erste Dokument ist für die gesamte Rede, Sentiments 1..n entsprechen Sentences 0..n-1 + * @return + */ + public static List readSentimentsFromMongo(List sentimentDocs) { + List sentiments = new ArrayList<>(); + for (Document doc : sentimentDocs) { + sentiments.add(new Sentiment( + doc.getInteger("begin"), + doc.getInteger("end"), + doc.getDouble("score"), + doc.getDouble("pos"), + doc.getDouble("neu"), + doc.getDouble("neg") + )); + } + return sentiments; + } } 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 94a326f..16d9856 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 @@ -78,38 +78,48 @@ public class SpeechController { 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()); - - 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 - - ctx.render("speech.ftl", attributes); } diff --git a/src/main/resources/templates/nlp.ftl b/src/main/resources/templates/nlp.ftl index 4dfeb43..e37399b 100644 --- a/src/main/resources/templates/nlp.ftl +++ b/src/main/resources/templates/nlp.ftl @@ -17,7 +17,9 @@ <#if s.nlp.sentiments??>

SentimentsInformation (als Radar Chart)

- <#assign overallSentiment = s.nlp.overallSentiment> + <#if s.nlp.overallSentiment??> + <#assign overallSentiment = s.nlp.overallSentiment> + <#assign sentiments = s.nlp.sentiments> <#include "sentimentsRadarChart.ftl"> <#else>