CoreNLPMyersBriggsScores.java
/*******************************************************************************
* Copyright (C) 2020 Ram Sadasiv
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package io.outofprintmagazine.corpus.batch.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Iterator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.outofprintmagazine.corpus.batch.CorpusBatchStep;
import io.outofprintmagazine.corpus.batch.ICorpusBatchStep;
public class CoreNLPMyersBriggsScores extends CorpusBatchStep implements ICorpusBatchStep {
private static final Logger logger = LogManager.getLogger(CoreNLPMyersBriggsScores.class);
@SuppressWarnings("unused")
private Logger getLogger() {
return logger;
}
public CoreNLPMyersBriggsScores() {
super();
}
@Override
public ArrayNode runOne(ObjectNode input) throws Exception {
ArrayNode retval = getMapper().createArrayNode();
ObjectNode outputStepItem = copyInputToOutput(input);
ObjectNode documentScores = (ObjectNode) getJsonNodeFromStorage(input, "oopNLPStorage");
ObjectNode corpusMyersBriggsScores = (ObjectNode) getJsonNodeFromStorage(input, "oopNLPCorpusMyersBriggsAggregateScoresStorage");
ObjectNode documentMyersBriggsScores = getMapper().createObjectNode();
calculateMyersBriggsScores(corpusMyersBriggsScores, documentScores, documentMyersBriggsScores);
outputStepItem.put(
"oopNLPMyersBriggsScoresStorage",
getStorage().storeScratchFileObject(
getData().getCorpusId(),
getOutputScratchFilePath("MyersBriggsScores_" + getDocID(input), "json"),
documentMyersBriggsScores
)
);
retval.add(outputStepItem);
return retval;
}
protected void calculateMyersBriggsScores(ObjectNode corpusMyersBriggsScores, ObjectNode documentScores, ObjectNode documentMyersBriggsScores) {
ObjectNode documentMyersBriggsScoresDocumentNode = documentMyersBriggsScores.putObject("OOPMyersBriggsAnnotation");
ObjectNode documentMyersBriggsScoresActorsNode = documentMyersBriggsScores.putObject("OOPActorsAnnotation");
BigDecimal tokenCount = new BigDecimal(documentScores.get("OOPWordCountAnnotation").asInt());
Iterator<String> corpusSubscoreNameIter = corpusMyersBriggsScores.fieldNames();
while (corpusSubscoreNameIter.hasNext()) {
String subscoreName = corpusSubscoreNameIter.next();
BigDecimal documentSubscoreScore = new BigDecimal(0);
BigDecimal corpusSubscoreScore = new BigDecimal(corpusMyersBriggsScores.get(subscoreName).asText());
//TODO - this is always zero
if (documentScores.get("OOPMyersBriggsAnnotation").has(subscoreName)) {
documentSubscoreScore = new BigDecimal(documentScores.get("OOPMyersBriggsAnnotation").get(subscoreName).asText()).divide(tokenCount, 10, RoundingMode.HALF_DOWN);
}
documentMyersBriggsScoresDocumentNode.put(subscoreName, documentSubscoreScore.divide(corpusSubscoreScore, 10, RoundingMode.HALF_DOWN));
Iterator<String> actorNameIter = documentScores.get("OOPActorsAnnotation").fieldNames();
while (actorNameIter.hasNext()) {
String actorName = actorNameIter.next();
if (! documentMyersBriggsScoresActorsNode.has(actorName)) {
documentMyersBriggsScoresActorsNode.putObject(actorName).putObject("oopmyersBriggs");
}
BigDecimal actorSubscoreScore = new BigDecimal(0);
if (documentScores.get("OOPActorsAnnotation").get(actorName).get("oopmyersBriggs").has(subscoreName)) {
actorSubscoreScore = new BigDecimal(documentScores.get("OOPActorsAnnotation").get(actorName).get("oopmyersBriggs").get(subscoreName).asText()).divide(tokenCount, 10, RoundingMode.HALF_DOWN);
}
((ObjectNode) documentMyersBriggsScoresActorsNode.get(actorName).get("oopmyersBriggs")).put(subscoreName, actorSubscoreScore.divide(corpusSubscoreScore, 10, RoundingMode.HALF_DOWN));
}
}
}
}