diff --git a/api/src/main/java/com/o3/storyinspector/api/BlockApi.java b/api/src/main/java/com/o3/storyinspector/api/BlockApi.java index 3d157fa..fbe4d1f 100644 --- a/api/src/main/java/com/o3/storyinspector/api/BlockApi.java +++ b/api/src/main/java/com/o3/storyinspector/api/BlockApi.java @@ -1,14 +1,9 @@ package com.o3.storyinspector.api; -import com.o3.storyinspector.annotation.blocks.SentenceSplitter; -import com.o3.storyinspector.annotation.readability.FleschKincaidReadabilityInspector; -import com.o3.storyinspector.annotation.wordcount.WordCountInspector; import com.o3.storyinspector.api.user.GoogleId; import com.o3.storyinspector.api.user.UserInfo; import com.o3.storyinspector.db.BookDAO; -import com.o3.storyinspector.domain.Block; import com.o3.storyinspector.domain.Blocks; -import com.o3.storyinspector.domain.Sentence; import com.o3.storyinspector.storydom.Book; import com.o3.storyinspector.storydom.io.XmlReader; import org.slf4j.Logger; @@ -18,8 +13,6 @@ import org.springframework.web.bind.annotation.*; import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; @RestController @RequestMapping("/api/blocks") @@ -40,25 +33,10 @@ public Blocks findAllByBook(@PathVariable final Long bookId, @RequestParam("id_t final UserInfo user = userValidator.retrieveUserInfo(idToken); final BookDAO bookDAO = BookDAO.findByBookId(bookId, db); if (!user.isAdmin()) user.emailMatches(bookDAO.getUserEmail()); - final List blockList = new ArrayList<>(); try { final String annotatedStoryDom = bookDAO.getAnnotatedStoryDom(); final Book book = XmlReader.readBookFromXmlStream(new StringReader(annotatedStoryDom)); - Integer chapterId = 1; - Integer blockId = 1; - for (final com.o3.storyinspector.storydom.Chapter chapter : book.getChapters()) { - final String chapterTitle = "Chapter #" + chapterId++ + " " + chapter.getTitle(); - for (final com.o3.storyinspector.storydom.Block domBlock : chapter.getBlocks()) { - final List sentences = new ArrayList<>(); - for (final String sentenceText : SentenceSplitter.splitSentences(domBlock)) { - final int wordCount = WordCountInspector.inspectWordCount(sentenceText); - double fkGradeLevel = FleschKincaidReadabilityInspector.inspectFKGradeLevel(sentenceText); - sentences.add(new Sentence(sentenceText, fkGradeLevel, wordCount)); - } - blockList.add(new Block(blockId++, domBlock, chapterTitle, sentences)); - } - } - return new Blocks(bookDAO.getTitle(), bookDAO.getAuthor(), blockList); + return Blocks.buildBlocks(book, bookDAO.getTitle(), bookDAO.getAuthor()); } catch (final Exception e) { final String errMsg = "Unexpected error when listing book blocks. Book bookId: " + bookId + ", Exception: " + e.getLocalizedMessage(); @@ -68,4 +46,5 @@ public Blocks findAllByBook(@PathVariable final Long bookId, @RequestParam("id_t } } + } diff --git a/api/src/main/java/com/o3/storyinspector/api/ChartApi.java b/api/src/main/java/com/o3/storyinspector/api/ChartApi.java index d662f2b..e1c6983 100644 --- a/api/src/main/java/com/o3/storyinspector/api/ChartApi.java +++ b/api/src/main/java/com/o3/storyinspector/api/ChartApi.java @@ -4,24 +4,13 @@ import com.o3.storyinspector.api.user.UserInfo; import com.o3.storyinspector.db.BookDAO; import com.o3.storyinspector.domain.Chart; -import com.o3.storyinspector.storydom.Block; -import com.o3.storyinspector.storydom.Book; -import com.o3.storyinspector.storydom.Chapter; -import com.o3.storyinspector.storydom.Emotion; import com.o3.storyinspector.storydom.constants.EmotionType; -import com.o3.storyinspector.storydom.io.XmlReader; -import com.o3.storyinspector.storydom.util.StoryDomUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.*; -import javax.xml.bind.JAXBException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; - @RestController @RequestMapping("/api/charts") @CrossOrigin(origins = "*", allowedHeaders = "*") @@ -43,7 +32,7 @@ public Chart one(@PathVariable final Long id, @RequestParam("id_token") final St if (!user.isAdmin()) user.emailMatches(bookDAO.getUserEmail()); final Chart chart; try { - chart = buildSentimentChartFromBook(bookDAO); + chart = Chart.buildSentimentChartFromBook(bookDAO.asBook()); } catch (Exception e) { final String errMsg = "Unexpected error when building posneg chart. Book id: " + id + "Exception: " + e.getLocalizedMessage(); @@ -63,7 +52,7 @@ public Chart one(@PathVariable final Long id, @PathVariable final String emotion final Chart chart; try { final EmotionType emotionType = EmotionType.emotionTypeFor(emotionName); - chart = buildEmotionChartFromBook(bookDAO, emotionType); + chart = Chart.buildEmotionChartFromBook(bookDAO.asBook(), emotionType); } catch (Exception e) { final String errMsg = "Unexpected error when building emotion chart. Book id: " + id + " ,emotion:" + emotionName + " Exception: " + e.getLocalizedMessage(); @@ -75,51 +64,4 @@ public Chart one(@PathVariable final Long id, @PathVariable final String emotion return chart; } - private static Chart buildSentimentChartFromBook(final BookDAO bookDAO) throws JAXBException { - final String annotatedStoryDom = bookDAO.getAnnotatedStoryDom(); - final Book book = XmlReader.readBookFromXmlStream(new StringReader(annotatedStoryDom)); - final List labels = new ArrayList<>(); - final List blocks = new ArrayList<>(); - final List scores = new ArrayList<>(); - final List chapterDividers = new ArrayList<>(); - int counter = 0; - for (final Chapter chapter : book.getChapters()) { - for (final Block block : chapter.getBlocks()) { - counter++; - final double sentimentScore = block.getSentimentScore().doubleValue(); - labels.add("#" + counter); - blocks.add(block.getBody()); - scores.add(sentimentScore); - } - chapterDividers.add(counter); - } - chapterDividers.remove(chapterDividers.size()-1); // remove last marker - return new Chart(bookDAO.getTitle(), bookDAO.getAuthor(), labels, blocks, scores, chapterDividers); - } - - private static Chart buildEmotionChartFromBook(final BookDAO bookDAO, final EmotionType emotionType) throws JAXBException { - final double maxEmotionScore = StoryDomUtils.getMaxEmotionScore(bookDAO.asBook()); - final String annotatedStoryDom = bookDAO.getAnnotatedStoryDom(); - final Book book = XmlReader.readBookFromXmlStream(new StringReader(annotatedStoryDom)); - final List labels = new ArrayList<>(); - final List blocks = new ArrayList<>(); - final List scores = new ArrayList<>(); - final List chapterDividers = new ArrayList<>(); - int counter = 0; - for (final Chapter chapter : book.getChapters()) { - for (final Block block : chapter.getBlocks()) { - counter++; - final Emotion emotion = StoryDomUtils.findEmotion(emotionType, block.getEmotions()); - final double emotionScore = emotion.getScore().doubleValue(); - final double normalizedEmotionScore = emotionScore / maxEmotionScore; - labels.add("#" + counter); - blocks.add(block.getBody()); - scores.add(normalizedEmotionScore); - } - chapterDividers.add(counter); - } - chapterDividers.remove(chapterDividers.size()-1); // remove last marker - return new Chart(bookDAO.getTitle(), bookDAO.getAuthor(), labels, blocks, scores, chapterDividers); - } - } diff --git a/api/src/main/java/com/o3/storyinspector/domain/Blocks.java b/api/src/main/java/com/o3/storyinspector/domain/Blocks.java index bbfb68c..d269869 100644 --- a/api/src/main/java/com/o3/storyinspector/domain/Blocks.java +++ b/api/src/main/java/com/o3/storyinspector/domain/Blocks.java @@ -1,5 +1,11 @@ package com.o3.storyinspector.domain; +import com.o3.storyinspector.annotation.blocks.SentenceSplitter; +import com.o3.storyinspector.annotation.readability.FleschKincaidReadabilityInspector; +import com.o3.storyinspector.annotation.wordcount.WordCountInspector; +import com.o3.storyinspector.storydom.Book; + +import java.util.ArrayList; import java.util.List; public class Blocks { @@ -25,4 +31,24 @@ public String getBookAuthor() { public List getBlocks() { return blocks; } + + public static Blocks buildBlocks(final Book book, final String bookTitle, final String author) { + final List blockList = new ArrayList<>(); + int chapterId = 1; + int blockId = 1; + for (final com.o3.storyinspector.storydom.Chapter chapter : book.getChapters()) { + final String chapterTitle = "Chapter #" + chapterId++ + " " + chapter.getTitle(); + for (final com.o3.storyinspector.storydom.Block domBlock : chapter.getBlocks()) { + final List sentences = new ArrayList<>(); + for (final String sentenceText : SentenceSplitter.splitSentences(domBlock)) { + final int wordCount = WordCountInspector.inspectWordCount(sentenceText); + double fkGradeLevel = FleschKincaidReadabilityInspector.inspectFKGradeLevel(sentenceText); + sentences.add(new Sentence(sentenceText, fkGradeLevel, wordCount)); + } + blockList.add(new Block(blockId++, domBlock, chapterTitle, sentences)); + } + } + return new Blocks(bookTitle, author, blockList); + } + } diff --git a/api/src/main/java/com/o3/storyinspector/domain/Chart.java b/api/src/main/java/com/o3/storyinspector/domain/Chart.java index 8ff62bf..78861c4 100644 --- a/api/src/main/java/com/o3/storyinspector/domain/Chart.java +++ b/api/src/main/java/com/o3/storyinspector/domain/Chart.java @@ -7,6 +7,8 @@ import com.o3.storyinspector.storydom.constants.EmotionType; import com.o3.storyinspector.storydom.util.StoryDomUtils; +import javax.xml.bind.JAXBException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -78,4 +80,48 @@ public static Map getEmotionScores(final Book book, final Emoti return scoresByBlock; } + public static Chart buildSentimentChartFromBook(final Book book) { + final List labels = new ArrayList<>(); + final List blocks = new ArrayList<>(); + final List scores = new ArrayList<>(); + final List chapterDividers = new ArrayList<>(); + int counter = 0; + for (final Chapter chapter : book.getChapters()) { + for (final Block block : chapter.getBlocks()) { + counter++; + final double sentimentScore = block.getSentimentScore().doubleValue(); + labels.add("#" + counter); + blocks.add(block.getBody()); + scores.add(sentimentScore); + } + chapterDividers.add(counter); + } + chapterDividers.remove(chapterDividers.size()-1); // remove last marker + return new Chart(book.getTitle(), book.getAuthor(), labels, blocks, scores, chapterDividers); + } + + public static Chart buildEmotionChartFromBook(final Book book, final EmotionType emotionType) throws JAXBException { + final double maxEmotionScore = StoryDomUtils.getMaxEmotionScore(book); + final List labels = new ArrayList<>(); + final List blocks = new ArrayList<>(); + final List scores = new ArrayList<>(); + final List chapterDividers = new ArrayList<>(); + int counter = 0; + for (final Chapter chapter : book.getChapters()) { + for (final Block block : chapter.getBlocks()) { + counter++; + final Emotion emotion = StoryDomUtils.findEmotion(emotionType, block.getEmotions()); + final double emotionScore = emotion.getScore().doubleValue(); + final double normalizedEmotionScore = emotionScore / maxEmotionScore; + labels.add("#" + counter); + blocks.add(block.getBody()); + scores.add(normalizedEmotionScore); + } + chapterDividers.add(counter); + } + chapterDividers.remove(chapterDividers.size()-1); // remove last marker + return new Chart(book.getTitle(), book.getAuthor(), labels, blocks, scores, chapterDividers); + } + + } diff --git a/app-gui/installer/inno.iss b/app-gui/installer/inno.iss new file mode 100644 index 0000000..eaaf7ae --- /dev/null +++ b/app-gui/installer/inno.iss @@ -0,0 +1,51 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "Story Inspector" +#define MyAppVersion "Alpha" +#define MyAppPublisher "Story Inspector" +#define MyAppURL "https://www.storyinspector.com/" +#define MyAppExeName "StoryInspector.exe" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{009B36E9-CAA2-468B-BE4B-30E189361374} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\StoryInspector +DisableDirPage=no +DisableProgramGroupPage=yes +; Remove the following line to run in administrative install mode (install for all users.) +PrivilegesRequired=lowest +OutputDir=C:\Users\tdper\OneDrive\Desktop +OutputBaseFilename=StoryInspector-installer-win-amd64 +SetupIconFile=C:\Dev\story-inspector\app-gui\src\main\resources\install.ico +Compression=lzma +SolidCompression=yes +WizardStyle=modern + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "C:\Dev\story-inspector\app-gui\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Dev\story-inspector\app-gui\JRE\*"; DestDir: "{app}\JRE"; Flags: recursesubdirs createallsubdirs +Source: "C:\Dev\story-inspector\app-gui\A._Conan_Doyle-A_Study_in_Scarlett.storydom"; DestDir: "{app}"; Flags: onlyifdoesntexist +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + diff --git a/app-gui/installer/launch4j.xml b/app-gui/installer/launch4j.xml new file mode 100644 index 0000000..e07cd3e --- /dev/null +++ b/app-gui/installer/launch4j.xml @@ -0,0 +1,32 @@ + + + false + gui + C:\Dev\story-inspector\app-gui\target\app-gui-1.0-SNAPSHOT.jar + StoryInspector.exe + + + . + normal + http://java.com/download + + true + true + + C:\Dev\story-inspector\app-gui\src\main\resources\logo_Ckp_icon.ico + + StoryInspector-Token + Story Inspector + + + JRE + true + false + + + preferJre + 64/32 + 2048 + 9216 + + \ No newline at end of file diff --git a/app-gui/pom.xml b/app-gui/pom.xml new file mode 100644 index 0000000..8093600 --- /dev/null +++ b/app-gui/pom.xml @@ -0,0 +1,100 @@ + + + story-inspector + com.o3.storyinspector + 1.0-SNAPSHOT + + 4.0.0 + app-gui + + UTF-8 + 11 + 11 + + + + com.o3.storyinspector + story-dom + 1.0-SNAPSHOT + + + com.o3.storyinspector + book-importer + 1.0-SNAPSHOT + + + com.o3.storyinspector + annotation-engine + 1.0-SNAPSHOT + + + + + org.openjfx + javafx-controls + 11.0.2 + + + org.openjfx + javafx-web + 11.0.2 + + + org.controlsfx + controlsfx + 11.1.0 + + + org.springframework + spring-core + 5.2.9.RELEASE + + + + org.slf4j + slf4j-api + 1.7.5 + + + org.slf4j + slf4j-simple + 1.7.5 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 11 + + + + org.openjfx + javafx-maven-plugin + 0.0.3 + + com.o3.storyinspector.gui.StoryInspectorGui + + + + org.springframework.boot + spring-boot-maven-plugin + 2.4.0 + + com.o3.storyinspector.gui.StoryInspectorGui + + + + + repackage + + + + + + + \ No newline at end of file diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/StoryInspectorGui.java b/app-gui/src/main/java/com/o3/storyinspector/gui/StoryInspectorGui.java new file mode 100644 index 0000000..d1b33df --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/StoryInspectorGui.java @@ -0,0 +1,107 @@ +package com.o3.storyinspector.gui; + +import com.o3.storyinspector.gui.addbook.AddBookWizard; +import com.o3.storyinspector.gui.booktree.BookTree; +import com.o3.storyinspector.gui.reportarea.ReportTabPane; +import com.o3.storyinspector.gui.skin.Styles; +import com.o3.storyinspector.gui.status.StoryInspectorStatusBar; +import com.o3.storyinspector.gui.utils.I18N; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.scene.Scene; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuBar; +import javafx.scene.control.MenuItem; +import javafx.scene.control.TreeView; +import javafx.scene.image.Image; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import org.controlsfx.control.StatusBar; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; + +import java.io.IOException; +import java.net.URL; + +/** + * Main StoryInspector GUI application + */ +public class StoryInspectorGui extends Application { + + static final Logger LOGGER = LoggerFactory.getLogger(StoryInspectorGui.class); + + static String STORY_INSPECTOR_TITLE = "storyInspectorTitle"; + static String BOOK_MENU = "bookMenu"; + static String BOOK_MENU_QUIT = "bookMenuQuit"; + static String BOOK_MENU_ADD = "bookMenuAdd"; + + static String ICON_FILENAME = "/logo.png"; + + Stage window; + MenuBar menu; + TreeView bookTree; + ReportTabPane reportArea; + StatusBar statusBar; + + @Override + public void start(final Stage window) throws Exception { + LOGGER.info("Initializing application"); + + // init + this.window = window; + this.menu = new MenuBar(); + LOGGER.info("Initializing book tree..."); + this.bookTree = new BookTree(); + this.reportArea = new ReportTabPane(); + this.statusBar = new StoryInspectorStatusBar(); + + // menus + final Menu bookMenu = new Menu(I18N.stringFor(BOOK_MENU)); + final MenuItem bookMenuAdd = new MenuItem(I18N.stringFor(BOOK_MENU_ADD)); + bookMenuAdd.setOnAction(e -> AddBookWizard.addNewBook(window)); + final MenuItem bookMenuQuit = new MenuItem(I18N.stringFor(BOOK_MENU_QUIT)); + bookMenuQuit.setOnAction(e -> quit()); + bookMenu.getItems().addAll(bookMenuAdd, bookMenuQuit); + menu.getMenus().add(bookMenu); + + // layout + final BorderPane mainWindowLayout = new BorderPane(); + mainWindowLayout.setTop(menu); + mainWindowLayout.setLeft(bookTree); + mainWindowLayout.setCenter(reportArea); + mainWindowLayout.setBottom(statusBar); + + // window + window.setOnCloseRequest(e -> quit()); + window.getIcons().add(new Image(getClass().getResourceAsStream(ICON_FILENAME))); + + final Scene mainScene = new Scene(mainWindowLayout); + window.setTitle(I18N.stringFor(STORY_INSPECTOR_TITLE)); + mainScene.getStylesheets().add(getResourceURL(Styles.STORY_INSPECTOR_CSS).toExternalForm()); + window.setMinWidth(900); + window.setScene(mainScene); + window.show(); + } + +// private void testResourceFile(String path) throws IOException { +// File resource = new ClassPathResource(path).getFile(); +// String text = new String(Files.readAllBytes(resource.toPath())); +// LOGGER.info("resource: " + text); +// } + + private URL getResourceURL(final String path) throws IOException{ + return (new ClassPathResource(path)).getURL(); + } + + private void quit() { + LOGGER.info("Quitting application"); + window.close(); + Platform.exit(); + } + + public static void main(final String[] args) { + launch(); + } + +} \ No newline at end of file diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/AddBookWizard.java b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/AddBookWizard.java new file mode 100644 index 0000000..216bf5f --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/AddBookWizard.java @@ -0,0 +1,62 @@ +package com.o3.storyinspector.gui.addbook; + +import com.o3.storyinspector.gui.processbook.AnnotateBookGuiTask; +import com.o3.storyinspector.gui.processbook.StorydomData; +import com.o3.storyinspector.gui.utils.I18N; +import javafx.scene.control.ButtonType; +import javafx.stage.Stage; +import org.controlsfx.dialog.Wizard; + +import java.io.File; + +public class AddBookWizard { + + public static String PROP_BOOK_TITLE = "PROP_BOOK_TITLE"; + public static String PROP_BOOK_AUTHOR = "PROP_BOOK_AUTHOR"; + public static String PROP_SELECTED_FILE = "PROP_SELECTED_FILE"; + + static String ADD_BOOK_WIZ_TITLE = "addBookWizTitle"; + + Wizard wizard; + StepDisclaimer page1; + StepBookProperties page2; + StepBookStructure page3; + StepSummary page4; + + + public static void addNewBook(final Stage window) { + AddBookWizard addBookWizard = new AddBookWizard(window); + addBookWizard.showAndWait(); + } + + public AddBookWizard(final Stage window) { + wizard = new Wizard(); + wizard.setTitle(I18N.stringFor(ADD_BOOK_WIZ_TITLE)); + + page1 = new StepDisclaimer(wizard); + page2 = new StepBookProperties(wizard, window); + page3 = new StepBookStructure(wizard); + page4 = new StepSummary(wizard); + + wizard.setFlow(new Wizard.LinearFlow(page1, page2, page3, page4)); + } + + + public void showAndWait() { + // show wizard and wait for response + wizard.showAndWait().ifPresent(result -> { + if (result == ButtonType.FINISH) { + System.out.println("Wizard finished, settings: " + wizard.getSettings()); + + // trigger annotate book task + final String filePath = ((File) wizard.getProperties().get(PROP_SELECTED_FILE)).getAbsolutePath(); + final StorydomData storydomData = new StorydomData((String)wizard.getProperties().get(PROP_BOOK_TITLE), + (String)wizard.getProperties().get(PROP_BOOK_AUTHOR), + filePath); + AnnotateBookGuiTask.annotateStoryDom(storydomData); + } + }); + } + + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepBookProperties.java b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepBookProperties.java new file mode 100644 index 0000000..873e544 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepBookProperties.java @@ -0,0 +1,106 @@ +package com.o3.storyinspector.gui.addbook; + +import com.o3.storyinspector.gui.utils.I18N; +import com.o3.storyinspector.gui.utils.StringUtils; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import org.controlsfx.control.textfield.TextFields; +import org.controlsfx.dialog.Wizard; +import org.controlsfx.dialog.WizardPane; + +import java.io.File; + +public class StepBookProperties extends WizardPane { + + static String BOOK_PROPS_TITLE = "bookPropsTitle"; + static String BOOK_PROPS_AUTHOR = "bookPropsAuthor"; + static String BOOK_PROPS_FILE = "bookPropsFile"; + static String BOOK_PROPS_FILE_BTN = "bookPropsFileBtn"; + + TextField titleField; + TextField authorField; + File selectedFile; + String selectedFileName = ""; + + public StepBookProperties(final Wizard wizard, final Stage window) { + // grid pane + final GridPane bookInfoForm = new GridPane(); + bookInfoForm.setAlignment(Pos.CENTER); + bookInfoForm.setHgap(10); + bookInfoForm.setVgap(10); + bookInfoForm.setPadding(new Insets(25, 25, 25, 25)); + + // title field + final Label titleLabel = new Label(I18N.stringFor(BOOK_PROPS_TITLE)); + bookInfoForm.add(titleLabel, 0, 1); + titleField = TextFields.createClearableTextField(); + titleField.setOnKeyTyped(e -> { + wizard.getProperties().put(AddBookWizard.PROP_BOOK_TITLE, titleField.getText()); + refreshWizardValidity(wizard); + }); + bookInfoForm.add(titleField, 1, 1); + + // author field + final Label authorLabel = new Label(I18N.stringFor(BOOK_PROPS_AUTHOR)); + bookInfoForm.add(authorLabel, 0, 2); + authorField = TextFields.createClearableTextField(); + authorField.setOnKeyTyped(e -> { + wizard.getProperties().put(AddBookWizard.PROP_BOOK_AUTHOR, authorField.getText()); + refreshWizardValidity(wizard); + }); + bookInfoForm.add(authorField, 1, 2); + + // file field + final Label fileLabel = new Label(I18N.stringFor(BOOK_PROPS_FILE)); + bookInfoForm.add(fileLabel, 0, 3); + final FileChooser fileChooser = new FileChooser(); + final TextField selectedFileField = new TextField(selectedFileName); + selectedFileField.setDisable(true); + final Button selectFileButton = new Button(I18N.stringFor(BOOK_PROPS_FILE_BTN)); + selectFileButton.setOnAction(e -> { + selectedFile = fileChooser.showOpenDialog(window); + if (selectedFile != null) { + selectedFileName = selectedFile.getName(); + selectedFileField.setText(selectedFileName); + wizard.getProperties().put(AddBookWizard.PROP_SELECTED_FILE, selectedFile); + refreshWizardValidity(wizard); + } + }); + final HBox innerHBox = new HBox(); + innerHBox.getChildren().addAll(selectedFileField, selectFileButton); + bookInfoForm.add(innerHBox, 1, 3); + + // default contents + titleField.setText("Title"); + wizard.getProperties().put(AddBookWizard.PROP_BOOK_TITLE, titleField.getText()); + authorField.setText("Author"); + wizard.getProperties().put(AddBookWizard.PROP_BOOK_AUTHOR, authorField.getText()); + // FIXME: temporary value + fileChooser.setInitialDirectory(new File("C:\\Users\\tdper\\OneDrive")); + + this.setContent(bookInfoForm); + } + + @Override + public void onEnteringPage(Wizard wizard) { + refreshWizardValidity(wizard); + } + + private void refreshWizardValidity(final Wizard wizard) { + wizard.setInvalid(isPageInvalid()); + } + + private boolean isPageInvalid() { + return (StringUtils.isEmpty(titleField.getText()) || + StringUtils.isEmpty(authorField.getText()) || + selectedFile == null); + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepBookStructure.java b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepBookStructure.java new file mode 100644 index 0000000..c4783b1 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepBookStructure.java @@ -0,0 +1,78 @@ +package com.o3.storyinspector.gui.addbook; + +import com.o3.storyinspector.annotation.wordcount.WordCountInspector; +import com.o3.storyinspector.gui.core.BookManager; +import com.o3.storyinspector.gui.utils.I18N; +import com.o3.storyinspector.storydom.Chapter; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.layout.VBox; +import javafx.scene.text.Font; +import javafx.scene.text.FontPosture; +import org.controlsfx.dialog.Wizard; +import org.controlsfx.dialog.WizardPane; + +import java.io.File; +import java.util.List; + +public class StepBookStructure extends WizardPane { + + static String BOOK_STRUCT_CHAPTER_AREA = "bookStructChapterArea"; + static String BOOK_STRUCT_INTRO = "bookStructIntro"; + static String BOOK_STRUCT_CHAPTER_ENTRY = "bookStructChapterEntry"; + static String BOOK_STRUCT_CHECK = "bookStructCheck"; + static String BOOK_STRUCT_END = "bookStructEnd"; + + Label headerLabel; + TextArea bookChapters; + CheckBox bookStructCheck; + + int numOfChapters = 0; + + public StepBookStructure(final Wizard wizard) { + headerLabel = new Label(); + updateHeaderLabel(wizard); + bookChapters = new TextArea(I18N.stringFor(BOOK_STRUCT_CHAPTER_AREA)); + final Label emptyLineLabel1 = new Label("\n"); + bookStructCheck = new CheckBox(I18N.stringFor(BOOK_STRUCT_CHECK)); + bookStructCheck.setOnAction(e -> wizard.setInvalid(!bookStructCheck.isSelected())); + final Label emptyLineLabel2 = new Label("\n"); + final Label trailerLabel = new Label(I18N.stringFor(BOOK_STRUCT_END)); + trailerLabel.setFont(Font.font(Font.getDefault().getFamily(), FontPosture.ITALIC, Font.getDefault().getSize())); + final VBox layout = new VBox(); + layout.getChildren().addAll(headerLabel, bookChapters, emptyLineLabel1, bookStructCheck, emptyLineLabel2, trailerLabel); + this.setContent(layout); + } + + @Override + public void onEnteringPage(Wizard wizard) { + final File bookFile = (File) wizard.getProperties().get(AddBookWizard.PROP_SELECTED_FILE); + bookChapters.setText(getChapterList(bookFile)); + bookChapters.setEditable(false); + + bookStructCheck.setSelected(false); + wizard.setInvalid(true); + + updateHeaderLabel(wizard); + } + + private void updateHeaderLabel(final Wizard wizard) { + final String bookTitle = (String) wizard.getProperties().get(AddBookWizard.PROP_BOOK_TITLE); + final String bookAuthor = (String) wizard.getProperties().get(AddBookWizard.PROP_BOOK_AUTHOR); + headerLabel.setText(String.format(I18N.stringFor(BOOK_STRUCT_INTRO), bookTitle, bookAuthor, numOfChapters)); + } + + private String getChapterList(final File bookFile) { + final StringBuilder chapterListBuilder = new StringBuilder(); + final List chapters = BookManager.readChapterList(bookFile); + int chapterCount = 0; + for (final Chapter chapter : chapters) { + final long chapterWordcount = WordCountInspector.inspectChapterWordCount(chapter); + if (chapterCount > 0) chapterListBuilder.append("\n"); + chapterListBuilder.append(String.format(I18N.stringFor(BOOK_STRUCT_CHAPTER_ENTRY), ++chapterCount, chapter.getTitle(), chapterWordcount)); + } + numOfChapters = chapterCount; + return chapterListBuilder.toString(); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepDisclaimer.java b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepDisclaimer.java new file mode 100644 index 0000000..83e6e10 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepDisclaimer.java @@ -0,0 +1,32 @@ +package com.o3.storyinspector.gui.addbook; + +import com.o3.storyinspector.gui.utils.I18N; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.layout.VBox; +import org.controlsfx.dialog.Wizard; +import org.controlsfx.dialog.WizardPane; + +public class StepDisclaimer extends WizardPane { + + static String ADD_BOOK_WIZ_DISCLAIMER = "addBookWizDisclaimer"; + static String ADD_BOOK_WIZ_DISCLAIMER_CHECK = "addBookWizDisclaimerCheck"; + + CheckBox disclaimerCheckbox; + + public StepDisclaimer(final Wizard wizard) { + final Label disclaimerLabel = new Label(I18N.stringFor(ADD_BOOK_WIZ_DISCLAIMER)); + disclaimerCheckbox = new CheckBox(I18N.stringFor(ADD_BOOK_WIZ_DISCLAIMER_CHECK)); + disclaimerCheckbox.setSelected(false); + disclaimerCheckbox.setOnAction(e -> wizard.setInvalid(!disclaimerCheckbox.isSelected())); + + final VBox layout = new VBox(); + layout.getChildren().addAll(disclaimerLabel, disclaimerCheckbox); + this.setContent(layout); + } + + @Override + public void onEnteringPage(Wizard wizard) { + wizard.setInvalid(!disclaimerCheckbox.isSelected()); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepSummary.java b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepSummary.java new file mode 100644 index 0000000..3052de5 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/addbook/StepSummary.java @@ -0,0 +1,29 @@ +package com.o3.storyinspector.gui.addbook; + +import com.o3.storyinspector.gui.utils.I18N; +import javafx.scene.control.Label; +import javafx.scene.layout.VBox; +import org.controlsfx.dialog.Wizard; +import org.controlsfx.dialog.WizardPane; + +public class StepSummary extends WizardPane { + + static String BOOK_QUEUED_INTRO = "bookQueuedIntro"; + + Label summaryLabel; + + public StepSummary(final Wizard wizard) { + summaryLabel = new Label(I18N.stringFor(BOOK_QUEUED_INTRO)); + + final VBox layout = new VBox(); + layout.getChildren().addAll(summaryLabel); + this.setContent(layout); + } + + @Override + public void onEnteringPage(Wizard wizard) { + final String bookTitle = (String) wizard.getProperties().get(AddBookWizard.PROP_BOOK_TITLE); + final String bookAuthor = (String) wizard.getProperties().get(AddBookWizard.PROP_BOOK_AUTHOR); + summaryLabel.setText(String.format(I18N.stringFor(BOOK_QUEUED_INTRO), bookTitle, bookAuthor)); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/booktree/BookTree.java b/app-gui/src/main/java/com/o3/storyinspector/gui/booktree/BookTree.java new file mode 100644 index 0000000..cfeeaeb --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/booktree/BookTree.java @@ -0,0 +1,112 @@ +package com.o3.storyinspector.gui.booktree; + +import com.o3.storyinspector.gui.core.*; +import com.o3.storyinspector.gui.utils.I18N; +import com.o3.storyinspector.gui.utils.IconUtils; +import com.o3.storyinspector.storydom.Book; +import javafx.event.EventHandler; +import javafx.scene.Node; +import javafx.scene.control.TreeCell; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeView; +import javafx.scene.input.MouseEvent; +import javafx.scene.text.Text; +import org.controlsfx.glyphfont.FontAwesome; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.xml.bind.JAXBException; +import java.io.IOException; +import java.util.List; + +public class BookTree extends TreeView implements BookEventListener { + + static final Logger LOGGER = LoggerFactory.getLogger(BookTree.class); + + static String BOOK_TREE_MY_LIB = "bookTreeMyLibrary"; + static String BOOK_BY = "bookBy"; + + TreeItem rootItem; + + public BookTree() throws IOException, JAXBException { + // root + rootItem = new TreeItem<> (I18N.stringFor(BOOK_TREE_MY_LIB), + IconUtils.getIcon(FontAwesome.Glyph.LIST_UL)); + rootItem.setExpanded(true); + this.setRoot(rootItem); + + // books + final List books = BookManager.getAllBooks(); + for (final Book book : books) { + addBook(book); + } + + // handle clicks + EventHandler mouseEventHandle = (event) -> { + handleMouseClicked(event); + }; + this.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); + + // listen to library changes + BookManager.registerEventListener(this); + } + + private void addBook(final Book book) { + // book + final BookTreeItem bookItem = new BookTreeItem<> ( + BookTreeItem.TYPE_BOOK, + book.getTitle() + " " + I18N.stringFor(BOOK_BY) + " " + book.getAuthor(), + IconUtils.getIcon(FontAwesome.Glyph.BOOK), book); + rootItem.getChildren().add(bookItem); + + // reports + final BookTreeItem reportStructItem = new BookTreeItem<>( + BookTreeItem.TYPE_REPORT_STRUCTURE, "Book Structure Report", + IconUtils.getIcon(FontAwesome.Glyph.TREE), book); + bookItem.getChildren().add(reportStructItem); + final BookTreeItem reportCharacterItem = new BookTreeItem<>( + BookTreeItem.TYPE_REPORT_CHARACTER, "Character Report", + IconUtils.getIcon(FontAwesome.Glyph.USERS), book); + bookItem.getChildren().add(reportCharacterItem); + final BookTreeItem reportEmotionItem = new BookTreeItem<>( + BookTreeItem.TYPE_REPORT_EMOTION, "Emotion Report", + IconUtils.getIcon(FontAwesome.Glyph.HEART), book); + bookItem.getChildren().add(reportEmotionItem); + final BookTreeItem reportReadabilityItem = new BookTreeItem<>( + BookTreeItem.TYPE_REPORT_READABILITY, "Readability Report", + IconUtils.getIcon(FontAwesome.Glyph.PENCIL), book); + bookItem.getChildren().add(reportReadabilityItem); + final BookTreeItem reportSentenceVarietyItem = new BookTreeItem<>( + BookTreeItem.TYPE_REPORT_SENTENCE_VARIETY, "Sentence Variety Report", + IconUtils.getIcon(FontAwesome.Glyph.EDIT), book); + bookItem.getChildren().add(reportSentenceVarietyItem); + } + + @Override + public void handleEvent(BookEvent event) { + if (event.getType() == BookEvent.BOOK_ADDED) { + addBook(event.getBook()); + } + } + + private void handleMouseClicked(MouseEvent event) { + final Node node = event.getPickResult().getIntersectedNode(); + // Accept clicks only on node cells, and not on empty spaces of the TreeView + if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) { + final BookTreeItem clickedItem = (BookTreeItem) this.getSelectionModel().getSelectedItem(); + final String name = (String) clickedItem.getValue(); + LOGGER.info("Node click: " + name); + if (clickedItem.getType() == BookTreeItem.TYPE_REPORT_STRUCTURE) { + ReportManager.fireReportEvent(new ReportEvent(ReportEvent.OPEN_REPORT_BOOK_STRUCTURE, clickedItem.getBook())); + } else if (clickedItem.getType() == BookTreeItem.TYPE_REPORT_CHARACTER) { + ReportManager.fireReportEvent(new ReportEvent(ReportEvent.OPEN_REPORT_CHARACTER, clickedItem.getBook())); + } else if (clickedItem.getType() == BookTreeItem.TYPE_REPORT_EMOTION) { + ReportManager.fireReportEvent(new ReportEvent(ReportEvent.OPEN_REPORT_EMOTION, clickedItem.getBook())); + } else if (clickedItem.getType() == BookTreeItem.TYPE_REPORT_READABILITY) { + ReportManager.fireReportEvent(new ReportEvent(ReportEvent.OPEN_REPORT_READABILITY, clickedItem.getBook())); + } else if (clickedItem.getType() == BookTreeItem.TYPE_REPORT_SENTENCE_VARIETY) { + ReportManager.fireReportEvent(new ReportEvent(ReportEvent.OPEN_REPORT_SENTENCE_VARIETY, clickedItem.getBook())); + } + } + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/booktree/BookTreeItem.java b/app-gui/src/main/java/com/o3/storyinspector/gui/booktree/BookTreeItem.java new file mode 100644 index 0000000..4e02a8e --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/booktree/BookTreeItem.java @@ -0,0 +1,32 @@ +package com.o3.storyinspector.gui.booktree; + +import com.o3.storyinspector.storydom.Book; +import javafx.scene.Node; +import javafx.scene.control.TreeItem; + +public class BookTreeItem extends TreeItem { + + public static final int TYPE_BOOK = 0; + public static final int TYPE_REPORT_STRUCTURE = 1; + public static final int TYPE_REPORT_CHARACTER = 2; + public static final int TYPE_REPORT_EMOTION = 3; + public static final int TYPE_REPORT_READABILITY = 4; + public static final int TYPE_REPORT_SENTENCE_VARIETY = 5; + + int type; + Book book; + + public BookTreeItem(int type, T t, Node node, Book book) { + super(t, node); + this.type = type; + this.book = book; + } + + public Book getBook() { + return book; + } + + public int getType() { + return type; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookEvent.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookEvent.java new file mode 100644 index 0000000..b3b0cc7 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookEvent.java @@ -0,0 +1,29 @@ +package com.o3.storyinspector.gui.core; + +import com.o3.storyinspector.storydom.Book; + +public class BookEvent { + + public static int BOOK_ADDED = 0; + public static int BOOK_QUEUED = 1; + + int type; + Book book; + + public BookEvent(final int type) { + this.type = type; + } + + public BookEvent(final int type, final Book book) { + this.type = type; + this.book = book; + } + + public int getType() { + return type; + } + + public Book getBook() { + return book; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookEventListener.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookEventListener.java new file mode 100644 index 0000000..15c12c0 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookEventListener.java @@ -0,0 +1,7 @@ +package com.o3.storyinspector.gui.core; + +public interface BookEventListener { + + void handleEvent(BookEvent event); + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookManager.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookManager.java new file mode 100644 index 0000000..49caabe --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/BookManager.java @@ -0,0 +1,97 @@ +package com.o3.storyinspector.gui.core; + +import com.o3.storyinspector.annotation.AnnotationEngine; +import com.o3.storyinspector.annotation.BookProcessingStatusListener; +import com.o3.storyinspector.bookimporter.plaintext.PlainTextImporter; +import com.o3.storyinspector.storydom.Book; +import com.o3.storyinspector.storydom.Chapter; +import com.o3.storyinspector.storydom.io.XmlReader; +import com.o3.storyinspector.storydom.io.XmlWriter; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.xml.bind.JAXBException; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class BookManager { + + public static String STORYDOM_EXTENSION = "storydom"; + + static String[] STORYDOM_EXTENSIONS = { STORYDOM_EXTENSION }; + + static final Logger LOGGER = LoggerFactory.getLogger(BookManager.class); + + static List eventListeners = new ArrayList<>(); + + public static void registerEventListener(final BookEventListener listener) { + eventListeners.add(listener); + } + + public static void fireBookEvent(final BookEvent event) { + eventListeners.stream().forEach(l -> l.handleEvent(event)); + } + + public static List readChapterList(final File bookFile) { + try { + final String xml = BookManager.importStorydomFromFile(bookFile); + final Book book = XmlReader.readBookFromXmlStream(new StringReader(xml)); + return book.getChapters(); + } catch (JAXBException jaxbe) { + jaxbe.printStackTrace(); + return new ArrayList<>(); + } + } + + public static String importStorydomFromFile(final File file) { + final Book importedBook = PlainTextImporter.importBookFromFile(file.getAbsolutePath()); + try { + return XmlWriter.exportBookToString(importedBook); + } catch (JAXBException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } + + public static String importStorydomFromFile(final File file, final String title, final String author) { + final Book importedBook = PlainTextImporter.importBookFromFile(file.getAbsolutePath()); + importedBook.setTitle(title); + importedBook.setAuthor(author); + try { + return XmlWriter.exportBookToString(importedBook); + } catch (JAXBException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } + + public static String annotateStorydom(final String storydom, final BookProcessingStatusListener statusListener) throws JAXBException { + final StringReader storydomReader = new StringReader(storydom); + final Book annotatedBook = AnnotationEngine.annotateBook(storydomReader, statusListener); + fireBookEvent(new BookEvent(BookEvent.BOOK_ADDED, annotatedBook)); + return XmlWriter.exportBookToString(annotatedBook); + } + + public static List getAllBooks() throws IOException, JAXBException { + List books = new ArrayList<>(); + final Collection files = FileUtils.listFiles(new File(getBookLibraryDir()), STORYDOM_EXTENSIONS, false); + LOGGER.info("Reading dir: " + getBookLibraryDir()); + for (File file : files) { + LOGGER.info("Found file: " + file.getName()); + final Book book = XmlReader.readBookFromXmlStream(new FileReader(file)); + books.add(book); + } + return books; + } + + public static String getBookLibraryDir() throws IOException { + return new java.io.File(".").getCanonicalPath(); + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportEvent.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportEvent.java new file mode 100644 index 0000000..adf649f --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportEvent.java @@ -0,0 +1,28 @@ +package com.o3.storyinspector.gui.core; + +import com.o3.storyinspector.storydom.Book; + +public class ReportEvent { + + public static int OPEN_REPORT_BOOK_STRUCTURE = 0; + public static int OPEN_REPORT_CHARACTER = 1; + public static int OPEN_REPORT_EMOTION = 2; + public static int OPEN_REPORT_READABILITY = 3; + public static int OPEN_REPORT_SENTENCE_VARIETY = 4; + + int type; + Book book; + + public ReportEvent(int type, Book book) { + this.type = type; + this.book = book; + } + + public int getType() { + return type; + } + + public Book getBook() { + return book; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportEventListener.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportEventListener.java new file mode 100644 index 0000000..fc44670 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportEventListener.java @@ -0,0 +1,5 @@ +package com.o3.storyinspector.gui.core; + +public interface ReportEventListener { + void handleReportEvent(ReportEvent event); +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportManager.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportManager.java new file mode 100644 index 0000000..831f7f7 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/ReportManager.java @@ -0,0 +1,17 @@ +package com.o3.storyinspector.gui.core; + +import java.util.ArrayList; +import java.util.List; + +public class ReportManager { + + static List listeners = new ArrayList<>(); + + public static void registerEventListener(final ReportEventListener listener) { + listeners.add(listener); + } + + public static void fireReportEvent(final ReportEvent event) { + listeners.stream().forEach(l -> l.handleReportEvent(event)); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Block.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Block.java new file mode 100644 index 0000000..df08385 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Block.java @@ -0,0 +1,44 @@ +package com.o3.storyinspector.gui.core.domain; + +import com.o3.storyinspector.storydom.Chapter; + +import java.util.List; + +public class Block { + + public static final double FK_GRADE_UNKNOWN = -256; + + private Integer id; + private String body; + private Double fkGrade; + private List sentences; + private Chapter chapter; + + public Block(final Integer id, final com.o3.storyinspector.storydom.Block domBlock, final Chapter chapter, final List sentences) { + this.body = domBlock.getBody(); + this.fkGrade = (domBlock.getFkGrade() != null) ? domBlock.getFkGrade().doubleValue() : FK_GRADE_UNKNOWN; + this.id = id; + this.chapter = chapter; + this.sentences = sentences; + } + + public Integer getId() { + return id; + } + + public String getBody() { + return body; + } + + public Double getFkGrade() { + return fkGrade; + } + + public Chapter getChapter() { + return chapter; + } + + public List getSentences() { + return sentences; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Blocks.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Blocks.java new file mode 100644 index 0000000..7288cd3 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Blocks.java @@ -0,0 +1,119 @@ +package com.o3.storyinspector.gui.core.domain; + +import com.o3.storyinspector.annotation.blocks.SentenceSplitter; +import com.o3.storyinspector.annotation.readability.FleschKincaidReadabilityInspector; +import com.o3.storyinspector.annotation.wordcount.WordCountInspector; +import com.o3.storyinspector.storydom.Book; + +import java.util.ArrayList; +import java.util.List; + +public class Blocks { + + private static double FK_GRADE_UNKNOWN = -256; + + public static String VARIETY_POOR = "poor"; + public static String VARIETY_FAIR = "fair"; + public static String VARIETY_GOOD = "good"; + public static String VARIETY_EXCELLENT = "excellent"; + public static String VARIETY_NA = "(not applicable)"; + public static String VARIETY_UNKNOWN = "(could not calculate sentence variety)"; + + + private String bookTitle; + private String bookAuthor; + private List blocks; + + public Blocks(String bookTitle, String bookAuthor, List blocks) { + this.bookTitle = bookTitle; + this.bookAuthor = bookAuthor; + this.blocks = blocks; + } + + public String getBookTitle() { + return bookTitle; + } + + public String getBookAuthor() { + return bookAuthor; + } + + public List getBlocks() { + return blocks; + } + + public static Blocks buildBlocks(final Book book, final String bookTitle, final String author) { + final List blockList = new ArrayList<>(); + int chapterId = 1; + int blockId = 1; + for (final com.o3.storyinspector.storydom.Chapter chapter : book.getChapters()) { +// final String chapterTitle = "Chapter #" + chapterId++ + " " + chapter.getTitle(); + for (final com.o3.storyinspector.storydom.Block domBlock : chapter.getBlocks()) { + final List sentences = new ArrayList<>(); + for (final String sentenceText : SentenceSplitter.splitSentences(domBlock)) { + final int wordCount = WordCountInspector.inspectWordCount(sentenceText); + double fkGradeLevel = FleschKincaidReadabilityInspector.inspectFKGradeLevel(sentenceText); + sentences.add(new Sentence(sentenceText, fkGradeLevel, wordCount)); + } + blockList.add(new Block(blockId++, domBlock, chapter, sentences)); + } + } + return new Blocks(bookTitle, author, blockList); + } + + public static String getFkGradeMessage(final double fkGrade) { + String fkGradeMsg; + if (fkGrade == FK_GRADE_UNKNOWN) { + fkGradeMsg = "(Readability not calculated. Re-upload your book to calculate.)"; + } else if (fkGrade <= 0.99) { + fkGradeMsg = "Extremely easy to read."; + } else if (fkGrade <= 1.99) { + fkGradeMsg = "Grade 1. Very easy to read."; + } else if (fkGrade <= 2.99) { + fkGradeMsg = "Grade 2. Very easy to read."; + } else if (fkGrade <= 3.99) { + fkGradeMsg = "Grade 3. Very easy to read."; + } else if (fkGrade <= 4.99) { + fkGradeMsg = "Grade 4. Very easy to read."; + } else if (fkGrade <= 5.99) { + fkGradeMsg = "Grade 5. Very easy to read."; + } else if (fkGrade <= 6.99) { + fkGradeMsg = "Grade 6. Easy to read. Conversational English for consumers."; + } else if (fkGrade <= 7.99) { + fkGradeMsg = "Grade 7. Fairly easy to read."; + } else if (fkGrade <= 8.99) { + fkGradeMsg = "Grade 8. Plain English."; + } else if (fkGrade <= 9.99) { + fkGradeMsg = "Grade 9. Plain English."; + } else if (fkGrade <= 10.99) { + fkGradeMsg = "Grade 10. Fairly difficult to read."; + } else if (fkGrade <= 11.99) { + fkGradeMsg = "Grade 11. Fairly difficult to read."; + } else if (fkGrade <= 12.99) { + fkGradeMsg = "Grade 12. Fairly difficult to read."; + } else if (fkGrade <= 21.99) { + fkGradeMsg = "College grade. Difficult to read."; + } else if (fkGrade >= 22) { + fkGradeMsg = "Professional, extremely difficult to read."; + } else { + fkGradeMsg = "(Readability not calculated. Re-upload your book to calculate.)"; + } + return fkGradeMsg; + } + + public static String getSentenceVarietyMessage(final double stdDev, final Block block) { + if (block != null && block.getSentences().size() <= 1) { + return VARIETY_NA; + } else if (stdDev <= 5) { + return VARIETY_POOR; + } else if (stdDev > 5 && stdDev <= 9) { + return VARIETY_FAIR; + } else if (stdDev > 9 && stdDev <= 14) { + return VARIETY_GOOD; + } else if (stdDev > 14) { + return VARIETY_EXCELLENT; + } + return VARIETY_UNKNOWN; + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Character.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Character.java new file mode 100644 index 0000000..b6caffb --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Character.java @@ -0,0 +1,36 @@ +package com.o3.storyinspector.gui.core.domain; + +import java.util.List; + +/** + * Domain object for a book character. + */ +public class Character { + + private String name; + private List chapters; + private double totalPercentageOfChapters; + + public Character(final String name, final List chapters, final double totalPercentageOfChapters) { + this.name = name; + this.chapters = chapters; + this.totalPercentageOfChapters = totalPercentageOfChapters; + } + + public String getName() { + return name; + } + + public List getChapters() { + return chapters; + } + + public double getTotalPercentageOfChapters() { + return totalPercentageOfChapters; + } + + public double increaseTotalPercentageOfChapters(final double delta) { + this.totalPercentageOfChapters += delta; + return this.totalPercentageOfChapters; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Characters.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Characters.java new file mode 100644 index 0000000..d2ea3fb --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Characters.java @@ -0,0 +1,56 @@ +package com.o3.storyinspector.gui.core.domain; + +import com.o3.storyinspector.storydom.Book; +import edu.stanford.nlp.util.ArrayMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Characters { + private String bookTitle; + private List characters; + private int totalNumOfChapters; + + public Characters(final String bookTitle, final List characters, final int totalNumOfChapters) { + this.bookTitle = bookTitle; + this.characters = characters; + this.totalNumOfChapters = totalNumOfChapters; + } + + public String getBookTitle() { + return bookTitle; + } + + public List getCharacters() { + return characters; + } + + public int getTotalNumOfChapters() { + return totalNumOfChapters; + } + + public static Characters buildFromBook(final Book book) { + final int totalNumOfChapters = book.getChapters().size(); + final Map charactersByName = new ArrayMap<>(); + int chapterId = 1; + for (final com.o3.storyinspector.storydom.Chapter chapter : book.getChapters()) { + final Integer chapterIdInteger = chapterId; // copy id to make it final + chapter.getMetadata().getCharacters().getCharacters() + .forEach(c -> addOrUpdateCharacterEntry(c.getName(), chapterIdInteger, totalNumOfChapters, charactersByName)); + chapterId++; + } + return new Characters(book.getTitle(), new ArrayList<>(charactersByName.values()), totalNumOfChapters); + } + + private static void addOrUpdateCharacterEntry(final String name, final int chapterId, final int totalNumOfChapters, final Map charactersByName) { + Character character = charactersByName.get(name); + if (character == null) { + character = new Character(name, new ArrayList<>(), 0.0); + charactersByName.put(name, character); + } + character.getChapters().add(chapterId); + character.increaseTotalPercentageOfChapters((double)1/totalNumOfChapters); + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/EmotionChartData.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/EmotionChartData.java new file mode 100644 index 0000000..ee88936 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/EmotionChartData.java @@ -0,0 +1,137 @@ +package com.o3.storyinspector.gui.core.domain; + +import com.o3.storyinspector.storydom.Block; +import com.o3.storyinspector.storydom.Book; +import com.o3.storyinspector.storydom.Chapter; +import com.o3.storyinspector.storydom.Emotion; +import com.o3.storyinspector.storydom.constants.EmotionType; +import com.o3.storyinspector.storydom.util.StoryDomUtils; + +import javax.xml.bind.JAXBException; +import java.util.*; + +/** + * Domain object for chart entities. + */ +public class EmotionChartData { + + private String bookTitle; + private String bookAuthor; + private List labels; + private List blocks; + private List scores; + private List chapterDividers; + + public EmotionChartData(final String bookTitle, final String bookAuthor, final List labels, final List blocks, final List scores, final List chapterDividers) { + this.bookTitle = bookTitle; + this.bookAuthor = bookAuthor; + this.labels = labels; + this.blocks = blocks; + this.scores = scores; + this.chapterDividers = chapterDividers; + } + + public String getBookTitle() { + return bookTitle; + } + + public String getBookAuthor() { + return bookAuthor; + } + + public List getLabels() { + return labels; + } + + public List getBlocks() { + return blocks; + } + + public List getScores() { + return scores; + } + + public List getChapterDividers() { + return chapterDividers; + } + + /** + * Emotion score of a certain emotion type for a given book. + * + * @param book the book + * @param emotionType the emotion type + * @return the emotion score + */ + public static Map getEmotionScores(final Book book, final EmotionType emotionType) { + final double maxEmotionScore = StoryDomUtils.getMaxEmotionScore(book); + final Map scoresByBlock = new HashMap<>(); + int counter = 1; + for (final Chapter chapter : book.getChapters()) { + for (final Block block : chapter.getBlocks()) { + final Emotion emotion = StoryDomUtils.findEmotion(emotionType, block.getEmotions()); + final double emotionScore = emotion.getScore().doubleValue(); + final double normalizedEmotionScore = emotionScore / maxEmotionScore; + scoresByBlock.put(counter++, normalizedEmotionScore); + } + } + return scoresByBlock; + } + + public static EmotionChartData buildSentimentChartFromBook(final Book book) { + final List labels = new ArrayList<>(); + final List blocks = new ArrayList<>(); + final List scores = new ArrayList<>(); + final List chapterDividers = new ArrayList<>(); + int counter = 0; + for (final Chapter chapter : book.getChapters()) { + for (final Block block : chapter.getBlocks()) { + counter++; + final double sentimentScore = block.getSentimentScore().doubleValue(); + labels.add("#" + counter); + blocks.add(block.getBody()); + scores.add(sentimentScore); + } + chapterDividers.add(counter); + } + chapterDividers.remove(chapterDividers.size()-1); // remove last marker + return new EmotionChartData(book.getTitle(), book.getAuthor(), labels, blocks, scores, chapterDividers); + } + + public static EmotionChartData buildEmotionChartFromBook(final Book book, final EmotionType emotionType) throws JAXBException { + final double maxEmotionScore = StoryDomUtils.getMaxEmotionScore(book); + final List labels = new ArrayList<>(); + final List blocks = new ArrayList<>(); + final List scores = new ArrayList<>(); + final List chapterDividers = new ArrayList<>(); + int counter = 0; + for (final Chapter chapter : book.getChapters()) { + for (final Block block : chapter.getBlocks()) { + counter++; + final Emotion emotion = StoryDomUtils.findEmotion(emotionType, block.getEmotions()); + final double emotionScore = emotion.getScore().doubleValue(); + final double normalizedEmotionScore = emotionScore / maxEmotionScore; + labels.add("#" + counter); + blocks.add(block.getBody()); + scores.add(normalizedEmotionScore); + } + chapterDividers.add(counter); + } + chapterDividers.remove(chapterDividers.size()-1); // remove last marker + return new EmotionChartData(book.getTitle(), book.getAuthor(), labels, blocks, scores, chapterDividers); + } + + public static int getChapterNumber(final int blockNumber, final List chapterDividers) { + Optional chapterNumber = chapterDividers.stream() + .filter(num -> num > blockNumber).findFirst(); + if (chapterNumber.isPresent()) { + final int index = chapterDividers.indexOf(chapterNumber.get()); + return index+1; + } else { + // last chapter + final int size = chapterDividers.size(); + return size+1; + } + } + + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Sentence.java b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Sentence.java new file mode 100644 index 0000000..f3aebf3 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/core/domain/Sentence.java @@ -0,0 +1,26 @@ +package com.o3.storyinspector.gui.core.domain; + +public class Sentence { + + private String body; + private Double fkGrade; + private Integer wordCount; + + public Sentence(String body, Double fkGrade, Integer wordCount) { + this.body = body; + this.fkGrade = fkGrade; + this.wordCount = wordCount; + } + + public String getBody() { + return body; + } + + public Double getFkGrade() { + return fkGrade; + } + + public Integer getWordCount() { + return wordCount; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/processbook/AnnotateBookGuiTask.java b/app-gui/src/main/java/com/o3/storyinspector/gui/processbook/AnnotateBookGuiTask.java new file mode 100644 index 0000000..a948c1d --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/processbook/AnnotateBookGuiTask.java @@ -0,0 +1,64 @@ +package com.o3.storyinspector.gui.processbook; + +import com.o3.storyinspector.gui.core.BookEvent; +import com.o3.storyinspector.gui.core.BookManager; +import com.o3.storyinspector.gui.status.TaskManager; +import com.o3.storyinspector.gui.utils.I18N; +import javafx.concurrent.Task; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class AnnotateBookGuiTask extends Task { + + static String BOOK_BY = "bookBy"; + static String BOOK_PROCESSING = "bookProcessing"; + static String BOOK_TASK_MSG = "bookTaskMessage"; + + StorydomData storydomData; + + public static void annotateStoryDom(final StorydomData data) { + final AnnotateBookGuiTask task = new AnnotateBookGuiTask(data); + final Thread th = new Thread(task); + th.setDaemon(true); + th.start(); + TaskManager.getInstance().addTask(task); + BookManager.fireBookEvent(new BookEvent(BookEvent.BOOK_QUEUED)); + } + + public AnnotateBookGuiTask(final StorydomData storydomData) { + this.storydomData = storydomData; + } + + @Override + protected StorydomData call() throws Exception { + // create StoryDOM and write file + final File inputFile = new File(storydomData.getInputFilename()); + final String xml = BookManager.importStorydomFromFile(inputFile, storydomData.getTitle(), storydomData.getAuthor()); + final String author = storydomData.getAuthor().replaceAll(" ", "_"); + final String title = storydomData.getTitle().replaceAll(" ", "_"); + final String storydomFilename = author + "-" + title + "." + BookManager.STORYDOM_EXTENSION; + final File storydomFile = new File(BookManager.getBookLibraryDir(), storydomFilename); + writeXmlToFile(xml, storydomFile); + + // annotate StoryDOM + updateTitle(storydomData.getTitle() + " " + I18N.stringFor(BOOK_BY) + " " + storydomData.getAuthor()); + updateMessage(I18N.stringFor(BOOK_PROCESSING)); + final String annotatedStorydom = BookManager.annotateStorydom(xml, (percentageCompleted, minutesLeft) -> { + final String msg = String.format(I18N.stringFor(BOOK_TASK_MSG), ((int) Math.floor(percentageCompleted * 100)), minutesLeft); + System.out.println(msg); // FIXME + updateProgress((percentageCompleted * minutesLeft), minutesLeft); + updateMessage(msg); + }); + writeXmlToFile(annotatedStorydom, storydomFile); + return storydomData; + } + + private static void writeXmlToFile(final String xml, final File file) throws IOException { + final BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.append(xml); + writer.close(); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/processbook/StorydomData.java b/app-gui/src/main/java/com/o3/storyinspector/gui/processbook/StorydomData.java new file mode 100644 index 0000000..dd462f3 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/processbook/StorydomData.java @@ -0,0 +1,29 @@ +package com.o3.storyinspector.gui.processbook; + +/** + * Data of a StoryDOM file (filename, title, author) + */ +public class StorydomData { + + private String title; + private String author; + private String inputFilename; + + public StorydomData(String title, String author, String inputFilename) { + this.title = title; + this.author = author; + this.inputFilename = inputFilename; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } + + public String getInputFilename() { + return inputFilename; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/ReportTabPane.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/ReportTabPane.java new file mode 100644 index 0000000..30320f9 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/ReportTabPane.java @@ -0,0 +1,54 @@ +package com.o3.storyinspector.gui.reportarea; + +import com.o3.storyinspector.gui.core.*; +import com.o3.storyinspector.gui.reportarea.character.CharacterReportTab; +import com.o3.storyinspector.gui.reportarea.emotion.EmotionReportTab; +import com.o3.storyinspector.gui.reportarea.readability.ReadabilityReportTab; +import com.o3.storyinspector.gui.reportarea.sentence.SentenceVarietyReportTab; +import com.o3.storyinspector.gui.reportarea.structure.BookStructureReportTab; +import com.o3.storyinspector.gui.reportarea.task.TaskTab; +import javafx.scene.control.TabPane; + +public class ReportTabPane extends TabPane implements ReportEventListener, BookEventListener { + + TaskTab taskTab; + + public ReportTabPane() { + ReportManager.registerEventListener(this); + BookManager.registerEventListener(this); + } + + @Override + public void handleReportEvent(ReportEvent event) { + if (event.getType() == ReportEvent.OPEN_REPORT_BOOK_STRUCTURE) { + final BookStructureReportTab bookStructureReportTab = new BookStructureReportTab(event.getBook()); + this.getTabs().add(bookStructureReportTab); + this.getSelectionModel().selectLast(); // focus on new tab + } else if (event.getType() == ReportEvent.OPEN_REPORT_CHARACTER) { + final CharacterReportTab characterReportTab = new CharacterReportTab(event.getBook()); + this.getTabs().add(characterReportTab); + this.getSelectionModel().selectLast(); // focus on new tab + } else if (event.getType() == ReportEvent.OPEN_REPORT_EMOTION) { + final EmotionReportTab emotionReportTab = new EmotionReportTab(event.getBook()); + this.getTabs().add(emotionReportTab); + this.getSelectionModel().selectLast(); // focus on new tab + } else if (event.getType() == ReportEvent.OPEN_REPORT_READABILITY) { + final ReadabilityReportTab readabilityReportTab = new ReadabilityReportTab(event.getBook()); + this.getTabs().add(readabilityReportTab); + this.getSelectionModel().selectLast(); // focus on new tab + } else if (event.getType() == ReportEvent.OPEN_REPORT_SENTENCE_VARIETY) { + final SentenceVarietyReportTab sentenceVarietyReportTab = new SentenceVarietyReportTab(event.getBook()); + this.getTabs().add(sentenceVarietyReportTab); + this.getSelectionModel().selectLast(); // focus on new tab + } + } + + @Override + public void handleEvent(BookEvent event) { + if (event.getType() == BookEvent.BOOK_QUEUED) { + if (taskTab == null) { + this.getTabs().add(new TaskTab()); + } + } + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterDistributionChart.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterDistributionChart.java new file mode 100644 index 0000000..e28be76 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterDistributionChart.java @@ -0,0 +1,62 @@ +package com.o3.storyinspector.gui.reportarea.character; + +import com.o3.storyinspector.gui.core.domain.Character; +import com.o3.storyinspector.gui.core.domain.Characters; +import com.o3.storyinspector.gui.utils.StringFormatter; +import javafx.scene.chart.Axis; +import javafx.scene.chart.BarChart; +import javafx.scene.chart.CategoryAxis; +import javafx.scene.chart.NumberAxis; +import javafx.scene.control.Tooltip; +import javafx.util.Duration; + +import java.util.Comparator; + +public class CharacterDistributionChart extends BarChart { + + static int TRIM_LEN = 20; + + public static CharacterDistributionChart build(final Characters characters) { + // chapters axis + CategoryAxis xAxis = new CategoryAxis(); + xAxis.setTickLabelRotation(-45); + // number of words axis + NumberAxis yAxis = new NumberAxis(); + yAxis.setLabel("% Chapters"); + + final CharacterDistributionChart chart = new CharacterDistributionChart(xAxis, yAxis); + + // add data + Series dataSeries1 = new Series(); + characters.getCharacters().stream() + .sorted(Comparator.comparingDouble(Character::getTotalPercentageOfChapters).reversed()) + .forEach(character -> { + final Data data = new Data<>(StringFormatter.trimText(character.getName(), TRIM_LEN), + character.getTotalPercentageOfChapters()); + dataSeries1.getData().add(data); + }); + chart.getData().add(dataSeries1); + + // tooltip (hover box) + dataSeries1.getData() + .forEach( item -> { + final Data data = (Data) item; + final String percentage = StringFormatter.formatPercentage((double)data.getYValue()); + final Tooltip tooltip = new Tooltip(data.getXValue() + "\n" + percentage + " of all chapters"); + tooltip.setShowDelay(Duration.seconds(0)); + tooltip.setShowDuration(Duration.INDEFINITE); + Tooltip.install(data.getNode(), tooltip); + }); + + // formatting + chart.setLegend(null); + chart.setMinHeight(300); + chart.setMinWidth(35 * characters.getCharacters().size()); + + return chart; + } + + private CharacterDistributionChart(Axis axis, Axis axis1) { + super(axis, axis1); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterDistributionTable.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterDistributionTable.java new file mode 100644 index 0000000..ee7a7dd --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterDistributionTable.java @@ -0,0 +1,57 @@ +package com.o3.storyinspector.gui.reportarea.character; + + +import com.o3.storyinspector.gui.core.domain.Character; +import com.o3.storyinspector.gui.core.domain.Characters; +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.cell.PropertyValueFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Comparator; +import java.util.stream.IntStream; + +public class CharacterDistributionTable extends TableView { + + static final Logger LOGGER = LoggerFactory.getLogger(CharacterDistributionTable.class); + + Characters characters; + + public CharacterDistributionTable(final Characters characters) { + super(); + this.characters = characters; + this.setPlaceholder(new Label("No rows to display")); + + final TableColumn characterNameCol = new TableColumn<>("Character / Chapter"); + characterNameCol.setCellValueFactory(new PropertyValueFactory<>("Name")); +// characterNameCol.setCellValueFactory(cell -> { +// return new ReadOnlyObjectWrapper(cell.getValue().getName()); +// }); + this.getColumns().add(characterNameCol); + + IntStream.range(1, characters.getTotalNumOfChapters()).forEach( + chapterNum -> { + final TableColumn chapterNumberCol = new TableColumn<>(Integer.toString(chapterNum)); + chapterNumberCol.setCellValueFactory(cell -> { + final Character character = cell.getValue(); + final boolean characterIsInChapter = character.getChapters().contains(chapterNum); + return new ReadOnlyObjectWrapper((characterIsInChapter) ? "X" : ""); + }); + this.getColumns().add(chapterNumberCol); + }); + + characters.getCharacters().stream() + .sorted(Comparator.comparingDouble(Character::getTotalPercentageOfChapters).reversed()) + .forEach(character -> { + LOGGER.info("adding character " + character.getName()); + this.getItems().add(character); + }); + + // formatting + this.setMinHeight(300); + this.setMinWidth(35 * characters.getTotalNumOfChapters()); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterReportTab.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterReportTab.java new file mode 100644 index 0000000..1cb8326 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/character/CharacterReportTab.java @@ -0,0 +1,78 @@ +package com.o3.storyinspector.gui.reportarea.character; + +import com.o3.storyinspector.gui.core.domain.Character; +import com.o3.storyinspector.gui.core.domain.Characters; +import com.o3.storyinspector.gui.utils.IconUtils; +import com.o3.storyinspector.storydom.Book; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.Tab; +import javafx.scene.control.TitledPane; +import javafx.scene.layout.VBox; +import org.controlsfx.glyphfont.FontAwesome; + +public class CharacterReportTab extends Tab { + + Book book; + Characters characters; + + public CharacterReportTab(final Book book) { + super(book.getTitle() + " (Characters)"); + this.setGraphic(IconUtils.getIcon(FontAwesome.Glyph.USERS)); + this.book = book; + this.characters = Characters.buildFromBook(book); + + final VBox stackedTitledPanes = new VBox(); + + // summary + final VBox summaryLayout = new VBox(); + + final int characterCount = this.characters.getCharacters().size(); + summaryLayout.getChildren().add(new Label(String.format("This book has %d characters in total.", characterCount))); + final TitledPane summaryPane = new TitledPane("Summary", summaryLayout); + + summaryLayout.getChildren().add(new Label("\n")); + summaryLayout.getChildren().add(new Label("The main characters (>=50% of chapters) are:")); + characters.getCharacters().stream() + .filter(character -> character.getTotalPercentageOfChapters() >= 0.5) + .map(Character::getName) + .sorted() + .forEach(name -> summaryLayout.getChildren().add(new Label(" - " + name))); + + summaryLayout.getChildren().add(new Label("\n")); + summaryLayout.getChildren().add(new Label("The secondary characters (>=20% of chapters) are:")); + characters.getCharacters().stream() + .filter(character -> character.getTotalPercentageOfChapters() >= 0.2 + && character.getTotalPercentageOfChapters() < 0.5) + .map(Character::getName) + .sorted() + .forEach(name -> summaryLayout.getChildren().add(new Label(" - " + name))); + + summaryPane.setExpanded(true); + stackedTitledPanes.getChildren().add(summaryPane); + + // chart: character distribution (total) + final CharacterDistributionChart characterDistributionChart = CharacterDistributionChart.build(characters); + final ScrollPane chartScrollPane = new ScrollPane(characterDistributionChart); + chartScrollPane.setMinHeight(characterDistributionChart.getMinHeight() * 1.4); + final TitledPane characterDistributionChartPane = + new TitledPane("Characters' Distribution (Total)", + chartScrollPane); + characterDistributionChartPane.setExpanded(true); + stackedTitledPanes.getChildren().add(characterDistributionChartPane); + + // table: character distribution per chapter + final CharacterDistributionTable characterDistributionTable = + new CharacterDistributionTable(characters); + stackedTitledPanes.getChildren().add( + new TitledPane("Characters' Distribution (Per Chapter)", + characterDistributionTable)); + + // scrollable content + final ScrollPane scrollPane = new ScrollPane(stackedTitledPanes); + scrollPane.fitToWidthProperty().set(true); + scrollPane.fitToHeightProperty().set(true); + + this.setContent(scrollPane); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/emotion/EmotionChart.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/emotion/EmotionChart.java new file mode 100644 index 0000000..0d0f7a7 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/emotion/EmotionChart.java @@ -0,0 +1,164 @@ +package com.o3.storyinspector.gui.reportarea.emotion; + +import com.o3.storyinspector.gui.core.domain.EmotionChartData; +import com.o3.storyinspector.gui.utils.StringFormatter; +import com.o3.storyinspector.gui.view.StackedAreaChartWithMarkers; +import com.o3.storyinspector.storydom.Book; +import com.o3.storyinspector.storydom.constants.EmotionType; +import javafx.scene.chart.Axis; +import javafx.scene.chart.CategoryAxis; +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.StackPane; +import javafx.util.Duration; +import javafx.util.StringConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class EmotionChart extends StackedAreaChartWithMarkers { + + static final Logger LOGGER = LoggerFactory.getLogger(EmotionChart.class); + + Book book; + + public static EmotionChart buildEmotionChart(final Book book, final EmotionType emotionType) { + CategoryAxis xAxis = new CategoryAxis(); + xAxis.setLabel("Pages"); + + NumberAxis yAxis = new NumberAxis(); + yAxis.setLabel("Emotion Score"); + yAxis.setAutoRanging(false); + yAxis.setLowerBound(0); + yAxis.setUpperBound(1.0); + yAxis.setTickLabelFormatter(new StringConverter<>() { + @Override + public String toString(Number number) { + return (StringFormatter.formatInteger(number.doubleValue() * 100)) + "%"; + } + + @Override + public Number fromString(String s) { + return null; + } + }); + + return new EmotionChart(xAxis, yAxis, book, emotionType); + } + + public static EmotionChart buildSentimentChart(final Book book) { + CategoryAxis xAxis = new CategoryAxis(); + xAxis.setLabel("Pages"); + + NumberAxis yAxis = new NumberAxis(); + yAxis.setLabel("Sentiment Score"); + yAxis.setAutoRanging(false); + yAxis.setLowerBound(-1); + yAxis.setUpperBound(1); + yAxis.setTickLabelFormatter(new StringConverter<>() { + @Override + public String toString(Number number) { + if (number.intValue() == 0) { + return "Neutral"; + } else if (number.intValue() > 0) { + return "Positive"; + } else if (number.intValue() < 0) { + return "Negative"; + } else { + return ""; + } + } + + @Override + public Number fromString(String s) { + return null; + } + }); + + return new EmotionChart(xAxis, yAxis, book); + } + + public EmotionChart(final Axis xAxis, final Axis yAxis, final Book book) { + super(xAxis, yAxis); + this.book = book; + + try { + EmotionChartData emotionChartData = EmotionChartData.buildSentimentChartFromBook(book); + final Series dataSeriesForEmotion = createDataSeriesForEmotion("Sentiment", emotionChartData); + this.getData().add(dataSeriesForEmotion); + + embellishChart("Sentiment", emotionChartData); + } catch (Exception e) { + e.printStackTrace(); + LOGGER.error(e.getMessage()); + } + } + + public EmotionChart(final Axis xAxis, final Axis yAxis, final Book book, final EmotionType emotionType) { + super(xAxis, yAxis); + this.book = book; + + try { + final EmotionChartData emotionChartData = EmotionChartData.buildEmotionChartFromBook(book, emotionType); + final Series dataSeriesForEmotion = createDataSeriesForEmotion(emotionType.asString(), emotionChartData); + this.getData().add(dataSeriesForEmotion); + + embellishChart(emotionType.asString(), emotionChartData); + + } catch (Exception e) { + e.printStackTrace(); + LOGGER.error(e.getMessage()); + } + } + + private void embellishChart(final String seriesName, final EmotionChartData emotionChartData) { + // show tooltip + int blockNumber = 0; + for (Object o : this.getData()) { + XYChart.Series s = (XYChart.Series) o; + for (XYChart.Data data : s.getData()) { + final StackPane stackPane = (StackPane) data.getNode(); +// stackPane.setVisible(false); // hide symbol + final String block = emotionChartData.getBlocks().get(blockNumber); + final String percentage = seriesName + ": " + StringFormatter.formatPercentage(emotionChartData.getScores().get(blockNumber)); + final String chapterCaption = "Chapter " + EmotionChartData.getChapterNumber(blockNumber, emotionChartData.getChapterDividers()); + blockNumber++; + + final Tooltip tooltip = new Tooltip(chapterCaption + "\n" + + "Page #" + blockNumber + "\n" + + percentage + "\n" + block); + tooltip.setPrefWidth(500); + tooltip.setWrapText(true); + tooltip.setShowDelay(Duration.seconds(0)); + tooltip.setShowDuration(Duration.INDEFINITE); + Tooltip.install(stackPane, tooltip); + } + } + // show chapter lanes + final List chapterDividers = emotionChartData.getChapterDividers(); + for (int i=0; i(label, score)); + + } + + return dataSeries; + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/emotion/EmotionReportTab.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/emotion/EmotionReportTab.java new file mode 100644 index 0000000..7deb575 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/emotion/EmotionReportTab.java @@ -0,0 +1,37 @@ +package com.o3.storyinspector.gui.reportarea.emotion; + +import com.o3.storyinspector.gui.utils.IconUtils; +import com.o3.storyinspector.storydom.Book; +import com.o3.storyinspector.storydom.constants.EmotionType; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.Tab; +import javafx.scene.control.TitledPane; +import javafx.scene.layout.VBox; +import org.controlsfx.glyphfont.FontAwesome; + +public class EmotionReportTab extends Tab { + + public EmotionReportTab(Book book) { + super(book.getTitle() + " (Emotions)"); + this.setGraphic(IconUtils.getIcon(FontAwesome.Glyph.HEART)); + + final VBox stackedTitledPanes = new VBox(); + + final TitledPane sentimentChartPane = + new TitledPane("Sentiment (positive vs. negative):", + EmotionChart.buildSentimentChart(book)); + stackedTitledPanes.getChildren().add(sentimentChartPane); + + + for (final EmotionType emotionType : EmotionType.values()) { + final TitledPane emotionChartPane = + new TitledPane("Emotion Chart: " + emotionType.asString(), + EmotionChart.buildEmotionChart(book, emotionType)); + stackedTitledPanes.getChildren().add(emotionChartPane); + } + + final ScrollPane scrollPane = new ScrollPane(stackedTitledPanes); + scrollPane.setFitToWidth(true); + this.setContent(scrollPane); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/readability/ReadabilityReportTab.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/readability/ReadabilityReportTab.java new file mode 100644 index 0000000..e2bf968 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/readability/ReadabilityReportTab.java @@ -0,0 +1,140 @@ +package com.o3.storyinspector.gui.reportarea.readability; + +import com.o3.storyinspector.gui.core.domain.Block; +import com.o3.storyinspector.gui.core.domain.Blocks; +import com.o3.storyinspector.gui.core.domain.Sentence; +import com.o3.storyinspector.gui.utils.IconUtils; +import com.o3.storyinspector.gui.utils.StringFormatter; +import com.o3.storyinspector.storydom.Book; +import javafx.concurrent.Task; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; +import javafx.util.Duration; +import org.controlsfx.glyphfont.FontAwesome; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.DoubleSummaryStatistics; +import java.util.List; + +public class ReadabilityReportTab extends Tab { + + static final Logger LOGGER = LoggerFactory.getLogger(ReadabilityReportTab.class); + + Book book; + final List pages = new ArrayList<>(); + + public ReadabilityReportTab(final Book book) { + super(book.getTitle() + " (Readability)"); + this.setGraphic(IconUtils.getIcon(FontAwesome.Glyph.PENCIL)); + this.book = book; + + final Task calculateReadability = new Task<>() { + @Override + protected Blocks call() { + LOGGER.info("starting to process readability report"); + final Blocks blocks = Blocks.buildBlocks(book, book.getTitle(), book.getAuthor()); + LOGGER.info("finished processing readability report"); + return blocks; + } + }; + + // show spinning wheel + final ProgressIndicator progressIndicator = new ProgressIndicator(); + final Label statusLabel = new Label("Calculating readability scores..."); + final VBox loadingMessage = new VBox(5, statusLabel, progressIndicator); + StackPane stackPane = new StackPane(); + stackPane.getChildren().add(loadingMessage); + StackPane.setAlignment(loadingMessage, Pos.TOP_LEFT); + StackPane.setAlignment(loadingMessage, Pos.CENTER); + this.setContent(stackPane); + + // fill tab content after readability is calculated + calculateReadability.setOnSucceeded(e -> { + final List blockList = calculateReadability.getValue().getBlocks(); + + final VBox stackedTitledPanes = new VBox(); + + // summary + final VBox summaryTabContents = new VBox(); + + final DoubleSummaryStatistics blockStats = blockList.stream() + .mapToDouble(Block::getFkGrade) + .summaryStatistics(); + final double fkAvgGrade = Math.floor(blockStats.getAverage()); + final Label avgReadabilityLabel = new Label("Average Flesch-Kincaid Grade: " + StringFormatter.formatInteger(fkAvgGrade)); + summaryTabContents.getChildren().add(avgReadabilityLabel); + final Label avgReadabilityLabel2 = new Label("Average Readability: " + Blocks.getFkGradeMessage(fkAvgGrade)); + summaryTabContents.getChildren().add(avgReadabilityLabel2); + + final long numBlocksAboveAvg = blockList.stream() + .filter(block -> (Math.floor(block.getFkGrade()) > fkAvgGrade)) + .count(); + final Label avgReadabilityLabel3 = new Label(numBlocksAboveAvg + " pages out of " + blockList.size() + " are more complex than this average."); + summaryTabContents.getChildren().add(avgReadabilityLabel3); + + final Label avgReadabilityLabel4 = new Label("\nThe most complex sentences of each page are highlighted in red below.\nPages are ordered from the most difficult to the easiest to read."); + summaryTabContents.getChildren().add(avgReadabilityLabel4); + + final TitledPane summaryTab = new TitledPane("Summary", summaryTabContents); + summaryTab.setExpanded(true); + stackedTitledPanes.getChildren().add(summaryTab); + + // pages + blockList.sort((Comparator.comparingDouble(Block::getFkGrade).reversed())); + for (final Block block : blockList) { + LOGGER.info("Processing block #" + block.getId()); + double blockThreshold = Math.floor(block.getFkGrade()); + blockThreshold = (blockThreshold >= 8) ? blockThreshold : 8; + final TextFlow page = new TextFlow(); + pages.add(page); + for (final Sentence sentence : block.getSentences()) { + final Text sentenceText = new Text(sentence.getBody() + " "); + if (sentence.getFkGrade() > blockThreshold) { + sentenceText.setStyle("-fx-text-background-color: #f18973"); // does nothing + sentenceText.setFill(Color.RED); + } + page.getChildren().add(sentenceText); + + // tooltip + Tooltip tooltip = new Tooltip("Flesch-Kincaid Grade: " + StringFormatter.formatInteger(sentence.getFkGrade()) + "\n" + Blocks.getFkGradeMessage(sentence.getFkGrade())); + tooltip.setShowDelay(Duration.ZERO); + tooltip.setShowDuration(Duration.INDEFINITE); + Tooltip.install(sentenceText, tooltip); + } + final VBox box = new VBox(); + final Label readabilityLabel1 = new Label("Flesch-Kincaid Grade: " + StringFormatter.formatInteger(block.getFkGrade())); + final Label readabilityLabel2 = new Label("Readability: " + Blocks.getFkGradeMessage(block.getFkGrade())); + readabilityLabel1.setStyle("-fx-font-weight: bold"); + readabilityLabel2.setStyle("-fx-font-weight: bold"); + box.getChildren().add(readabilityLabel1); + box.getChildren().add(readabilityLabel2); + box.getChildren().add(page); + final String tabTitle = "Page #" + block.getId() + + " (Chapter " + block.getChapter().getId() + ": " + + block.getChapter().getTitle() + ")"; + final TitledPane tab1 = new TitledPane(tabTitle, box); + tab1.setExpanded(true); + stackedTitledPanes.getChildren().add(tab1); + LOGGER.info("Finished processing block #" + block.getId()); + } + // scrollable content + final ScrollPane scrollPane = new ScrollPane(stackedTitledPanes); + scrollPane.fitToWidthProperty().set(true); + + this.setContent(scrollPane); + }); + + // trigger readability calculation + new Thread(calculateReadability).start(); + LOGGER.info("Completed readability tab creation"); + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/sentence/SentenceVarietyReportTab.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/sentence/SentenceVarietyReportTab.java new file mode 100644 index 0000000..529cbc9 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/sentence/SentenceVarietyReportTab.java @@ -0,0 +1,265 @@ +package com.o3.storyinspector.gui.reportarea.sentence; + +import com.google.common.collect.ImmutableList; +import com.o3.storyinspector.gui.core.domain.Block; +import com.o3.storyinspector.gui.core.domain.Blocks; +import com.o3.storyinspector.gui.core.domain.Sentence; +import com.o3.storyinspector.gui.utils.IconUtils; +import com.o3.storyinspector.gui.utils.StringFormatter; +import com.o3.storyinspector.gui.view.DoughnutChart; +import com.o3.storyinspector.storydom.Book; +import javafx.collections.FXCollections; +import javafx.concurrent.Task; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.chart.PieChart; +import javafx.scene.control.*; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; +import javafx.util.Duration; +import org.controlsfx.glyphfont.FontAwesome; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.stream.Collectors; + +public class SentenceVarietyReportTab extends Tab { + + static final Logger LOGGER = LoggerFactory.getLogger(SentenceVarietyReportTab.class); + + static String BUCKET_LT_10 = "< 10 words"; + static String BUCKET_10_TO_19 = "10-19 words"; + static String BUCKET_20_TO_29 = "20-29 words"; + static String BUCKET_30_TO_39 = "30-39 words"; + static String BUCKET_GT_40 = "40+ words"; + + static List BUCKETS = ImmutableList.of(BUCKET_LT_10, + BUCKET_10_TO_19, + BUCKET_20_TO_29, + BUCKET_30_TO_39, + BUCKET_GT_40); + + Book book; + final List pages = new ArrayList<>(); + + public SentenceVarietyReportTab(final Book book) { + super(book.getTitle() + " (Sentence Variety)"); + this.setGraphic(IconUtils.getIcon(FontAwesome.Glyph.EDIT)); + this.book = book; + + final Task calculateSentenceLength = new Task<>() { + @Override + protected Blocks call() { + LOGGER.info("starting to process sentence variety report"); + final Blocks blocks = Blocks.buildBlocks(book, book.getTitle(), book.getAuthor()); + LOGGER.info("finished processing sentence variety report"); + return blocks; + } + }; + + // show spinning wheel + final ProgressIndicator progressIndicator = new ProgressIndicator(); + final Label statusLabel = new Label("Calculating sentence length..."); + final VBox loadingMessage = new VBox(5, statusLabel, progressIndicator); + StackPane stackPane = new StackPane(); + stackPane.getChildren().add(loadingMessage); + StackPane.setAlignment(loadingMessage, Pos.TOP_LEFT); + StackPane.setAlignment(loadingMessage, Pos.CENTER); + this.setContent(stackPane); + + // fill tab content after calculations + calculateSentenceLength.setOnSucceeded(e -> { + final List blockList = calculateSentenceLength.getValue().getBlocks(); + + VBox stackedTitledPanes = new VBox(); + + // summary + final VBox summaryTabContents = new VBox(); + + final long numOfSentences = blockList.stream() + .mapToLong(b -> (b.getSentences().size())) + .sum(); + + final List sentenceLenghts = blockList.stream() + .flatMap(b -> b.getSentences().stream()) + .map(Sentence::getWordCount) + .collect(Collectors.toList()); + final double stdDev = computeStandardDeviation(sentenceLenghts); + + final Label label1 = new Label(String.format("This book has %s sentences, with %s sentence variety.\nThis chart shows the sentences grouped by length (in number of words) for the entire book.", StringFormatter.formatInteger(numOfSentences), Blocks.getSentenceVarietyMessage(stdDev, null))); + summaryTabContents.getChildren().add(label1); + + // summary chart + final Map bookBuckets = calculateSentenceBuckets(blockList); + final DoughnutChart summaryChart = buildChart(bookBuckets); + summaryTabContents.getChildren().add(summaryChart); + addTooltips(bookBuckets, summaryChart); + + // summary tab + final TitledPane summaryTab = new TitledPane("Summary", summaryTabContents); + summaryTab.setExpanded(true); + stackedTitledPanes.getChildren().add(summaryTab); + + // page tabs + blockList.sort(Comparator.comparingDouble(b -> { + final List blockSentenceLengths = b.getSentences().stream() + .map(Sentence::getWordCount) + .collect(Collectors.toList()); + return computeStandardDeviation(blockSentenceLengths); + })); + for (final Block block : blockList) { + LOGGER.info("Processing block #" + block.getId()); + + // header + final VBox box = new VBox(); + final Label readabilityLabel1 = new Label("Sentence Variety: " + Blocks.getSentenceVarietyMessage(getBlockStdDev(block), block)); + readabilityLabel1.setStyle("-fx-font-weight: bold"); + box.getChildren().add(readabilityLabel1); + + // page chart + final Map pageBuckets = calculateSentenceBuckets(block); + final DoughnutChart pageChart = buildChart(pageBuckets); + box.getChildren().add(pageChart); + addTooltips(pageBuckets, pageChart); + + // page text + final TextFlow page = new TextFlow(); + page.setBackground(new Background(new BackgroundFill(Color.WHITE, + CornerRadii.EMPTY, Insets.EMPTY))); + pages.add(page); + for (final Sentence sentence : block.getSentences()) { + final Text sentenceText = new Text(sentence.getBody() + " "); + sentenceText.setFill(getColorForSentenceLength(sentence.getWordCount())); + page.getChildren().add(sentenceText); + + // tooltip + Tooltip tooltip = new Tooltip(StringFormatter.formatInteger(sentence.getWordCount()) + " words"); + tooltip.setShowDelay(Duration.ZERO); + tooltip.setShowDuration(Duration.INDEFINITE); + Tooltip.install(sentenceText, tooltip); + } + box.getChildren().add(page); + + final String tabTitle = "Page #" + block.getId() + + " (Chapter " + block.getChapter().getId() + ": " + + block.getChapter().getTitle() + ")"; + final TitledPane tab1 = new TitledPane(tabTitle, box); + tab1.setExpanded(true); + stackedTitledPanes.getChildren().add(tab1); + LOGGER.info("Finished processing block #" + block.getId()); + } + + // scrollable content + final ScrollPane scrollPane = new ScrollPane(stackedTitledPanes); + scrollPane.fitToWidthProperty().set(true); + scrollPane.fitToHeightProperty().set(true); + + this.setContent(scrollPane); + }); + + // trigger calculation + new Thread(calculateSentenceLength).start(); + LOGGER.info("Completed sentence variety tab creation"); + } + + private static DoughnutChart buildChart(final Map buckets) { + final DoughnutChart chart = new DoughnutChart( + FXCollections.observableArrayList(buckets.entrySet() + .stream() + .map(entry -> new PieChart.Data(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()))); + chart.setLegendVisible(true); +// chart.setLabelsVisible(false); + return chart; + } + + private static void addTooltips(final Map buckets, final DoughnutChart chart) { + final Iterator iterator = buckets.values().iterator(); + final double totalSentences = buckets.values().stream().mapToDouble(value -> value).sum(); + for (final Object item: chart.getData()) { + final PieChart.Data data = (PieChart.Data) item; + final double bucketPercentage = iterator.next() / totalSentences; + final Tooltip tooltip = new Tooltip(StringFormatter.formatPercentage(bucketPercentage)); + tooltip.setShowDelay(Duration.seconds(0)); + tooltip.setShowDuration(Duration.INDEFINITE); + Tooltip.install(data.getNode(), tooltip); + } + } + + private static Map calculateSentenceBuckets(final Block block) { + final Map buckets = new HashMap<>(); + BUCKETS.forEach(bucket -> buckets.put(bucket, 0)); + for (final Sentence sentence : block.getSentences()) { + final Integer numOfWords = sentence.getWordCount(); + if (numOfWords < 10) { + buckets.put(BUCKET_LT_10, buckets.get(BUCKET_LT_10)+1); + } else if (numOfWords >= 10 && numOfWords <= 19) { + buckets.put(BUCKET_10_TO_19, buckets.get(BUCKET_10_TO_19)+1); + } else if (numOfWords >= 20 && numOfWords <= 29) { + buckets.put(BUCKET_20_TO_29, buckets.get(BUCKET_20_TO_29)+1); + } else if (numOfWords >= 30 && numOfWords <= 39) { + buckets.put(BUCKET_30_TO_39, buckets.get(BUCKET_30_TO_39)+1); + } else if (numOfWords >= 40) { + buckets.put(BUCKET_GT_40, buckets.get(BUCKET_GT_40)+1); + } + } + return buckets; + } + + private static Map calculateSentenceBuckets(final List blockList) { + final Map buckets = new HashMap<>(); + BUCKETS.forEach(bucket -> buckets.put(bucket, 0)); + for (final Block block : blockList) { + final Map blockBuckets = calculateSentenceBuckets(block); + BUCKETS.forEach(bucket -> buckets.put(bucket, buckets.get(bucket) + blockBuckets.get(bucket))); + } + return buckets; + } + + private static Color getColorForSentenceLength(final int numOfWords) { + if (numOfWords < 10) { + return Color.web("#f3622d"); + } else if (numOfWords >= 10 && numOfWords <=19) { + return Color.web("#fba71b"); + } else if (numOfWords >= 20 && numOfWords <=29) { + return Color.web("#57b757"); + } else if (numOfWords >= 30 && numOfWords <=39) { + return Color.web("#41a9c9"); + } else if (numOfWords >= 40) { + return Color.web("#4258c9"); + } else { + return Color.web("#c84164"); + } + } + + private static double getBlockStdDev(final Block block) { + final List blockSentenceLengths = block.getSentences().stream() + .map(Sentence::getWordCount) + .collect(Collectors.toList()); + return computeStandardDeviation(blockSentenceLengths); + } + + private static double computeStandardDeviation(final List collection) { + if (collection.size() == 0) { + return Double.NaN; + } + + final double average = + collection.stream() + .mapToDouble((x) -> x.doubleValue()) + .summaryStatistics() + .getAverage(); + + final double rawSum = + collection.stream() + .mapToDouble((x) -> Math.pow(x.doubleValue() - average, + 2.0)) + .sum(); + + return Math.sqrt(rawSum / (collection.size() - 1)); + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/structure/BookStructureReportTab.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/structure/BookStructureReportTab.java new file mode 100644 index 0000000..c431c64 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/structure/BookStructureReportTab.java @@ -0,0 +1,89 @@ +package com.o3.storyinspector.gui.reportarea.structure; + +import com.o3.storyinspector.gui.skin.Styles; +import com.o3.storyinspector.gui.utils.IconUtils; +import com.o3.storyinspector.gui.utils.StringFormatter; +import com.o3.storyinspector.gui.view.BorderedTitledPane; +import com.o3.storyinspector.gui.view.LineBreakSeparator; +import com.o3.storyinspector.storydom.Book; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import org.controlsfx.glyphfont.FontAwesome; + +public class BookStructureReportTab extends Tab { + + public BookStructureReportTab(Book book) { + super(book.getTitle() + " (Book Structure)"); + this.setGraphic(IconUtils.getIcon(FontAwesome.Glyph.TREE)); + + VBox stackedTitledPanes = new VBox(); + + // chapter length chart + final TitledPane chapterLengthChart = new TitledPane("Chapters Length", ChapterLengthChart.build(book)); + chapterLengthChart.setExpanded(true); + stackedTitledPanes.getChildren().add(chapterLengthChart); + + // dynamic panes per chapter + book.getChapters().forEach(chapter -> { + final HBox wordcountBox = new HBox(); + final Node wordcountIcon = IconUtils.getIcon(FontAwesome.Glyph.CALCULATOR); + final Label wordcountLabel = new Label(" " + StringFormatter.formatInteger(chapter.getMetadata().getWordCount()) + " words"); + wordcountBox.getChildren().addAll(wordcountIcon, wordcountLabel); + final HBox readabilityBox = new HBox(); + final Node readabilityIcon = IconUtils.getIcon(FontAwesome.Glyph.PENCIL); + final Label readabilityLabel = new Label("Readability: " + chapter.getMetadata().getFkGrade() + " FK score"); + readabilityBox.getChildren().addAll(readabilityIcon, readabilityLabel); + final VBox headerBox = new VBox(); + headerBox.getChildren().addAll(wordcountBox, readabilityBox); + + // characters + final FlowPane layoutCharacters = new FlowPane(); + layoutCharacters.setHgap(5); + layoutCharacters.setVgap(5); + chapter.getMetadata().getCharacters().getCharacters() + .forEach(character -> { + final MenuItem menuItem1 = new MenuItem("Rename Character"); + final MenuItem menuItem2 = new MenuItem("Delete Character"); + final MenuButton menuButton = new MenuButton(character.getName(), + IconUtils.getIcon(FontAwesome.Glyph.USER), + menuItem1, menuItem2); + menuButton.getStyleClass().add(Styles.BUTTON_CHARACTER); + layoutCharacters.getChildren().add(menuButton); + }); + final BorderedTitledPane characterPane = new BorderedTitledPane("Characters", layoutCharacters); + + // locations + final FlowPane layoutLocations = new FlowPane(); + layoutLocations.setHgap(5); + layoutLocations.setVgap(5); + chapter.getMetadata().getLocations().getLocations() + .forEach( location -> { + final MenuItem menuItem1 = new MenuItem("Rename Location"); + final MenuItem menuItem2 = new MenuItem("Delete Location"); + final MenuButton menuButton = new MenuButton(location.getName(), + IconUtils.getIcon(FontAwesome.Glyph.MAP_MARKER), + menuItem1, menuItem2); + menuButton.getStyleClass().add(Styles.BUTTON_LOCATION); + layoutLocations.getChildren().add(menuButton); + }); + final BorderedTitledPane locationPane = new BorderedTitledPane("Locations", layoutLocations); + + // complete chapter pane layout + final VBox vbox = new VBox(); + vbox.getChildren().addAll(headerBox, new LineBreakSeparator(), characterPane, new LineBreakSeparator(), locationPane); + final TitledPane chapterPane = new TitledPane(chapter.getTitle(), vbox); + stackedTitledPanes.getChildren().add(chapterPane); + chapterPane.setExpanded(true); + }); + + // scrollable content + final ScrollPane scrollPane = new ScrollPane(stackedTitledPanes); + scrollPane.fitToWidthProperty().set(true); + scrollPane.fitToHeightProperty().set(true); + + this.setContent(scrollPane); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/structure/ChapterLengthChart.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/structure/ChapterLengthChart.java new file mode 100644 index 0000000..3cfdd42 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/structure/ChapterLengthChart.java @@ -0,0 +1,57 @@ +package com.o3.storyinspector.gui.reportarea.structure; + +import com.o3.storyinspector.gui.utils.StringFormatter; +import com.o3.storyinspector.storydom.Book; +import com.o3.storyinspector.storydom.Chapter; +import javafx.scene.chart.*; +import javafx.scene.control.Tooltip; +import javafx.util.Duration; + +public class ChapterLengthChart extends BarChart { + + static int TRIM_LEN = 20; + + public static ChapterLengthChart build(final Book book) { + // chapters axis + CategoryAxis xAxis = new CategoryAxis(); + xAxis.setTickLabelRotation(-45); + // number of words axis + NumberAxis yAxis = new NumberAxis(); + yAxis.setLabel("word count"); + + final ChapterLengthChart chart = new ChapterLengthChart(xAxis, yAxis); + + // add data + XYChart.Series dataSeries1 = new XYChart.Series(); + dataSeries1.setName(book.getTitle()); + book.getChapters().stream().forEach(chapter -> { + final Data data = new XYChart.Data<>(StringFormatter.trimText(chapter.getTitle(), TRIM_LEN), + Integer.valueOf(chapter.getMetadata().getWordCount())); + dataSeries1.getData().add(data); + }); + chart.getData().add(dataSeries1); + + // tooltip (hover box) + int chapterCount = 0; + for (final Object item: dataSeries1.getData()) { + final Data data = (Data) item; + final Chapter chapter = book.getChapters().get(chapterCount++); + final String wordcount = StringFormatter.formatInteger(chapter.getMetadata().getWordCount()); + final Tooltip tooltip = new Tooltip(chapter.getTitle() + "\n" + wordcount + " words"); + tooltip.setShowDelay(Duration.seconds(0)); + tooltip.setShowDuration(Duration.INDEFINITE); + Tooltip.install(data.getNode(), tooltip); + } + + // formatting + chart.setLegend(null); + chart.setMinHeight(300); + chart.setMinWidth(35 * book.getChapters().size()); + + return chart; + } + + private ChapterLengthChart(Axis axis, Axis axis1) { + super(axis, axis1); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/task/TaskTab.java b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/task/TaskTab.java new file mode 100644 index 0000000..1434ea5 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/reportarea/task/TaskTab.java @@ -0,0 +1,19 @@ +package com.o3.storyinspector.gui.reportarea.task; + +import com.o3.storyinspector.gui.status.TaskManager; +import com.o3.storyinspector.gui.utils.I18N; +import javafx.scene.control.Tab; +import org.controlsfx.control.TaskProgressView; + +public class TaskTab extends Tab { + + static String REPORT_TASK_TAB_TITLE = "reportTaskTabTitle"; + + TaskProgressView taskProgressView; + + public TaskTab() { + super(I18N.stringFor(REPORT_TASK_TAB_TITLE)); + taskProgressView = TaskManager.getInstance().getTaskProgressView(); + this.setContent(taskProgressView); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/skin/Styles.java b/app-gui/src/main/java/com/o3/storyinspector/gui/skin/Styles.java new file mode 100644 index 0000000..a6a2519 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/skin/Styles.java @@ -0,0 +1,13 @@ +package com.o3.storyinspector.gui.skin; + +public final class Styles { + + public static String STORY_INSPECTOR_CSS = "storyinspector.css"; + + public static String BUTTON_CHARACTER = "buttonCharacter"; + public static String BUTTON_LOCATION = "buttonLocation"; + + public static String BORDERED_TITLED_TITLE = "bordered-titled-title"; + public static String BORDERED_TITLED_CONTENT = "bordered-titled-content"; + public static String BORDERED_TITLED_BORDER = "bordered-titled-border"; +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/status/StoryInspectorStatusBar.java b/app-gui/src/main/java/com/o3/storyinspector/gui/status/StoryInspectorStatusBar.java new file mode 100644 index 0000000..94c0291 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/status/StoryInspectorStatusBar.java @@ -0,0 +1,10 @@ +package com.o3.storyinspector.gui.status; + +import org.controlsfx.control.StatusBar; + +public class StoryInspectorStatusBar extends StatusBar { + + public StoryInspectorStatusBar() { + + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/status/TaskManager.java b/app-gui/src/main/java/com/o3/storyinspector/gui/status/TaskManager.java new file mode 100644 index 0000000..a2b4185 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/status/TaskManager.java @@ -0,0 +1,34 @@ +package com.o3.storyinspector.gui.status; + +import javafx.concurrent.Task; +import org.controlsfx.control.TaskProgressView; + +import java.util.ArrayList; +import java.util.List; + +public class TaskManager { + + static TaskManager singleton; + + List tasks = new ArrayList<>(); + + TaskProgressView taskProgressView = new TaskProgressView(); + + public static TaskManager getInstance() { + if (singleton == null) singleton = new TaskManager(); + return singleton; + } + + public void addTask(final Task task) { + this.tasks.add(task); + this.taskProgressView.getTasks().add(task); + } + + public List getTasks() { + return tasks; + } + + public TaskProgressView getTaskProgressView() { + return taskProgressView; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/utils/I18N.java b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/I18N.java new file mode 100644 index 0000000..7c23485 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/I18N.java @@ -0,0 +1,27 @@ +package com.o3.storyinspector.gui.utils; + +import java.util.Locale; +import java.util.ResourceBundle; + +public class I18N { + + static I18N singleton = new I18N(); + + Locale currentLocale; + ResourceBundle messages; + + private I18N() { + final String BUNDLE_FILENAME = "storyinspectori18n"; + currentLocale = new Locale("en", "US"); + messages = ResourceBundle.getBundle(BUNDLE_FILENAME, currentLocale); + } + + public static I18N getInstance() { + + return singleton; + } + + public static String stringFor(final String id) { + return getInstance().messages.getString(id); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/utils/IconUtils.java b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/IconUtils.java new file mode 100644 index 0000000..c7a0de5 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/IconUtils.java @@ -0,0 +1,15 @@ +package com.o3.storyinspector.gui.utils; + +import javafx.scene.Node; +import org.controlsfx.glyphfont.FontAwesome; +import org.controlsfx.glyphfont.GlyphFont; +import org.controlsfx.glyphfont.GlyphFontRegistry; + +public class IconUtils { + + public static Node getIcon(FontAwesome.Glyph glyph) { + GlyphFont fontAwesome = GlyphFontRegistry.font("FontAwesome"); + final Node result = fontAwesome.create(glyph.getChar()); + return result; + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/utils/StringFormatter.java b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/StringFormatter.java new file mode 100644 index 0000000..d0bf3b4 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/StringFormatter.java @@ -0,0 +1,29 @@ +package com.o3.storyinspector.gui.utils; + +import java.text.DecimalFormat; + +public class StringFormatter { + + static String FORMAT_NUMBER_INTEGER = "numberInteger"; + static String FORMAT_NUMBER_PERCENT = "numberPercent"; + + public static String formatInteger(final double value) { + final DecimalFormat df = new DecimalFormat(I18N.stringFor(FORMAT_NUMBER_INTEGER)); + return df.format(value); + } + + public static String formatInteger(final String value) { + return formatInteger(Integer.valueOf(value)); + } + + public static String formatPercentage(final double value) { + final DecimalFormat df = new DecimalFormat(I18N.stringFor(FORMAT_NUMBER_PERCENT)); + return df.format(value * 100); + } + + public static String trimText(final String text, final int trimLen) { + if (text == null || text.length() < trimLen) return text; + return text.substring(0, trimLen) + "..."; + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/utils/StringUtils.java b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/StringUtils.java new file mode 100644 index 0000000..785ddfa --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/utils/StringUtils.java @@ -0,0 +1,9 @@ +package com.o3.storyinspector.gui.utils; + +public class StringUtils { + + public static boolean isEmpty(final String str) { + return (str == null || str.isBlank()); + } + +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/view/BorderedTitledPane.java b/app-gui/src/main/java/com/o3/storyinspector/gui/view/BorderedTitledPane.java new file mode 100644 index 0000000..b7b81e4 --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/view/BorderedTitledPane.java @@ -0,0 +1,26 @@ +package com.o3.storyinspector.gui.view; + +import com.o3.storyinspector.gui.skin.Styles; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; + +/** + * Places content in a bordered pane with a title. + */ +public class BorderedTitledPane extends StackPane { + + public BorderedTitledPane(String titleString, Node content) { + final Label title = new Label(" " + titleString + " "); + title.getStyleClass().add(Styles.BORDERED_TITLED_TITLE); + StackPane.setAlignment(title, Pos.TOP_LEFT); + + final StackPane contentPane = new StackPane(); + content.getStyleClass().add(Styles.BORDERED_TITLED_CONTENT); + contentPane.getChildren().add(content); + + getStyleClass().add(Styles.BORDERED_TITLED_BORDER); + getChildren().addAll(title, contentPane); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/view/DoughnutChart.java b/app-gui/src/main/java/com/o3/storyinspector/gui/view/DoughnutChart.java new file mode 100644 index 0000000..54d0d5d --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/view/DoughnutChart.java @@ -0,0 +1,71 @@ +package com.o3.storyinspector.gui.view; + +import javafx.collections.ObservableList; +import javafx.geometry.Bounds; +import javafx.scene.Node; +import javafx.scene.chart.PieChart; +import javafx.scene.layout.Pane; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; + +public class DoughnutChart extends PieChart { + private final Circle innerCircle; + + public DoughnutChart(final ObservableList pieData) { + super(pieData); + + innerCircle = new Circle(); + + innerCircle.setFill(Color.WHITESMOKE); + innerCircle.setStroke(Color.WHITE); + innerCircle.setStrokeWidth(3); + } + + @Override + protected void layoutChartChildren(double top, double left, double contentWidth, double contentHeight) { + super.layoutChartChildren(top, left, contentWidth, contentHeight); + + addInnerCircleIfNotPresent(); + updateInnerCircleLayout(); + } + + private void addInnerCircleIfNotPresent() { + if (getData().size() > 0) { + final Node pie = getData().get(0).getNode(); + if (pie.getParent() instanceof Pane) { + final Pane parent = (Pane) pie.getParent(); + + if (!parent.getChildren().contains(innerCircle)) { + parent.getChildren().add(innerCircle); + } + } + } + } + + private void updateInnerCircleLayout() { + double minX = Double.MAX_VALUE, minY = Double.MAX_VALUE; + double maxX = Double.MIN_VALUE, maxY = Double.MIN_VALUE; + for (final PieChart.Data data: getData()) { + final Node node = data.getNode(); + + final Bounds bounds = node.getBoundsInParent(); + if (bounds.getMinX() < minX) { + minX = bounds.getMinX(); + } + if (bounds.getMinY() < minY) { + minY = bounds.getMinY(); + } + if (bounds.getMaxX() > maxX) { + maxX = bounds.getMaxX(); + } + if (bounds.getMaxY() > maxY) { + maxY = bounds.getMaxY(); + } + } + + innerCircle.setCenterX(minX + (maxX - minX) / 2); + innerCircle.setCenterY(minY + (maxY - minY) / 2); + + innerCircle.setRadius((maxX - minX) / 4); + } +} \ No newline at end of file diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/view/LineBreakSeparator.java b/app-gui/src/main/java/com/o3/storyinspector/gui/view/LineBreakSeparator.java new file mode 100644 index 0000000..d807f2c --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/view/LineBreakSeparator.java @@ -0,0 +1,9 @@ +package com.o3.storyinspector.gui.view; + +import javafx.scene.control.Label; + +public class LineBreakSeparator extends Label { + public LineBreakSeparator() { + super("\n"); + } +} diff --git a/app-gui/src/main/java/com/o3/storyinspector/gui/view/StackedAreaChartWithMarkers.java b/app-gui/src/main/java/com/o3/storyinspector/gui/view/StackedAreaChartWithMarkers.java new file mode 100644 index 0000000..5e4b55b --- /dev/null +++ b/app-gui/src/main/java/com/o3/storyinspector/gui/view/StackedAreaChartWithMarkers.java @@ -0,0 +1,83 @@ +package com.o3.storyinspector.gui.view; + +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.chart.Axis; +import javafx.scene.chart.StackedAreaChart; +import javafx.scene.shape.Line; + +import java.util.Objects; + +public class StackedAreaChartWithMarkers extends StackedAreaChart { + + private ObservableList> horizontalMarkers; + private ObservableList> verticalMarkers; + + public StackedAreaChartWithMarkers(final Axis xAxis, final Axis yAxis) { + super(xAxis, yAxis); + horizontalMarkers = FXCollections.observableArrayList(data -> new Observable[] {data.YValueProperty()}); + horizontalMarkers.addListener((InvalidationListener) observable -> layoutPlotChildren()); + verticalMarkers = FXCollections.observableArrayList(data -> new Observable[] {data.XValueProperty()}); + verticalMarkers.addListener((InvalidationListener)observable -> layoutPlotChildren()); + } + + public void addHorizontalValueMarker(Data marker) { + Objects.requireNonNull(marker, "the marker must not be null"); + if (horizontalMarkers.contains(marker)) return; + Line line = new Line(); + marker.setNode(line ); + getPlotChildren().add(line); + horizontalMarkers.add(marker); + } + + public void removeHorizontalValueMarker(Data marker) { + Objects.requireNonNull(marker, "the marker must not be null"); + if (marker.getNode() != null) { + getPlotChildren().remove(marker.getNode()); + marker.setNode(null); + } + horizontalMarkers.remove(marker); + } + + public void addVerticalValueMarker(Data marker) { + Objects.requireNonNull(marker, "the marker must not be null"); + if (verticalMarkers.contains(marker)) return; + Line line = new Line(); + marker.setNode(line ); + getPlotChildren().add(line); + verticalMarkers.add(marker); + } + + public void removeVerticalValueMarker(Data marker) { + Objects.requireNonNull(marker, "the marker must not be null"); + if (marker.getNode() != null) { + getPlotChildren().remove(marker.getNode()); + marker.setNode(null); + } + verticalMarkers.remove(marker); + } + + @Override + protected void layoutPlotChildren() { + super.layoutPlotChildren(); + for (Data horizontalMarker : horizontalMarkers) { + Line line = (Line) horizontalMarker.getNode(); + line.setStartX(0); + line.setEndX(getBoundsInLocal().getWidth()); + line.setStartY(getYAxis().getDisplayPosition(horizontalMarker.getYValue()) + 0.5); // 0.5 for crispness + line.setEndY(line.getStartY()); + line.toFront(); + } + for (Data verticalMarker : verticalMarkers) { + Line line = (Line) verticalMarker.getNode(); + line.setStartX(getXAxis().getDisplayPosition(verticalMarker.getXValue()) + 0.5); // 0.5 for crispness + line.setEndX(line.getStartX()); + line.setStartY(0d); + line.setEndY(getBoundsInLocal().getHeight()); + line.toFront(); + } + } + +} \ No newline at end of file diff --git a/app-gui/src/main/resources/StoryInspector.ico b/app-gui/src/main/resources/StoryInspector.ico new file mode 100644 index 0000000..fa234a4 Binary files /dev/null and b/app-gui/src/main/resources/StoryInspector.ico differ diff --git a/app-gui/src/main/resources/emolex/anger-scores.txt b/app-gui/src/main/resources/emolex/anger-scores.txt new file mode 100644 index 0000000..99e13cc --- /dev/null +++ b/app-gui/src/main/resources/emolex/anger-scores.txt @@ -0,0 +1,1483 @@ +outraged 0.964 +brutality 0.959 +hatred 0.953 +hateful 0.940 +terrorize 0.939 +infuriated 0.938 +violently 0.938 +furious 0.929 +enraged 0.927 +furiously 0.927 +screwyou 0.924 +murderer 0.922 +fury 0.922 +execution 0.917 +angered 0.916 +savagery 0.915 +slaughtering 0.914 +veryangry 0.913 +assassinate 0.912 +annihilation 0.912 +fuckoff 0.912 +rage 0.911 +loathe 0.909 +damnation 0.906 +fucktard 0.906 +homicidal 0.906 +roadrage 0.906 +furor 0.900 +hostile 0.898 +annihilate 0.898 +murder 0.897 +raging 0.896 +explosive 0.894 +infuriates 0.894 +pissed 0.894 +ferocious 0.894 +obliterated 0.894 +rape 0.894 +vengeful 0.894 +sopissed 0.894 +killing 0.893 +combative 0.891 +gofuckyourself 0.886 +vengeance 0.886 +wrath 0.885 +torment 0.885 +vicious 0.884 +massacre 0.882 +threatening 0.882 +abhorrent 0.875 +pissoff 0.875 +bloodthirsty 0.875 +fighting 0.868 +attacking 0.865 +annihilated 0.865 +bloodshed 0.864 +angriest 0.864 +smite 0.862 +brawl 0.861 +malicious 0.859 +tirade 0.859 +assault 0.859 +hostility 0.859 +explode 0.859 +assassination 0.859 +strangle 0.859 +loathsome 0.857 +murderous 0.853 +attack 0.853 +hell 0.853 +malice 0.852 +terrorism 0.851 +beating 0.849 +desecration 0.848 +pissingmeoff 0.848 +outrage 0.848 +destroying 0.844 +irate 0.844 +infuriate 0.844 +stab 0.844 +violent 0.844 +tumultuous 0.844 +abomination 0.844 +slaughter 0.844 +obliterate 0.843 +belligerent 0.841 +dumbbitch 0.841 +detest 0.838 +hostilities 0.837 +prick 0.835 +torture 0.833 +rabid 0.833 +rampage 0.833 +horrid 0.833 +cruelty 0.833 +despicable 0.828 +tyrannical 0.828 +demonic 0.828 +hating 0.828 +ragemode 0.828 +hate 0.828 +satanic 0.828 +ruinous 0.825 +condemn 0.825 +dickhead 0.824 +demolish 0.824 +angry 0.824 +riots 0.824 +extermination 0.824 +livid 0.821 +madman 0.820 +vindictive 0.819 +terrorist 0.818 +threaten 0.818 +hateyou 0.818 +effyou 0.818 +ferocity 0.818 +venomous 0.818 +abhor 0.816 +savage 0.814 +atrocity 0.814 +carnage 0.814 +angrytweet 0.812 +barbaric 0.812 +vendetta 0.812 +destroyer 0.812 +pissedoff 0.812 +abuse 0.812 +fuming 0.812 +pissesmeoff 0.812 +berserk 0.812 +fierce 0.812 +fucksake 0.812 +tyrant 0.812 +anger 0.811 +pieceofshit 0.810 +homicide 0.803 +slam 0.803 +punching 0.803 +bitch 0.803 +fights 0.803 +punched 0.803 +ruthless 0.797 +destructive 0.797 +villainous 0.797 +slap 0.791 +yelling 0.788 +ragetweet 0.788 +punishing 0.788 +diabolical 0.788 +riot 0.788 +growthefuckup 0.788 +destroyed 0.788 +retaliatory 0.788 +slaughterhouse 0.788 +manslaughter 0.783 +clash 0.783 +detonation 0.781 +sinister 0.781 +hellish 0.781 +quarrel 0.781 +bloody 0.781 +loath 0.781 +treacherous 0.779 +fumin 0.779 +hateeee 0.779 +accusing 0.779 +horrific 0.773 +revulsion 0.773 +madder 0.773 +retaliate 0.773 +scorn 0.769 +deplorable 0.766 +bomb 0.766 +resent 0.765 +devastation 0.765 +anarchist 0.765 +firestorm 0.765 +contemptible 0.764 +shittest 0.760 +smash 0.758 +cruel 0.758 +soangry 0.758 +rant 0.758 +deadly 0.758 +outburst 0.757 +snarl 0.754 +offend 0.750 +crazed 0.750 +revolting 0.750 +aggravating 0.750 +horror 0.750 +despise 0.750 +dontmesswithme 0.750 +stfu 0.750 +growling 0.750 +profane 0.750 +vulgarity 0.750 +douchebags 0.750 +fuckedoff 0.742 +violence 0.742 +molestation 0.742 +screaming 0.742 +erupt 0.742 +horrible 0.742 +threat 0.742 +bastards 0.741 +revenge 0.738 +catastrophe 0.735 +menacing 0.735 +damn 0.735 +demon 0.735 +crushing 0.735 +thrash 0.734 +riotous 0.734 +fedup 0.734 +deplore 0.734 +warfare 0.734 +argue 0.734 +vehement 0.734 +persecute 0.734 +flog 0.734 +revolt 0.734 +altercation 0.729 +warlike 0.728 +shitday 0.727 +castrate 0.727 +mutiny 0.727 +sabotage 0.727 +malevolent 0.721 +strike 0.721 +disaster 0.721 +disastrous 0.720 +madden 0.719 +scream 0.719 +arseholes 0.719 +brutal 0.719 +horseshit 0.719 +bastarding 0.719 +tumult 0.719 +disdain 0.719 +devil 0.719 +slay 0.719 +aggravates 0.719 +treachery 0.719 +vermin 0.719 +scorching 0.719 +choke 0.719 +spiteful 0.719 +mutilation 0.714 +mangle 0.714 +criminal 0.714 +anarchism 0.714 +punch 0.713 +denunciation 0.713 +holocaust 0.712 +virulence 0.712 +fatal 0.712 +blasphemous 0.712 +hurting 0.712 +dontlikeyou 0.712 +dumbasses 0.712 +battled 0.712 +crucifixion 0.712 +irritated 0.706 +evil 0.706 +atrocious 0.706 +deranged 0.706 +kidnap 0.703 +aggravated 0.703 +assassin 0.703 +scolding 0.703 +dicks 0.703 +slayer 0.703 +intimidation 0.703 +persecution 0.703 +aggression 0.702 +armed 0.700 +poison 0.697 +venom 0.697 +snarling 0.697 +battle 0.697 +disgruntled 0.693 +assailant 0.691 +resentment 0.691 +insidious 0.691 +lynch 0.690 +contemptuous 0.690 +infanticide 0.688 +imprisonment 0.688 +temper 0.688 +terrible 0.688 +mad 0.688 +lunatic 0.688 +domination 0.688 +peeved 0.688 +makesmemad 0.688 +bully 0.688 +curse 0.688 +disparage 0.688 +volatility 0.687 +eradication 0.685 +devastate 0.682 +tantrum 0.682 +scoundrel 0.682 +eradicate 0.682 +aggressively 0.680 +agitation 0.680 +dictatorship 0.676 +irritates 0.676 +profanity 0.673 +shot 0.672 +expletive 0.672 +nasty 0.672 +crime 0.672 +poisonous 0.672 +corrupting 0.672 +dastardly 0.672 +shoot 0.672 +shove 0.672 +condemnation 0.672 +aggravation 0.672 +wreak 0.672 +egregious 0.672 +contempt 0.672 +crushed 0.672 +harmful 0.672 +cruelly 0.672 +maniac 0.670 +combat 0.667 +aggressive 0.667 +hit 0.667 +fight 0.667 +shout 0.667 +cutthroat 0.667 +irritable 0.667 +odious 0.667 +shooting 0.667 +hateeveryone 0.667 +kick 0.667 +eruption 0.667 +enemy 0.667 +punished 0.662 +ambush 0.661 +yell 0.661 +harass 0.659 +incense 0.656 +gore 0.656 +malignant 0.656 +grudge 0.656 +antichrist 0.656 +aggressor 0.656 +expel 0.656 +destruction 0.656 +cranky 0.653 +growl 0.652 +slave 0.652 +spank 0.652 +denounce 0.652 +reprisal 0.652 +insulting 0.652 +clashing 0.652 +insurrection 0.652 +offended 0.652 +animosity 0.652 +growls 0.649 +executioner 0.644 +twat 0.644 +doomsday 0.643 +arson 0.641 +grr 0.641 +daemon 0.641 +spat 0.641 +obscenity 0.641 +havoc 0.641 +shackle 0.641 +accused 0.641 +feud 0.641 +expulsion 0.641 +indignant 0.641 +reprimand 0.641 +inexcusable 0.641 +bombard 0.641 +somad 0.637 +spanking 0.636 +suicidal 0.636 +anarchy 0.636 +combatant 0.636 +hanging 0.636 +poisoned 0.636 +frustrated 0.636 +wound 0.636 +glaring 0.636 +batter 0.636 +disgusting 0.636 +kicking 0.636 +inflict 0.633 +wrecked 0.633 +grievous 0.632 +prosecute 0.630 +agitated 0.630 +cheat 0.630 +swastika 0.627 +raid 0.625 +cursing 0.625 +harassing 0.625 +provocation 0.625 +strife 0.625 +suffocation 0.625 +defamatory 0.625 +scourge 0.625 +injure 0.625 +enslaved 0.625 +indict 0.625 +betray 0.625 +thundering 0.625 +arsehole 0.624 +jerk 0.621 +insane 0.621 +retaliation 0.621 +deprivation 0.621 +convict 0.621 +theft 0.621 +irritate 0.621 +fiend 0.621 +cussed 0.619 +turmoil 0.618 +smack 0.615 +retribution 0.614 +slavery 0.609 +irritability 0.609 +bitterly 0.609 +battery 0.609 +antagonism 0.609 +twats 0.609 +oppressor 0.609 +injurious 0.609 +intolerable 0.609 +gang 0.609 +rebellion 0.609 +collision 0.609 +adverse 0.609 +disgraced 0.608 +revolution 0.606 +diatribe 0.606 +asshole 0.606 +ranting 0.606 +thug 0.606 +antagonistic 0.606 +blast 0.606 +sickening 0.606 +irritating 0.606 +irks 0.606 +bombardment 0.606 +discrimination 0.606 +frustrate 0.604 +oppression 0.603 +insult 0.603 +tiredofit 0.603 +manipulation 0.603 +bigot 0.603 +tension 0.603 +hurtful 0.603 +disgust 0.602 +spite 0.600 +intrusive 0.598 +harshness 0.597 +slur 0.596 +wretch 0.594 +invasion 0.594 +morbidity 0.594 +assail 0.594 +tempest 0.594 +miserable 0.594 +puncture 0.594 +casualty 0.594 +bitterness 0.594 +inferno 0.594 +storming 0.594 +consternation 0.592 +raving 0.591 +guilty 0.591 +depraved 0.591 +immoral 0.591 +forcibly 0.591 +overpowering 0.591 +guillotine 0.591 +recalcitrant 0.588 +accursed 0.588 +invader 0.588 +scare 0.588 +screwed 0.588 +soannoyed 0.588 +jealousy 0.587 +indignation 0.587 +vexed 0.586 +confront 0.582 +brute 0.581 +throttle 0.579 +bickering 0.578 +coup 0.578 +defiant 0.578 +criminality 0.578 +provoking 0.578 +conflict 0.578 +revolver 0.578 +butcher 0.578 +lash 0.578 +incarceration 0.578 +contentious 0.578 +shutit 0.578 +yousuck 0.578 +damage 0.578 +wreck 0.578 +pillage 0.578 +shutup 0.578 +blaze 0.578 +slut 0.578 +cancer 0.577 +blasphemy 0.576 +disturbance 0.576 +dontmess 0.576 +standoff 0.576 +pernicious 0.576 +alienation 0.576 +gun 0.576 +discord 0.576 +grope 0.576 +chaotic 0.576 +frustration 0.576 +gory 0.576 +condescension 0.576 +discriminate 0.576 +friggen 0.575 +death 0.574 +lunacy 0.574 +jab 0.574 +oppressive 0.574 +cursed 0.574 +monstrosity 0.574 +scandalous 0.574 +sneer 0.574 +shit 0.573 +slash 0.571 +disparaging 0.571 +unfair 0.571 +gallows 0.570 +escalate 0.569 +intolerant 0.564 +lawlessness 0.563 +grouchy 0.562 +bellows 0.562 +traitor 0.562 +frightful 0.562 +perdition 0.562 +slander 0.562 +taunt 0.562 +invade 0.562 +wrangling 0.562 +malign 0.562 +bluddy 0.562 +arghh 0.562 +dreadful 0.562 +bearish 0.562 +derogatory 0.562 +glare 0.562 +deceived 0.562 +torpedo 0.562 +retards 0.562 +beast 0.562 +cross 0.561 +hurt 0.561 +banshee 0.561 +uncontrollable 0.561 +shatter 0.561 +jeopardize 0.561 +devastating 0.561 +conflagration 0.561 +thief 0.561 +idiots 0.561 +fits 0.561 +grating 0.561 +rave 0.561 +dissension 0.561 +betrayal 0.561 +disturbed 0.559 +subjugation 0.559 +stomped 0.557 +grab 0.557 +ticked 0.556 +grievance 0.556 +masochism 0.556 +defiance 0.552 +blackmail 0.550 +offensive 0.549 +decry 0.548 +sin 0.547 +violation 0.547 +confine 0.547 +fustrated 0.547 +overbearing 0.547 +deceive 0.547 +misery 0.547 +rebel 0.547 +punishment 0.547 +firearms 0.547 +darkside 0.547 +arghhhh 0.547 +disparity 0.547 +frustrates 0.547 +disgraceful 0.547 +shrill 0.547 +ire 0.547 +preposterous 0.547 +hadenough 0.546 +stolen 0.546 +prejudice 0.545 +annoyin 0.545 +humiliate 0.545 +resentful 0.545 +conspirator 0.545 +callous 0.545 +ruined 0.545 +adversary 0.545 +menace 0.545 +wanker 0.545 +antagonist 0.545 +skirmish 0.545 +tackle 0.545 +heated 0.545 +foul 0.545 +argument 0.545 +sting 0.544 +grumble 0.544 +robbery 0.544 +entangled 0.544 +outcry 0.544 +irreconcilable 0.543 +resistance 0.543 +obstructive 0.542 +dismay 0.540 +mob 0.538 +juststop 0.537 +badness 0.536 +ridicule 0.534 +incendiary 0.533 +flares 0.532 +uprising 0.531 +twofaced 0.531 +exacerbation 0.531 +dispute 0.531 +whip 0.531 +communism 0.531 +prejudicial 0.531 +intruder 0.531 +belittle 0.531 +confinement 0.531 +unbridled 0.531 +allegation 0.531 +reckless 0.531 +degeneracy 0.531 +dictatorial 0.530 +unjustifiable 0.530 +bigoted 0.530 +unjust 0.530 +hassle 0.530 +perversion 0.530 +offender 0.530 +fiesty 0.530 +tackled 0.530 +dissonance 0.530 +renegade 0.529 +hot 0.529 +prison 0.529 +cantstandit 0.529 +trespass 0.529 +suicide 0.521 +annoy 0.520 +leavemealone 0.517 +dishonest 0.516 +depravity 0.516 +distrust 0.516 +broil 0.516 +idiotic 0.516 +treason 0.516 +venting 0.516 +tortious 0.516 +duress 0.516 +criticize 0.516 +grrr 0.516 +inimical 0.516 +disrespectful 0.516 +cretins 0.516 +prisoner 0.516 +divorce 0.516 +chaos 0.515 +coercion 0.515 +unforgiving 0.515 +unkind 0.515 +frustrating 0.515 +bile 0.515 +unleash 0.515 +argumentation 0.515 +jerks 0.515 +pow 0.515 +grump 0.515 +hangry 0.515 +victimized 0.515 +poachers 0.515 +scold 0.515 +poaching 0.515 +roar 0.515 +tussle 0.514 +bane 0.511 +repudiation 0.510 +accusation 0.510 +enmity 0.510 +banish 0.509 +disfigured 0.508 +storm 0.507 +fear 0.500 +crazy 0.500 +anguish 0.500 +confined 0.500 +scoff 0.500 +shun 0.500 +derogation 0.500 +banished 0.500 +hammering 0.500 +brunt 0.500 +possessed 0.500 +nobodycares 0.500 +frenzied 0.500 +ordeal 0.500 +delusional 0.500 +reject 0.500 +obstruct 0.500 +foaming 0.500 +intractable 0.500 +bout 0.500 +brazen 0.500 +patronising 0.500 +rejects 0.500 +fervor 0.500 +dominate 0.500 +derision 0.500 +spear 0.500 +suppression 0.500 +animus 0.500 +unruly 0.500 +disrupting 0.500 +malpractice 0.500 +defy 0.500 +injustice 0.500 +antithesis 0.500 +getoveryourself 0.495 +toughness 0.492 +stupidpeople 0.492 +madness 0.491 +sinful 0.491 +oppress 0.490 +avarice 0.490 +revoke 0.485 +incest 0.485 +smuggler 0.485 +avenger 0.485 +disapproved 0.485 +demand 0.485 +stayaway 0.485 +claw 0.485 +infraction 0.485 +cutting 0.485 +pervert 0.485 +fricking 0.485 +anathema 0.485 +annoyed 0.485 +disobedient 0.485 +alienate 0.485 +disservice 0.485 +abolish 0.485 +inhuman 0.485 +dissident 0.485 +complaint 0.485 +usurp 0.485 +obnoxious 0.484 +deceit 0.484 +disgrace 0.484 +opposed 0.484 +renounce 0.484 +litigious 0.484 +imprisoned 0.484 +mocking 0.484 +blame 0.484 +penalty 0.484 +thresh 0.484 +upheaval 0.484 +restrain 0.484 +strained 0.484 +sucker 0.484 +rivalry 0.484 +oust 0.484 +suspicious 0.484 +turbulence 0.483 +pound 0.481 +coldness 0.477 +ungrateful 0.472 +battalion 0.471 +stoopid 0.471 +adversity 0.470 +ram 0.470 +gall 0.470 +infidel 0.470 +annoying 0.470 +friction 0.470 +hostage 0.470 +jealous 0.470 +accuser 0.470 +feudalism 0.470 +subversion 0.470 +armament 0.470 +dispossessed 0.470 +distress 0.469 +intolerance 0.469 +subversive 0.469 +opposition 0.469 +exile 0.469 +plunder 0.469 +recidivism 0.469 +objection 0.469 +steal 0.469 +offense 0.469 +complain 0.469 +huff 0.469 +simmer 0.469 +selfish 0.469 +backoff 0.469 +incite 0.469 +angermanagement 0.469 +perpetrator 0.469 +disobey 0.469 +disruption 0.469 +smother 0.469 +injury 0.469 +selfishness 0.469 +insanity 0.469 +stifled 0.469 +thump 0.469 +dislike 0.469 +areyoukidding 0.468 +mug 0.467 +agony 0.465 +arrogant 0.461 +elimination 0.456 +picketing 0.456 +haughty 0.456 +sux 0.456 +vent 0.456 +grated 0.455 +clamor 0.455 +constraint 0.455 +stubbed 0.455 +impermeable 0.455 +illegality 0.455 +dying 0.455 +flagrant 0.455 +idiocy 0.455 +busted 0.455 +crabby 0.455 +illicit 0.455 +veto 0.455 +troublesome 0.455 +mislead 0.455 +bad 0.453 +despotism 0.453 +struggle 0.453 +usurped 0.453 +disagreeing 0.453 +hysterical 0.453 +desist 0.453 +godless 0.453 +suppress 0.453 +disapproving 0.453 +displeased 0.453 +bayonet 0.453 +intense 0.453 +unlawful 0.451 +wrongly 0.448 +repellent 0.442 +psychosis 0.441 +foe 0.441 +wrongful 0.441 +dishonor 0.441 +wasted 0.441 +aversion 0.440 +schism 0.439 +gahhh 0.439 +punitive 0.439 +knuckles 0.439 +upset 0.439 +effigy 0.439 +ultimatum 0.439 +deleterious 0.438 +mucked 0.438 +irritation 0.438 +worthless 0.438 +ransom 0.438 +separatist 0.438 +fugitive 0.438 +deny 0.438 +abandonment 0.438 +stupidity 0.438 +oblivion 0.437 +segregate 0.437 +payback 0.436 +eviction 0.435 +incongruous 0.435 +collusion 0.432 +rob 0.431 +infidelity 0.429 +ravenous 0.429 +overrun 0.429 +incredulous 0.426 +stupidrain 0.426 +martial 0.426 +painful 0.426 +harbinger 0.426 +getoverit 0.426 +rejection 0.426 +defense 0.425 +unsympathetic 0.424 +banger 0.424 +gonorrhea 0.424 +fallacious 0.424 +indecency 0.424 +exasperation 0.424 +fuss 0.424 +concealment 0.424 +powerful 0.424 +fraudulent 0.424 +defraud 0.424 +enforce 0.424 +censor 0.424 +greed 0.424 +disobedience 0.424 +commotion 0.424 +discontent 0.424 +penitentiary 0.422 +nettle 0.422 +duel 0.422 +banishment 0.422 +barb 0.422 +deportation 0.422 +sarcasm 0.422 +penetration 0.422 +bang 0.422 +scar 0.422 +cracked 0.422 +sedition 0.422 +annoyance 0.422 +cur 0.422 +snubbed 0.422 +misrepresented 0.422 +blatant 0.420 +force 0.418 +perverse 0.415 +wring 0.415 +grim 0.413 +bastion 0.413 +sordid 0.412 +nothappy 0.412 +moody 0.412 +tiff 0.412 +surly 0.412 +hunting 0.411 +indenture 0.410 +areyoukiddingme 0.409 +reproach 0.409 +compulsion 0.409 +sham 0.409 +cantwin 0.409 +supremacy 0.409 +disappoint 0.409 +squelch 0.409 +forfeit 0.409 +awful 0.409 +detainee 0.409 +implicate 0.409 +blockade 0.409 +sneak 0.409 +contradict 0.409 +inept 0.409 +lying 0.408 +antipathy 0.406 +delusion 0.406 +unthinkable 0.406 +wop 0.406 +tremor 0.406 +onerous 0.406 +forsaken 0.406 +inequality 0.406 +badger 0.406 +cacophony 0.406 +wrongdoing 0.406 +epidemic 0.406 +rail 0.406 +nuisance 0.406 +scrapie 0.406 +arguments 0.404 +affront 0.403 +traumatic 0.402 +sodding 0.400 +libel 0.400 +annoys 0.400 +soslow 0.398 +watchout 0.398 +frenetic 0.397 +remiss 0.397 +barge 0.396 +fraud 0.394 +howl 0.394 +confiscate 0.394 +boxing 0.394 +nag 0.394 +actionable 0.394 +illegal 0.394 +keyed 0.394 +disrespect 0.394 +dangit 0.394 +extinguish 0.394 +sue 0.394 +untoward 0.394 +rabble 0.394 +unfriendly 0.394 +whatsthepoint 0.394 +brimstone 0.392 +earthquake 0.391 +grrrrr 0.391 +rigged 0.391 +argh 0.391 +pique 0.391 +recklessness 0.391 +dissolution 0.391 +disagree 0.389 +lawsuit 0.386 +despair 0.382 +disused 0.382 +immorality 0.382 +incurable 0.379 +pokes 0.379 +falsification 0.379 +coerce 0.379 +touchy 0.379 +firstworldprobs 0.379 +sore 0.379 +difficulty 0.379 +rifle 0.379 +sizzle 0.379 +picket 0.378 +concussion 0.377 +stuckup 0.375 +pessimism 0.375 +remand 0.375 +pitfall 0.375 +rawr 0.375 +cannon 0.375 +infantile 0.375 +disillusionment 0.375 +sly 0.375 +petpeeve 0.375 +militia 0.375 +faulty 0.375 +inhibit 0.371 +vindicate 0.371 +nepotism 0.371 +distressing 0.371 +schizophrenia 0.369 +skewed 0.368 +disreputable 0.368 +forbidding 0.368 +conquest 0.367 +bark 0.365 +leukemia 0.365 +unhappy 0.364 +burke 0.364 +warrior 0.364 +disapprove 0.364 +challenge 0.364 +retarded 0.364 +belt 0.364 +barks 0.364 +opinionated 0.359 +restriction 0.359 +incompetence 0.359 +polemic 0.359 +loudness 0.359 +paucity 0.359 +controversial 0.359 +aftermath 0.359 +disliked 0.359 +litigate 0.359 +sectarian 0.359 +cad 0.359 +broken 0.359 +interrupting 0.358 +fussy 0.357 +wench 0.353 +remove 0.351 +misbehavior 0.351 +brat 0.351 +gruff 0.351 +scarcity 0.350 +losing 0.349 +timewasters 0.348 +lie 0.348 +stigma 0.348 +untrustworthy 0.348 +deserted 0.348 +disagreement 0.348 +disappointed 0.348 +retract 0.348 +ulcer 0.348 +pest 0.348 +hardened 0.348 +defect 0.348 +bias 0.345 +evade 0.344 +antisocial 0.344 +unreliable 0.344 +misleading 0.344 +stingy 0.344 +anxiety 0.344 +stripped 0.344 +impotence 0.344 +unsettled 0.344 +shaky 0.344 +bothering 0.344 +pirate 0.344 +negation 0.344 +shoddy 0.344 +disclaim 0.344 +deterioration 0.344 +interminable 0.343 +meddle 0.341 +disease 0.341 +warp 0.340 +averse 0.338 +alcoholism 0.338 +infamous 0.338 +row 0.337 +staticky 0.336 +illegitimate 0.333 +encumbrance 0.333 +witchcraft 0.333 +paralyzed 0.333 +ill 0.333 +interrupt 0.333 +scorpion 0.333 +sinner 0.331 +hulk 0.329 +inconsiderate 0.329 +disqualified 0.328 +tighten 0.328 +opponent 0.328 +phony 0.328 +resisting 0.328 +fib 0.328 +spammers 0.328 +dislocated 0.328 +brrr 0.328 +dashed 0.328 +prohibited 0.328 +grumpy 0.328 +victim 0.328 +crusade 0.328 +scapegoat 0.328 +hiss 0.328 +inappropriate 0.324 +haye 0.324 +loss 0.324 +eschew 0.324 +neglected 0.324 +trickery 0.324 +canker 0.323 +crunch 0.318 +criticism 0.318 +queues 0.318 +duplicity 0.318 +muff 0.318 +shriek 0.316 +depreciate 0.315 +dramaqueen 0.312 +carelessness 0.312 +dumps 0.312 +dupe 0.312 +chaff 0.312 +poverty 0.312 +mortality 0.312 +dismissal 0.312 +deflate 0.312 +revving 0.309 +disallowed 0.308 +boisterous 0.307 +thoughtless 0.307 +burial 0.304 +sullen 0.303 +theocratic 0.303 +wince 0.303 +involution 0.300 +stalemate 0.297 +talons 0.297 +hoax 0.297 +depreciated 0.297 +wasteful 0.297 +getyourown 0.297 +senseless 0.297 +depressed 0.297 +taxed 0.297 +misuse 0.297 +paralysis 0.295 +displaced 0.294 +limited 0.292 +disapointment 0.290 +orc 0.289 +ridiculous 0.289 +spine 0.288 +sharpen 0.288 +presumptuous 0.288 +teasing 0.288 +homeless 0.288 +react 0.288 +barrier 0.287 +hoot 0.287 +twitchy 0.287 +myopia 0.283 +incompatible 0.281 +disconnects 0.281 +delinquent 0.281 +contraband 0.281 +lagging 0.281 +shiver 0.281 +agh 0.281 +restitution 0.281 +flexin 0.281 +spam 0.281 +foray 0.279 +noncompliance 0.279 +buffering 0.279 +unfairness 0.279 +troll 0.279 +nether 0.278 +immaturity 0.273 +uncaring 0.273 +bugaboo 0.273 +bogus 0.273 +shock 0.269 +feisty 0.269 +rapping 0.266 +nopoint 0.266 +feminism 0.266 +pry 0.266 +humbug 0.266 +inoperative 0.266 +defendant 0.266 +latent 0.266 +notamorningperson 0.266 +quandary 0.266 +inconvenient 0.266 +bear 0.266 +interrupts 0.265 +fluctuation 0.265 +exaggerate 0.263 +lose 0.261 +stone 0.258 +soldier 0.258 +furnace 0.258 +shoplifting 0.258 +tease 0.258 +patter 0.258 +incompetent 0.257 +indoctrination 0.255 +attentionseeker 0.250 +unfollow 0.250 +nonsense 0.250 +complicate 0.250 +tripping 0.250 +untrue 0.250 +notoriety 0.250 +falsehood 0.250 +mastery 0.250 +socialist 0.250 +skid 0.250 +rocket 0.250 +noisy 0.250 +lawyer 0.250 +pouting 0.250 +cane 0.250 +fenced 0.242 +obstacle 0.242 +dontunderstand 0.242 +detract 0.242 +halter 0.242 +vampire 0.242 +capslock 0.242 +witch 0.242 +ringer 0.242 +frowning 0.239 +saber 0.238 +hunger 0.235 +tariff 0.234 +lava 0.234 +dabbling 0.234 +shell 0.234 +imtryingtosleep 0.234 +rascal 0.234 +recession 0.234 +failing 0.234 +politics 0.234 +wokemeup 0.234 +undesirable 0.231 +versus 0.227 +copycat 0.227 +darkness 0.227 +resign 0.227 +soaked 0.226 +unfulfilled 0.225 +abandoned 0.222 +unattainable 0.221 +owing 0.221 +bankruptcy 0.221 +confusion 0.219 +warden 0.219 +somethingigetalot 0.219 +tool 0.219 +compress 0.219 +misconception 0.219 +whiny 0.219 +unhelpful 0.219 +mosquito 0.219 +twitching 0.219 +nosey 0.213 +adder 0.212 +overpriced 0.212 +shortage 0.212 +melodrama 0.212 +harry 0.212 +possession 0.206 +overplayed 0.206 +desert 0.206 +unlucky 0.203 +unpaid 0.203 +backbone 0.203 +powerless 0.203 +sentence 0.203 +uninvited 0.203 +rook 0.203 +pout 0.203 +arraignment 0.203 +inefficient 0.203 +court 0.199 +endless 0.198 +misstatement 0.197 +delay 0.197 +distracted 0.197 +adverts 0.197 +misunderstanding 0.195 +inadmissible 0.191 +excite 0.191 +lightning 0.189 +mournful 0.188 +preclude 0.188 +incase 0.188 +insecure 0.188 +rating 0.182 +claimant 0.182 +mistress 0.182 +insist 0.182 +pare 0.182 +distracting 0.182 +mutter 0.182 +opium 0.180 +willful 0.176 +deserve 0.176 +insists 0.175 +treat 0.175 +liberate 0.172 +peice 0.172 +excitation 0.172 +misplace 0.172 +hormonal 0.172 +mighty 0.172 +thanksalot 0.172 +indecisive 0.172 +fee 0.172 +gibberish 0.172 +fleece 0.172 +yelp 0.168 +hamstring 0.167 +mule 0.167 +insufficiency 0.167 +insignificant 0.167 +unequal 0.167 +bargaining 0.167 +attentionseekers 0.163 +forearm 0.156 +indifference 0.156 +coop 0.156 +rheumatism 0.156 +attorney 0.152 +uncertain 0.152 +justthebeginning 0.152 +disinformation 0.152 +pretending 0.152 +involvement 0.152 +underpaid 0.152 +bee 0.152 +campaigning 0.151 +hopelessness 0.149 +feeling 0.147 +legalized 0.145 +caution 0.145 +sterling 0.141 +obliging 0.141 +subsidy 0.141 +morals 0.141 +wimpy 0.140 +bummer 0.139 +geez 0.136 +repay 0.136 +blemish 0.136 +misspell 0.136 +surcharge 0.136 +saloon 0.136 +birch 0.135 +noob 0.133 +honk 0.133 +orchestra 0.132 +wireless 0.125 +standstill 0.125 +competitive 0.125 +mosque 0.122 +inattention 0.121 +reversal 0.121 +lace 0.118 +elbow 0.117 +instinctive 0.112 +chant 0.111 +lonely 0.109 +gnome 0.109 +tolerate 0.106 +management 0.102 +advocacy 0.100 +moral 0.094 +roadworks 0.091 +honest 0.087 +gent 0.076 +forgetful 0.076 +liquor 0.075 +money 0.074 +hood 0.071 +curriculum 0.063 +words 0.062 +elf 0.061 +smell 0.061 +opera 0.061 +playful 0.061 +counsellor 0.059 +trumpet 0.059 +nurture 0.059 +asleeep 0.059 +birthplace 0.051 +ribbon 0.047 +youth 0.045 +vote 0.045 +cash 0.039 +wannasleep 0.031 +waffle 0.030 +dame 0.030 +buffet 0.029 +celebrity 0.026 +sisterhood 0.015 +autocorrect 0.015 +musical 0.011 +tree 0.000 diff --git a/app-gui/src/main/resources/emolex/anticipation-scores.txt b/app-gui/src/main/resources/emolex/anticipation-scores.txt new file mode 100644 index 0000000..91ace8c --- /dev/null +++ b/app-gui/src/main/resources/emolex/anticipation-scores.txt @@ -0,0 +1,864 @@ +anticipation 0.859 +excited 0.859 +anticipate 0.820 +excitement 0.820 +eagerness 0.812 +exciting 0.797 +expectant 0.789 +thrilling 0.781 +hope 0.773 +quest 0.766 +anticipatory 0.750 +start 0.750 +expectance 0.750 +adventure 0.750 +countdown 0.750 +expect 0.742 +excite 0.742 +climax 0.742 +prophecy 0.742 +arouse 0.742 +eager 0.742 +birth 0.734 +ejaculation 0.734 +announcement 0.734 +expectancy 0.727 +urgent 0.727 +liberation 0.727 +imminent 0.727 +expecting 0.727 +reunion 0.719 +prospect 0.719 +aspire 0.719 +prospection 0.719 +trepidation 0.719 +voyage 0.719 +yearning 0.711 +ecstasy 0.711 +journey 0.711 +mystery 0.711 +rapture 0.711 +suspense 0.711 +enthusiasm 0.711 +kiss 0.711 +hopeful 0.703 +thrill 0.703 +progress 0.703 +excitation 0.703 +destination 0.703 +frantic 0.703 +prospective 0.703 +urgency 0.703 +lottery 0.703 +tantalizing 0.703 +arrival 0.695 +readiness 0.695 +explore 0.695 +advance 0.695 +vacation 0.695 +liberate 0.695 +hurry 0.695 +expectation 0.695 +achievement 0.695 +prediction 0.695 +sex 0.695 +approaching 0.688 +ecstatic 0.688 +allure 0.688 +roulette 0.680 +uprising 0.680 +honeymoon 0.680 +holiday 0.672 +wishful 0.672 +crescendo 0.672 +celebrating 0.672 +rescue 0.664 +waiting 0.664 +impending 0.664 +winning 0.664 +invitation 0.664 +triumph 0.664 +craving 0.664 +winnings 0.664 +orgasm 0.664 +courtship 0.656 +bridegroom 0.656 +strive 0.656 +fortune 0.656 +reward 0.656 +marriage 0.656 +aspiring 0.656 +bridal 0.656 +gain 0.656 +celebration 0.656 +jackpot 0.656 +victory 0.656 +aspiration 0.648 +tomorrow 0.648 +crowning 0.648 +alertness 0.648 +intrigue 0.648 +inheritance 0.648 +treasure 0.648 +opportunity 0.648 +delivery 0.648 +rising 0.648 +prescient 0.648 +receiving 0.641 +bride 0.641 +hype 0.641 +anxious 0.641 +spectacular 0.641 +possibility 0.641 +expedition 0.641 +prognosis 0.641 +erotic 0.641 +engaged 0.641 +celebrated 0.641 +happiness 0.641 +reckoning 0.641 +revolution 0.641 +award 0.641 +launch 0.641 +passion 0.633 +destiny 0.633 +vision 0.633 +miracle 0.633 +delight 0.633 +birthday 0.633 +firstborn 0.633 +beware 0.633 +curious 0.633 +graduation 0.633 +succeed 0.633 +await 0.633 +prepare 0.633 +coming 0.633 +captivate 0.633 +passionate 0.633 +ominous 0.633 +triumphant 0.625 +foresee 0.625 +retirement 0.625 +lust 0.625 +revival 0.625 +optimism 0.625 +ripen 0.625 +gift 0.625 +escape 0.625 +inspiration 0.625 +foreboding 0.617 +risky 0.617 +simmering 0.617 +surprisingly 0.617 +foresight 0.617 +bloom 0.617 +verge 0.617 +ambition 0.617 +embrace 0.617 +enchanting 0.617 +destined 0.617 +succeeding 0.609 +forecast 0.609 +seductive 0.609 +matrimony 0.609 +anxiety 0.609 +bonus 0.609 +alerts 0.609 +magical 0.609 +lookout 0.609 +picnic 0.602 +deserve 0.602 +inspire 0.602 +revenge 0.602 +applicant 0.602 +boomerang 0.602 +diagnosis 0.602 +winner 0.602 +longing 0.602 +entertaining 0.602 +intended 0.602 +success 0.602 +fulfillment 0.602 +nervous 0.602 +visionary 0.602 +prophetic 0.602 +foreseen 0.602 +buzz 0.594 +result 0.594 +preparedness 0.594 +momentum 0.594 +arrive 0.594 +romance 0.594 +marry 0.594 +acquiring 0.594 +rekindle 0.594 +accelerate 0.594 +advent 0.594 +illuminate 0.594 +luck 0.594 +predict 0.589 +endeavor 0.586 +preparation 0.586 +immerse 0.586 +uplift 0.586 +auspices 0.586 +presumption 0.586 +enthusiast 0.586 +impatient 0.586 +flirt 0.586 +raffle 0.586 +delightful 0.586 +money 0.586 +seek 0.586 +overdue 0.586 +fiesta 0.586 +investigation 0.586 +gambling 0.586 +progression 0.586 +enjoying 0.586 +crave 0.586 +sequel 0.586 +experiment 0.580 +enjoy 0.578 +divination 0.578 +healing 0.578 +excavation 0.578 +precarious 0.578 +remedy 0.578 +completing 0.578 +transcendence 0.578 +harvest 0.578 +blessing 0.578 +thirst 0.578 +heavenly 0.578 +attainable 0.578 +inviting 0.578 +majestic 0.578 +prosper 0.578 +clamor 0.578 +thriving 0.578 +risk 0.578 +angling 0.578 +matchmaker 0.570 +sweetheart 0.570 +intimate 0.570 +omen 0.570 +plan 0.570 +dare 0.570 +emancipation 0.570 +finally 0.570 +ultimate 0.570 +magnificence 0.570 +tease 0.570 +prospectively 0.570 +restlessness 0.570 +zest 0.570 +gambler 0.570 +warned 0.570 +invite 0.570 +lover 0.562 +fun 0.562 +forewarned 0.562 +exalt 0.562 +enchant 0.562 +fanfare 0.562 +mysterious 0.562 +expose 0.562 +trophy 0.562 +rejoice 0.562 +expected 0.562 +hypothesis 0.562 +immortality 0.562 +champion 0.562 +parade 0.562 +festival 0.562 +accolade 0.562 +independence 0.562 +predilection 0.562 +attempt 0.562 +quicken 0.562 +amour 0.555 +speculative 0.555 +liberty 0.555 +heroism 0.555 +grasping 0.555 +splendor 0.555 +uneasiness 0.555 +happy 0.555 +lovely 0.555 +feeling 0.555 +curiosity 0.555 +grow 0.555 +salvation 0.555 +unfold 0.555 +fate 0.555 +rejoicing 0.555 +boisterous 0.555 +oracle 0.555 +shopping 0.555 +agape 0.547 +changeable 0.547 +leisure 0.547 +convergence 0.547 +hungry 0.547 +warn 0.547 +vote 0.547 +resultant 0.547 +monetary 0.547 +recreational 0.547 +suspicious 0.547 +incite 0.547 +glory 0.547 +abundance 0.547 +probability 0.547 +sorcery 0.547 +bountiful 0.547 +apprehensive 0.547 +pray 0.547 +morrow 0.547 +glimmer 0.547 +delighted 0.547 +inquiry 0.539 +blessings 0.539 +entertainment 0.539 +vindication 0.539 +auction 0.539 +hunting 0.539 +worrying 0.539 +hankering 0.539 +bounty 0.539 +grandchildren 0.539 +tempest 0.539 +contingent 0.539 +exceed 0.539 +merge 0.539 +sensual 0.539 +ballot 0.539 +glad 0.536 +cheer 0.531 +magnificent 0.531 +visitor 0.531 +forming 0.531 +virginity 0.531 +dread 0.531 +celestial 0.531 +stealthy 0.531 +responsive 0.531 +harbinger 0.531 +overthrow 0.531 +deliverance 0.531 +betrothed 0.531 +feat 0.531 +spirits 0.531 +appeal 0.531 +hurried 0.531 +raving 0.531 +hunter 0.523 +watch 0.523 +prevail 0.523 +notification 0.523 +ultimately 0.523 +prognostic 0.523 +wait 0.523 +explosive 0.523 +pleasant 0.523 +importance 0.523 +preparatory 0.523 +revive 0.523 +haste 0.523 +child 0.523 +radiance 0.523 +prophet 0.523 +planning 0.523 +cheery 0.523 +competition 0.523 +beaming 0.523 +germination 0.523 +fermentation 0.516 +uncontrollable 0.516 +chocolate 0.516 +loom 0.516 +recreation 0.516 +begun 0.516 +precious 0.516 +present 0.516 +compensate 0.516 +treat 0.516 +time 0.516 +owing 0.516 +renovation 0.516 +celebrity 0.516 +sensuality 0.516 +caution 0.516 +endanger 0.516 +salary 0.516 +dreadful 0.508 +perfection 0.508 +intermission 0.508 +elevation 0.508 +cue 0.508 +wilderness 0.508 +prerequisite 0.508 +exigent 0.508 +transitional 0.508 +commemoration 0.508 +horizon 0.508 +vigilance 0.508 +practise 0.508 +contemplation 0.508 +develop 0.508 +infant 0.508 +cultivate 0.508 +signify 0.508 +depart 0.500 +eventuality 0.500 +ardent 0.500 +sunny 0.500 +advocacy 0.500 +reconciliation 0.500 +puppy 0.500 +sneaking 0.500 +horoscope 0.500 +swim 0.500 +income 0.500 +hero 0.500 +calculation 0.500 +invocation 0.500 +doomsday 0.500 +zeal 0.500 +young 0.500 +commemorate 0.500 +airport 0.500 +undisclosed 0.500 +blindfold 0.500 +favorable 0.500 +utopian 0.500 +ready 0.500 +uphill 0.500 +attendance 0.500 +peril 0.500 +romantic 0.500 +litigate 0.500 +intuitively 0.500 +unbridled 0.500 +nascent 0.500 +defense 0.492 +proceeding 0.492 +eventual 0.492 +bless 0.492 +parole 0.492 +court 0.492 +improvise 0.492 +repay 0.492 +gaping 0.492 +inauguration 0.492 +restorative 0.492 +youth 0.492 +heyday 0.492 +consequent 0.492 +perspective 0.492 +undertaking 0.492 +worry 0.492 +highest 0.491 +conjure 0.484 +unexplained 0.484 +sparkle 0.484 +duel 0.484 +letter 0.484 +threaten 0.484 +shortly 0.484 +tremor 0.484 +voluptuous 0.484 +vow 0.484 +engulf 0.484 +contagion 0.484 +generosity 0.484 +happen 0.484 +correspondence 0.484 +princely 0.484 +sharpen 0.484 +god 0.484 +auspicious 0.484 +cherish 0.477 +determinate 0.477 +contemplate 0.477 +powerful 0.477 +accompaniment 0.477 +gravitate 0.477 +glide 0.477 +medal 0.477 +perilous 0.477 +torture 0.477 +unification 0.477 +predispose 0.477 +clue 0.477 +enroll 0.477 +onset 0.477 +score 0.477 +adore 0.477 +arbitration 0.477 +submit 0.477 +glorify 0.477 +recipient 0.477 +glow 0.477 +praiseworthy 0.473 +motion 0.469 +sweets 0.469 +precursor 0.469 +star 0.469 +immediately 0.469 +shaky 0.469 +scare 0.469 +providing 0.469 +cash 0.469 +invoke 0.469 +dawn 0.469 +completion 0.469 +cautious 0.469 +pry 0.469 +elite 0.469 +unknown 0.469 +fete 0.469 +starry 0.469 +football 0.469 +production 0.469 +successful 0.469 +creeping 0.469 +unsurpassed 0.469 +opera 0.469 +hire 0.469 +extricate 0.461 +regatta 0.461 +commemorative 0.461 +overture 0.461 +draft 0.461 +preliminary 0.461 +cheerfulness 0.461 +shining 0.461 +brilliant 0.461 +alive 0.461 +excel 0.461 +testament 0.461 +plight 0.461 +pay 0.461 +synchronize 0.461 +untold 0.461 +sanctuary 0.461 +jeopardy 0.461 +mail 0.461 +soundness 0.461 +friendly 0.461 +punt 0.461 +prevention 0.453 +infinity 0.453 +supremacy 0.453 +flinch 0.453 +sunset 0.453 +renovate 0.453 +elegance 0.453 +intimately 0.453 +compliment 0.453 +improve 0.453 +inaugural 0.453 +complement 0.453 +basketball 0.453 +prologue 0.453 +perpetuity 0.453 +rehabilitation 0.453 +career 0.453 +unexpected 0.453 +concealment 0.445 +fain 0.445 +share 0.445 +surround 0.445 +volunteer 0.445 +sweet 0.445 +epidemic 0.445 +conjecture 0.445 +confidence 0.445 +fitting 0.445 +perfect 0.445 +sun 0.445 +veracity 0.445 +goodness 0.438 +respect 0.438 +conservation 0.438 +aloha 0.438 +devout 0.438 +reconstruction 0.438 +faith 0.438 +recombination 0.438 +rabid 0.438 +superstitious 0.438 +angel 0.438 +serial 0.438 +prepared 0.438 +saint 0.438 +ferment 0.438 +plea 0.438 +reconstruct 0.438 +tickle 0.438 +medical 0.438 +passenger 0.438 +spa 0.430 +unverified 0.430 +charitable 0.430 +tribunal 0.430 +clap 0.430 +peace 0.430 +perpetuate 0.430 +labyrinth 0.430 +strategist 0.430 +venerable 0.430 +serenity 0.430 +luscious 0.430 +install 0.430 +tabulate 0.430 +volatility 0.422 +adrift 0.422 +candid 0.422 +grin 0.422 +vista 0.422 +edification 0.422 +conspirator 0.422 +forestall 0.422 +recognizable 0.422 +oasis 0.422 +revere 0.422 +laughter 0.422 +unresolved 0.422 +worship 0.422 +patience 0.422 +peaceful 0.422 +thought 0.414 +grant 0.414 +ordination 0.414 +detainee 0.414 +craps 0.414 +calls 0.414 +astrologer 0.414 +probation 0.414 +frisky 0.414 +ongoing 0.414 +morn 0.414 +continue 0.414 +pretty 0.414 +withstand 0.414 +mediate 0.414 +proficiency 0.414 +punctual 0.414 +weigh 0.414 +sing 0.411 +opponent 0.406 +prophylactic 0.406 +comfort 0.406 +nurture 0.406 +subscribe 0.406 +continuation 0.406 +twinkle 0.406 +mother 0.406 +headlight 0.406 +long 0.406 +confession 0.406 +chicane 0.406 +university 0.406 +midwife 0.406 +outdo 0.406 +punished 0.406 +navigable 0.406 +banquet 0.406 +debenture 0.406 +wizard 0.406 +proud 0.406 +deal 0.402 +guillotine 0.398 +saintly 0.398 +representing 0.398 +balm 0.398 +obliging 0.398 +lettered 0.398 +death 0.398 +top 0.398 +vigil 0.398 +mortification 0.398 +judiciary 0.398 +symphony 0.398 +simmer 0.398 +distracting 0.398 +efficient 0.398 +reliance 0.398 +maternal 0.391 +objective 0.391 +sanctify 0.391 +unfulfilled 0.391 +poke 0.391 +condemnation 0.391 +chuckle 0.391 +linger 0.391 +undoubted 0.391 +familiarity 0.391 +antidote 0.391 +diplomacy 0.391 +trust 0.391 +depraved 0.391 +art 0.391 +assurance 0.391 +abeyance 0.391 +inoculation 0.384 +humanitarian 0.383 +discretion 0.383 +playground 0.383 +ship 0.383 +depend 0.383 +ram 0.383 +hymn 0.383 +good 0.383 +labor 0.383 +chant 0.383 +undecided 0.383 +failing 0.383 +hap 0.383 +banger 0.383 +dutiful 0.383 +simplify 0.383 +scientist 0.383 +track 0.375 +mountain 0.375 +recurrent 0.375 +cradle 0.375 +interim 0.375 +clock 0.375 +sterling 0.375 +interminable 0.375 +savor 0.375 +navigator 0.375 +gradual 0.375 +public 0.375 +towering 0.367 +abide 0.367 +musical 0.367 +instructions 0.367 +sonar 0.367 +biennial 0.367 +convince 0.367 +whim 0.367 +concealed 0.367 +lesson 0.367 +shiver 0.367 +spear 0.367 +offset 0.359 +undying 0.359 +atone 0.359 +timidity 0.359 +theory 0.359 +theology 0.359 +plump 0.359 +audience 0.357 +consecration 0.352 +farm 0.352 +paragon 0.352 +edition 0.352 +cramp 0.352 +nobility 0.352 +closure 0.352 +localize 0.352 +dietary 0.352 +store 0.352 +kindred 0.352 +daily 0.352 +meditate 0.344 +stripped 0.344 +mobile 0.344 +errand 0.344 +archaeology 0.344 +wireless 0.344 +mutable 0.344 +germ 0.336 +brotherly 0.336 +unaccountable 0.336 +buddy 0.336 +unbeaten 0.336 +pare 0.336 +lessen 0.336 +chastity 0.328 +council 0.328 +digress 0.328 +patient 0.328 +olfactory 0.328 +dove 0.328 +possess 0.328 +secular 0.328 +ribbon 0.328 +regularity 0.320 +infanticide 0.320 +immature 0.320 +cove 0.320 +fancy 0.320 +paddle 0.320 +disposed 0.320 +scrutinize 0.320 +mediator 0.320 +preservative 0.320 +heft 0.320 +analyst 0.312 +church 0.312 +unpublished 0.312 +bugle 0.312 +denying 0.312 +grim 0.312 +judicial 0.305 +priesthood 0.305 +mill 0.305 +broadside 0.305 +cap 0.297 +instructor 0.297 +thermocouple 0.297 +exhaustion 0.297 +tributary 0.297 +dismay 0.297 +saliva 0.297 +network 0.289 +discreet 0.289 +shackle 0.289 +cataract 0.289 +noncompliance 0.289 +wont 0.289 +homeless 0.289 +bruise 0.289 +visor 0.289 +addresses 0.289 +astronomer 0.281 +neighbor 0.281 +skewed 0.281 +immaturity 0.273 +sentence 0.273 +cream 0.273 +picket 0.273 +latent 0.273 +holiness 0.273 +devil 0.273 +neighborhood 0.266 +morals 0.266 +habitual 0.266 +lull 0.266 +bye 0.258 +weight 0.258 +organ 0.250 +forearm 0.250 +clown 0.250 +commonplace 0.242 +quote 0.242 +dictatorship 0.234 +rail 0.234 +treadmill 0.234 +white 0.234 +board 0.234 +sundial 0.227 +tree 0.227 +paralysis 0.211 +organization 0.203 +worm 0.203 +cement 0.203 +lagging 0.180 +neutral 0.148 diff --git a/app-gui/src/main/resources/emolex/disgust-scores.txt b/app-gui/src/main/resources/emolex/disgust-scores.txt new file mode 100644 index 0000000..0d8be86 --- /dev/null +++ b/app-gui/src/main/resources/emolex/disgust-scores.txt @@ -0,0 +1,1094 @@ +cannibalism 0.953 +mutilation 0.930 +incest 0.914 +molestation 0.914 +gonorrhea 0.906 +rape 0.906 +cannibal 0.898 +rot 0.891 +corpse 0.883 +massacre 0.883 +excrement 0.883 +slaughter 0.875 +barf 0.875 +slaughterhouse 0.867 +filth 0.859 +incestuous 0.859 +sewerage 0.859 +bigot 0.859 +rancid 0.859 +infestation 0.852 +holocaust 0.852 +plague 0.852 +bloodthirsty 0.852 +maggot 0.844 +feces 0.844 +rotting 0.844 +fecal 0.844 +murder 0.839 +asshole 0.836 +enslaved 0.836 +infanticide 0.836 +homicide 0.836 +excretion 0.828 +gore 0.828 +torture 0.828 +slaughtering 0.828 +perverted 0.828 +contaminate 0.821 +desecration 0.820 +grotesque 0.820 +repugnant 0.820 +pervert 0.820 +diarrhoea 0.820 +terrorist 0.820 +manure 0.820 +shit 0.820 +revolting 0.820 +murderer 0.820 +gory 0.820 +vomit 0.812 +sewer 0.812 +slavery 0.812 +dismemberment 0.812 +faeces 0.812 +manslaughter 0.812 +cadaver 0.812 +perverse 0.805 +hemorrhage 0.805 +repulsive 0.805 +depravity 0.797 +diseased 0.797 +sewage 0.797 +filthy 0.797 +carcass 0.795 +parasite 0.789 +mutilated 0.789 +murderous 0.789 +vermin 0.789 +dung 0.789 +herpes 0.789 +puke 0.789 +decompose 0.789 +horrific 0.789 +decayed 0.789 +gruesome 0.789 +malaria 0.781 +pestilence 0.781 +slime 0.781 +crap 0.781 +monstrosity 0.781 +flatulence 0.781 +carnage 0.781 +herpesvirus 0.773 +insidious 0.773 +leprosy 0.773 +morgue 0.773 +toxic 0.773 +loathsome 0.773 +pus 0.773 +anthrax 0.766 +repugnance 0.766 +revulsion 0.766 +regurgitation 0.766 +cruel 0.766 +lynch 0.766 +xenophobia 0.766 +whore 0.766 +dissection 0.759 +canker 0.758 +mucous 0.758 +slum 0.758 +evil 0.758 +infectious 0.758 +phlegm 0.758 +perversion 0.758 +cruelty 0.758 +corrupting 0.750 +decomposition 0.750 +leeches 0.750 +sinister 0.750 +demon 0.742 +bile 0.742 +mucus 0.742 +sickening 0.742 +abomination 0.742 +septic 0.742 +stinking 0.742 +demonic 0.742 +abhorrence 0.742 +soiled 0.742 +deranged 0.742 +obese 0.734 +sicken 0.734 +atrocity 0.734 +degeneracy 0.734 +crucifixion 0.734 +despicable 0.734 +foul 0.734 +terrorism 0.734 +cancer 0.734 +bacterium 0.727 +grisly 0.727 +diabolical 0.727 +enema 0.727 +dirty 0.727 +adultery 0.727 +morbidity 0.727 +contamination 0.727 +dysentery 0.727 +repulsion 0.727 +garbage 0.719 +pungent 0.719 +lewd 0.719 +entrails 0.719 +barbaric 0.719 +bowels 0.719 +disfigured 0.719 +deterioration 0.719 +vulgar 0.719 +muck 0.719 +autopsy 0.719 +disgust 0.719 +gross 0.719 +contagion 0.719 +vicious 0.719 +bloodshed 0.714 +poisoned 0.711 +wretched 0.711 +tyrant 0.711 +nausea 0.711 +mortification 0.711 +pollute 0.711 +gag 0.711 +violent 0.711 +nasty 0.703 +disgusting 0.703 +noxious 0.703 +porn 0.703 +poisoning 0.703 +grope 0.703 +slut 0.703 +vulgarity 0.703 +constipation 0.703 +depraved 0.703 +despotism 0.703 +hateful 0.703 +slimy 0.703 +nauseate 0.703 +secretion 0.703 +grime 0.703 +measles 0.696 +intestinal 0.695 +suicidal 0.695 +hellish 0.695 +abuse 0.695 +contagious 0.695 +obesity 0.695 +wretch 0.695 +wart 0.695 +scum 0.695 +hate 0.695 +waste 0.695 +ooze 0.688 +contaminated 0.688 +rabid 0.688 +smut 0.688 +treason 0.688 +disease 0.688 +heartworm 0.688 +antichrist 0.680 +bestial 0.680 +freakish 0.680 +detest 0.680 +soulless 0.680 +cholera 0.680 +pollution 0.680 +abhorrent 0.680 +grimy 0.680 +hell 0.680 +hatred 0.680 +abominate 0.680 +germ 0.680 +sickness 0.680 +deformed 0.680 +obscene 0.672 +dictatorship 0.672 +inhuman 0.672 +loathful 0.672 +dilapidated 0.672 +loathing 0.672 +hideous 0.672 +greasy 0.672 +cess 0.670 +deadly 0.664 +abominable 0.664 +swine 0.664 +deformity 0.664 +discrimination 0.664 +heretic 0.664 +masochism 0.664 +nauseous 0.664 +devil 0.664 +death 0.656 +poison 0.656 +oppression 0.656 +mange 0.656 +victimized 0.656 +latrines 0.656 +trash 0.656 +prejudiced 0.656 +nefarious 0.656 +horror 0.656 +abortion 0.656 +goo 0.656 +bacteria 0.656 +poisonous 0.656 +horrible 0.656 +corruption 0.656 +horrid 0.648 +immoral 0.648 +sludge 0.648 +vindictive 0.648 +trashy 0.648 +ugly 0.648 +bitch 0.648 +outhouse 0.648 +detestation 0.648 +cystic 0.641 +spew 0.641 +villainous 0.641 +malfeasance 0.641 +criminality 0.641 +indecency 0.641 +slop 0.641 +derogatory 0.641 +unsightly 0.641 +pimple 0.641 +horrifying 0.641 +laxative 0.641 +mildew 0.633 +bigoted 0.633 +ulcer 0.633 +oppressive 0.633 +rat 0.633 +doomsday 0.633 +prostitution 0.633 +secrete 0.633 +perpetrator 0.633 +queasy 0.633 +sinful 0.633 +ghastly 0.625 +disgraceful 0.625 +stools 0.625 +aghast 0.625 +cuckold 0.625 +suffering 0.625 +bloated 0.625 +sin 0.625 +degrading 0.625 +persecution 0.625 +devilish 0.625 +gluttony 0.625 +obscenity 0.625 +fungus 0.625 +contemptible 0.625 +dastardly 0.625 +termite 0.617 +crusty 0.617 +tetanus 0.617 +louse 0.617 +infect 0.617 +betrayal 0.617 +dying 0.617 +deceit 0.617 +wench 0.617 +loathe 0.617 +strangle 0.617 +fat 0.617 +atrocious 0.617 +polygamy 0.617 +malicious 0.617 +sickly 0.617 +guillotine 0.617 +spoil 0.617 +diaper 0.617 +brothel 0.609 +venomous 0.609 +hostile 0.609 +bleeding 0.609 +drool 0.609 +deform 0.609 +abhor 0.609 +violently 0.609 +slander 0.609 +sabotage 0.609 +ghetto 0.609 +unwashed 0.602 +lunacy 0.602 +deprivation 0.602 +musty 0.602 +ugliness 0.602 +hag 0.602 +imprisonment 0.602 +traitor 0.602 +poaching 0.602 +illicit 0.602 +swampy 0.602 +infidel 0.602 +blister 0.594 +venom 0.594 +misery 0.594 +slug 0.594 +queasiness 0.594 +deceitful 0.594 +epidemic 0.594 +toilet 0.594 +sinner 0.594 +repelling 0.594 +gut 0.594 +intoxicated 0.594 +catastrophe 0.594 +lurid 0.594 +butcher 0.594 +thug 0.594 +hostility 0.594 +lunatic 0.594 +incubus 0.586 +appalling 0.586 +deteriorated 0.586 +unclean 0.586 +lavatory 0.586 +harass 0.586 +pornography 0.586 +dreadful 0.586 +prostitute 0.586 +retard 0.578 +ruinous 0.578 +debauchery 0.578 +humiliating 0.578 +offensive 0.578 +sick 0.578 +hypocrite 0.578 +rash 0.578 +quagmire 0.578 +unfaithful 0.578 +larceny 0.578 +flea 0.578 +expulsion 0.578 +squeamish 0.578 +fiend 0.578 +conspirator 0.578 +mangle 0.578 +treacherous 0.570 +swamp 0.570 +serpent 0.570 +egregious 0.570 +spit 0.570 +devastating 0.570 +messy 0.570 +dank 0.570 +oppress 0.570 +flog 0.570 +dogsick 0.570 +bastard 0.570 +despise 0.570 +snake 0.562 +harmful 0.562 +insanity 0.562 +indecent 0.562 +sloppy 0.562 +terrible 0.562 +alcoholism 0.562 +stealing 0.562 +ruthless 0.562 +enemy 0.562 +harlot 0.562 +scoundrel 0.562 +humiliation 0.562 +sinning 0.562 +loo 0.562 +tyrannical 0.562 +awful 0.562 +sordid 0.562 +robbery 0.555 +flabby 0.555 +threatening 0.555 +beastly 0.555 +distaste 0.555 +segregate 0.555 +discriminating 0.555 +varicella 0.555 +bloody 0.555 +unattractive 0.555 +coward 0.555 +slayer 0.555 +collusion 0.555 +wickedness 0.555 +arsenic 0.555 +odious 0.555 +atrophy 0.555 +ridicule 0.555 +insufferable 0.555 +miserable 0.547 +burglar 0.547 +sty 0.547 +vesicular 0.547 +malevolent 0.547 +attacking 0.547 +suffocating 0.547 +slur 0.547 +purgatory 0.547 +anathema 0.547 +bitterly 0.547 +condemnation 0.547 +coercion 0.547 +thief 0.547 +deleterious 0.547 +pillage 0.547 +ogre 0.547 +thrash 0.539 +liar 0.539 +disgrace 0.539 +jealous 0.539 +shame 0.539 +pig 0.539 +infidelity 0.539 +greedy 0.539 +gob 0.539 +repellant 0.539 +repudiation 0.539 +imprisoned 0.539 +fatty 0.539 +sneer 0.539 +drunken 0.539 +sloth 0.539 +lethal 0.536 +destructive 0.531 +blemish 0.531 +hanging 0.531 +neurotic 0.531 +travesty 0.531 +aberration 0.531 +intolerant 0.531 +blasphemous 0.531 +intrusive 0.531 +brawl 0.531 +painful 0.531 +smuggler 0.531 +withered 0.531 +hydrocephalus 0.531 +disintegrate 0.531 +lying 0.531 +condescension 0.531 +burnt 0.531 +ruined 0.531 +accusation 0.523 +intolerance 0.523 +disparaging 0.523 +incarceration 0.523 +derogation 0.523 +avarice 0.523 +disgraced 0.523 +mistress 0.523 +rubbish 0.523 +blighted 0.523 +mite 0.516 +deplorable 0.516 +daemon 0.516 +cringe 0.516 +dishonor 0.516 +grim 0.516 +eradication 0.516 +tortious 0.516 +betray 0.516 +stink 0.516 +degrade 0.516 +remains 0.516 +sump 0.516 +convict 0.516 +gutter 0.516 +defraud 0.516 +rob 0.516 +vulture 0.516 +sham 0.509 +dreadfully 0.508 +smelling 0.508 +schizophrenia 0.508 +disaster 0.508 +bombed 0.508 +delirium 0.508 +endemic 0.508 +distasteful 0.508 +glut 0.508 +incurable 0.508 +prisoner 0.508 +resentment 0.508 +distress 0.508 +blob 0.508 +rejection 0.508 +belittle 0.508 +worthless 0.508 +cheat 0.508 +crude 0.508 +idiocy 0.508 +pest 0.508 +offense 0.500 +bribery 0.500 +idolatry 0.500 +tirade 0.500 +jealousy 0.500 +flagrant 0.500 +impeach 0.500 +mire 0.500 +goblin 0.500 +screaming 0.500 +dirt 0.500 +bitterness 0.500 +banish 0.500 +taboo 0.500 +blight 0.500 +impurity 0.500 +greed 0.500 +duress 0.500 +shackle 0.500 +polemic 0.500 +theft 0.500 +derision 0.500 +wreck 0.492 +boil 0.492 +malign 0.492 +disreputable 0.492 +ill 0.492 +leer 0.492 +unconscionable 0.492 +squirm 0.492 +recession 0.492 +robber 0.492 +gorge 0.492 +idiot 0.492 +offender 0.484 +possessed 0.484 +subjugation 0.484 +stain 0.484 +mad 0.484 +unbearable 0.484 +aversation 0.484 +nappy 0.484 +disrespectful 0.484 +nepotism 0.484 +defamation 0.484 +contraband 0.484 +tramp 0.484 +mutiny 0.484 +inexcusable 0.484 +wasteful 0.484 +contempt 0.484 +affliction 0.484 +mess 0.484 +servile 0.484 +snarl 0.484 +occult 0.484 +animosity 0.484 +raging 0.484 +illegality 0.477 +dismal 0.477 +uncaring 0.477 +antagonistic 0.477 +suppression 0.477 +unpleasant 0.477 +immorality 0.477 +mockery 0.477 +pathetic 0.477 +criminal 0.477 +palsy 0.477 +banishment 0.469 +aggravation 0.469 +outrage 0.469 +angry 0.469 +cough 0.469 +perspiration 0.469 +furious 0.469 +wallow 0.469 +banshee 0.469 +shoddy 0.469 +mocking 0.469 +livid 0.469 +arrogant 0.469 +grating 0.469 +poverty 0.469 +repellent 0.469 +fool 0.461 +perdition 0.461 +scar 0.461 +spurious 0.461 +quack 0.461 +prick 0.461 +insulting 0.461 +plunder 0.461 +recklessness 0.461 +fraudulent 0.461 +spider 0.461 +deplore 0.461 +muddy 0.461 +unjustifiable 0.461 +distorted 0.461 +deceive 0.461 +elimination 0.453 +dishonest 0.453 +alienate 0.453 +disparage 0.453 +selfish 0.453 +dire 0.453 +bane 0.453 +indignation 0.453 +eschew 0.453 +unthinkable 0.453 +stigma 0.453 +aphid 0.453 +disingenuous 0.453 +cur 0.453 +antipathy 0.453 +bankruptcy 0.445 +wasted 0.445 +mosquito 0.445 +despair 0.445 +smell 0.445 +lie 0.445 +piles 0.445 +pious 0.445 +caries 0.445 +egotistical 0.445 +opium 0.445 +recalcitrant 0.445 +garish 0.445 +iniquity 0.445 +vacuous 0.445 +abject 0.438 +scream 0.438 +inmate 0.438 +abnormal 0.438 +alien 0.438 +aversion 0.438 +hog 0.438 +sticky 0.438 +homeless 0.438 +ashamed 0.438 +obnoxious 0.438 +shun 0.438 +hopelessness 0.438 +adverse 0.430 +denounce 0.430 +lusty 0.430 +trickery 0.430 +incredulous 0.430 +callous 0.430 +debris 0.430 +shameless 0.430 +curse 0.430 +pall 0.430 +illegal 0.430 +cursing 0.430 +defiance 0.430 +undesirable 0.430 +reflux 0.430 +separatist 0.430 +creature 0.430 +falsity 0.430 +witch 0.430 +denunciation 0.422 +collapse 0.422 +impure 0.422 +idiotic 0.422 +nicotine 0.422 +socialist 0.422 +pompous 0.422 +tarnish 0.422 +ammonia 0.422 +infantile 0.422 +mistrust 0.422 +hypertrophy 0.422 +affront 0.422 +offend 0.422 +swarm 0.422 +slush 0.422 +hairy 0.422 +gush 0.422 +ferocious 0.422 +untidy 0.422 +contentious 0.422 +wasting 0.422 +bovine 0.422 +bum 0.422 +delinquent 0.422 +badness 0.422 +carelessness 0.422 +tasteless 0.422 +unfavorable 0.414 +illegitimate 0.414 +socialism 0.414 +vampire 0.414 +displacency 0.414 +dishonesty 0.414 +murky 0.414 +disobey 0.414 +sour 0.414 +drivel 0.414 +vegetative 0.414 +neglected 0.414 +litigious 0.414 +falsify 0.406 +disgruntled 0.406 +displeasure 0.406 +phony 0.406 +shoplifting 0.406 +prosecution 0.406 +outcast 0.406 +unkind 0.406 +recidivism 0.406 +discontinuity 0.406 +wrongdoing 0.406 +repel 0.406 +bogus 0.406 +unlawful 0.406 +ignorant 0.406 +ungrateful 0.406 +dislike 0.406 +rigor 0.398 +lick 0.398 +averse 0.398 +woe 0.398 +woefully 0.398 +failure 0.398 +amphetamines 0.398 +disdain 0.398 +worsening 0.398 +crushing 0.398 +unnatural 0.398 +stingy 0.398 +paucity 0.398 +subvert 0.398 +unruly 0.398 +senseless 0.398 +loon 0.398 +insult 0.393 +damage 0.391 +critter 0.391 +averseness 0.391 +bad 0.391 +farcical 0.391 +scorpion 0.391 +hardened 0.391 +antisocial 0.391 +disrelish 0.391 +punishment 0.391 +punished 0.391 +muff 0.391 +diatribe 0.391 +expel 0.391 +eviction 0.383 +guilt 0.383 +sacrifices 0.383 +illiterate 0.383 +orc 0.383 +discord 0.383 +irrational 0.383 +divorce 0.383 +anaconda 0.383 +surly 0.383 +adder 0.383 +presumptuous 0.383 +teeming 0.383 +plagiarism 0.383 +disappoint 0.383 +fugitive 0.383 +fulsome 0.383 +hypocritical 0.383 +shabby 0.383 +lament 0.383 +irritating 0.375 +dislocated 0.375 +alienation 0.375 +unworthy 0.375 +misconduct 0.375 +plight 0.375 +blame 0.375 +scoff 0.375 +depressing 0.375 +shock 0.375 +defective 0.375 +irritation 0.375 +revoke 0.367 +stripped 0.367 +cad 0.367 +exclusion 0.367 +wimp 0.367 +shuddering 0.367 +blatant 0.367 +vainly 0.367 +disillusionment 0.367 +hoax 0.367 +squelch 0.367 +powerless 0.367 +pitfall 0.367 +toad 0.367 +hurtful 0.367 +wimpy 0.367 +unhealthy 0.367 +coerce 0.367 +ineptitude 0.359 +bug 0.359 +incompatible 0.359 +rebellion 0.359 +oddity 0.359 +deserted 0.359 +disobedience 0.359 +damn 0.359 +dispose 0.359 +obi 0.352 +ridiculous 0.352 +litigate 0.352 +fierce 0.352 +untoward 0.352 +compost 0.352 +inept 0.352 +crushed 0.352 +displeased 0.352 +frustrate 0.352 +dismissal 0.352 +censor 0.352 +uncertain 0.352 +flesh 0.352 +lawyer 0.352 +cutting 0.352 +misbehavior 0.352 +wrongful 0.352 +flinch 0.352 +tearful 0.344 +disapprove 0.344 +depreciate 0.344 +lumpy 0.336 +heartsick 0.336 +thoughtless 0.336 +lawsuit 0.336 +discontent 0.336 +daft 0.336 +blunder 0.336 +disinclination 0.336 +distrust 0.336 +disallowed 0.336 +bickering 0.336 +exigent 0.336 +grumble 0.336 +unsettled 0.336 +annoy 0.336 +disliked 0.336 +discoloration 0.336 +unsatisfactory 0.328 +provoking 0.328 +exasperation 0.328 +inhibit 0.328 +hydrophobia 0.328 +excluded 0.328 +whine 0.328 +instability 0.328 +sly 0.328 +disappointed 0.328 +unmanageable 0.328 +materialist 0.328 +cacophony 0.328 +grievance 0.328 +misleading 0.321 +disclaim 0.320 +disapproving 0.320 +humbug 0.320 +annoyance 0.320 +soot 0.320 +confined 0.320 +unequal 0.320 +reproach 0.320 +rags 0.320 +disservice 0.320 +groan 0.320 +mishap 0.320 +disincline 0.312 +criticize 0.312 +theism 0.312 +overpriced 0.312 +stomach 0.312 +inappropriate 0.312 +depreciated 0.312 +burke 0.312 +sneeze 0.312 +soil 0.312 +inconsiderate 0.312 +bang 0.305 +grumpy 0.305 +shack 0.305 +inadmissible 0.305 +gall 0.305 +disparity 0.305 +unfriendly 0.305 +latent 0.305 +unaccountable 0.305 +disliking 0.305 +coop 0.304 +congress 0.297 +scold 0.297 +rogue 0.297 +lonely 0.297 +disappointment 0.297 +disregarded 0.297 +soreness 0.297 +growling 0.297 +delay 0.297 +backwards 0.297 +janitor 0.289 +infamous 0.289 +flop 0.289 +lesbian 0.289 +catechism 0.289 +nettle 0.289 +notoriety 0.289 +wince 0.281 +aftermath 0.281 +saturated 0.281 +prohibited 0.281 +unfair 0.281 +desist 0.281 +gaby 0.281 +remiss 0.281 +huff 0.273 +tribunal 0.273 +wrangling 0.273 +discolored 0.273 +uneasy 0.273 +impolite 0.266 +swig 0.266 +frantic 0.266 +unsatisfied 0.266 +crawl 0.266 +weird 0.266 +coldness 0.266 +politic 0.266 +bureaucrat 0.266 +inefficiency 0.266 +rascal 0.258 +instinctive 0.258 +copycat 0.258 +barrow 0.258 +gruff 0.258 +sarcasm 0.258 +incase 0.258 +octopus 0.258 +chagrin 0.258 +john 0.250 +baboon 0.250 +lose 0.250 +disinclined 0.250 +shanghai 0.250 +hulk 0.250 +cupping 0.250 +misconception 0.250 +opponent 0.242 +tariff 0.242 +entangled 0.242 +gratuitous 0.242 +scrub 0.242 +rook 0.242 +unlucky 0.234 +resign 0.234 +reluctance 0.234 +lagging 0.234 +questionable 0.234 +misstatement 0.234 +prolong 0.234 +backwardness 0.234 +disqualified 0.227 +unpopular 0.227 +reversal 0.227 +fussy 0.227 +ineffectual 0.227 +subsidy 0.227 +default 0.227 +weight 0.219 +dame 0.219 +petroleum 0.219 +intense 0.219 +evade 0.219 +frowning 0.219 +actionable 0.211 +tawny 0.211 +donkey 0.211 +unhappy 0.211 +dandy 0.203 +owing 0.203 +speck 0.203 +awkwardness 0.203 +gnome 0.203 +hood 0.203 +rave 0.203 +birch 0.203 +inconvenient 0.203 +indifference 0.203 +desert 0.203 +howl 0.195 +dabbling 0.195 +gelatin 0.195 +fleece 0.195 +misguided 0.195 +airs 0.195 +morals 0.195 +monochrome 0.195 +celebrity 0.188 +avoid 0.188 +lush 0.188 +gent 0.188 +lesser 0.188 +stalemate 0.188 +nose 0.180 +possession 0.180 +claimant 0.180 +sunk 0.180 +laughable 0.180 +hoot 0.164 +pregnancy 0.164 +mouthful 0.164 +undoubted 0.164 +larger 0.164 +thrift 0.164 +sentence 0.156 +obliging 0.156 +misplace 0.156 +clamor 0.156 +parrot 0.156 +bummer 0.148 +nameless 0.148 +excellence 0.141 +elf 0.141 +feeling 0.141 +turn 0.133 +asymmetry 0.133 +gray 0.133 +clumsy 0.133 +stall 0.133 +bran 0.125 +finally 0.125 +lord 0.125 +cove 0.117 +boy 0.117 +nurture 0.117 +savor 0.117 +winning 0.109 +lemon 0.109 +powerful 0.102 +glitter 0.094 +mind 0.086 +interior 0.086 +interested 0.078 +abundance 0.078 +treat 0.078 +kite 0.055 +honest 0.055 +humble 0.047 +tree 0.039 diff --git a/app-gui/src/main/resources/emolex/fear-scores.txt b/app-gui/src/main/resources/emolex/fear-scores.txt new file mode 100644 index 0000000..49d4d43 --- /dev/null +++ b/app-gui/src/main/resources/emolex/fear-scores.txt @@ -0,0 +1,1765 @@ +torture 0.984 +terrorist 0.972 +horrific 0.969 +terrorism 0.969 +terrorists 0.969 +suicidebombing 0.967 +kill 0.962 +homicidal 0.959 +terror 0.953 +murderer 0.953 +catastrophe 0.953 +annihilate 0.953 +dying 0.948 +war 0.942 +bombing 0.938 +bomb 0.935 +missiles 0.934 +horror 0.923 +horrified 0.922 +terrorize 0.922 +brutality 0.922 +bloodthirsty 0.922 +murderous 0.920 +massacre 0.911 +horrifying 0.906 +mutilation 0.906 +assassinate 0.906 +terrifying 0.906 +fatality 0.906 +horrors 0.906 +demon 0.906 +murder 0.906 +devastation 0.906 +killing 0.906 +terrified 0.906 +holocaust 0.906 +suicidal 0.898 +kidnap 0.891 +crucifixion 0.891 +slaughter 0.891 +assault 0.891 +doomed 0.888 +poisoned 0.886 +suicide 0.879 +explosion 0.879 +disastrous 0.875 +dismemberment 0.875 +annihilation 0.875 +savagery 0.875 +deadly 0.875 +slaughtering 0.875 +suffocation 0.875 +disaster 0.875 +threatening 0.875 +assassin 0.875 +rape 0.870 +hell 0.860 +slaughterhouse 0.859 +guillotine 0.859 +explosive 0.859 +annihilated 0.859 +demonic 0.859 +ihatespiders 0.859 +bloodshed 0.859 +dread 0.859 +homicide 0.859 +barbaric 0.859 +anthrax 0.859 +molestation 0.859 +warfare 0.859 +peril 0.859 +tragedy 0.859 +attacking 0.859 +paralyzed 0.859 +executioner 0.859 +suffocating 0.858 +treachery 0.856 +fright 0.853 +apocalypse 0.844 +bombardment 0.844 +afraid 0.844 +frightening 0.844 +frightened 0.844 +scariest 0.844 +panicked 0.844 +morgue 0.844 +traumatic 0.844 +execution 0.844 +monster 0.844 +vengeance 0.844 +destroying 0.844 +slayer 0.844 +abomination 0.844 +painful 0.844 +drown 0.844 +petrified 0.844 +scare 0.844 +death 0.843 +chaos 0.839 +ghastly 0.836 +evil 0.833 +explode 0.828 +devil 0.828 +fatal 0.828 +doomsday 0.828 +doom 0.828 +frighten 0.828 +cancer 0.828 +fear 0.828 +nightmare 0.828 +manslaughter 0.828 +trauma 0.828 +eradication 0.828 +gunmen 0.828 +intruder 0.828 +brutal 0.828 +violently 0.828 +grenade 0.828 +hellish 0.828 +assassination 0.828 +kidnapped 0.828 +paralyze 0.828 +morbidity 0.820 +crippling 0.817 +savage 0.814 +violence 0.812 +destructive 0.812 +crushed 0.812 +suffering 0.812 +violent 0.812 +heartattack 0.812 +damnation 0.812 +poisonous 0.812 +aggressor 0.812 +earthquake 0.812 +shooting 0.812 +quake 0.812 +frightful 0.812 +hurricane 0.811 +imprisoned 0.811 +exterminate 0.810 +fearing 0.808 +hemorrhage 0.807 +torment 0.806 +lethal 0.806 +venom 0.804 +claustrophobia 0.803 +snakes 0.802 +danger 0.802 +robbery 0.800 +exorcism 0.800 +obliterated 0.800 +terrifies 0.798 +extermination 0.797 +harmful 0.797 +incurable 0.797 +poison 0.797 +cruelty 0.797 +biggestfear 0.797 +mortality 0.797 +monstrosity 0.797 +destruction 0.797 +persecution 0.797 +anxietyattack 0.797 +attack 0.797 +hysteria 0.797 +bombers 0.797 +cyanide 0.797 +dreadfully 0.796 +arson 0.794 +devastate 0.792 +tyrant 0.788 +warcrimes 0.785 +perish 0.784 +feared 0.782 +screaming 0.781 +maniac 0.781 +freakingout 0.781 +bloody 0.781 +venomous 0.781 +rampage 0.781 +enslaved 0.781 +warlike 0.781 +lifeless 0.781 +snake 0.776 +epidemic 0.776 +panicattack 0.774 +dangerously 0.766 +invader 0.766 +crisis 0.766 +detonate 0.766 +hazardous 0.766 +jihad 0.766 +die 0.766 +scary 0.766 +invade 0.766 +reprisal 0.766 +obliterate 0.766 +riot 0.766 +criminal 0.766 +tumor 0.766 +violation 0.766 +fearful 0.766 +inferno 0.766 +ohshit 0.766 +shipwreck 0.766 +leprosy 0.766 +claustrophobic 0.765 +hyperventilating 0.762 +nightmares 0.759 +destroyed 0.754 +ghostly 0.754 +hurricanes 0.750 +tyranny 0.750 +panic 0.750 +ptsd 0.750 +dangerous 0.750 +strangle 0.750 +tragedies 0.750 +wrenching 0.750 +hazard 0.750 +destroyer 0.750 +projectiles 0.750 +cholera 0.750 +obliteration 0.750 +slavery 0.750 +imprisonment 0.750 +agony 0.750 +anaconda 0.750 +anarchist 0.750 +treacherous 0.750 +riotous 0.750 +mortuary 0.750 +dreadful 0.750 +anarchy 0.750 +fears 0.750 +accident 0.750 +malignancy 0.742 +bombard 0.740 +cannibal 0.740 +abominable 0.738 +tyrannical 0.734 +depraved 0.734 +mutiny 0.734 +scared 0.734 +dictatorship 0.734 +beast 0.734 +missile 0.734 +cursed 0.734 +melee 0.734 +threaten 0.734 +hostage 0.734 +diseased 0.734 +gore 0.734 +devilish 0.734 +malignant 0.734 +misery 0.734 +horrible 0.734 +shot 0.734 +bomber 0.734 +hyperventilate 0.734 +crash 0.734 +gun 0.734 +shoot 0.734 +victimized 0.734 +paralysis 0.734 +mafia 0.734 +tornado 0.734 +turmoil 0.733 +combat 0.728 +alligator 0.727 +ruin 0.725 +shooter 0.722 +contagious 0.720 +miscarriage 0.719 +lynch 0.719 +desperation 0.719 +casualty 0.719 +devastating 0.719 +seizure 0.719 +starvation 0.719 +excruciating 0.719 +phobia 0.719 +harm 0.719 +crime 0.719 +emergency 0.719 +shock 0.719 +fight 0.719 +injured 0.719 +scream 0.719 +struggle 0.719 +havoc 0.719 +mortification 0.719 +frantically 0.717 +carnage 0.717 +standoff 0.716 +infestation 0.716 +soscary 0.712 +panicking 0.708 +rupture 0.706 +frantic 0.705 +horrid 0.705 +burial 0.703 +arsenic 0.703 +neurotic 0.703 +carcinoma 0.703 +witchcraft 0.703 +hysterical 0.703 +deranged 0.703 +prey 0.703 +infectious 0.703 +assailant 0.703 +sabotage 0.703 +psychosis 0.703 +hatred 0.703 +terminal 0.703 +collapse 0.703 +anguish 0.703 +grisly 0.703 +diabolical 0.703 +avalanche 0.703 +dreaded 0.703 +gash 0.703 +sos 0.703 +aggressive 0.703 +malevolent 0.703 +agonizing 0.703 +cobra 0.703 +harrowing 0.703 +fugitive 0.703 +wrecked 0.703 +armed 0.703 +cripple 0.703 +freaked 0.703 +schizophrenia 0.703 +plague 0.703 +upheaval 0.703 +vendetta 0.703 +forcibly 0.700 +abduction 0.700 +crocodile 0.700 +offender 0.698 +mayhem 0.690 +wounding 0.688 +disease 0.688 +agoraphobia 0.688 +brawl 0.688 +banish 0.688 +oppression 0.688 +hostile 0.688 +guerilla 0.688 +cyclone 0.688 +radiation 0.688 +hopeless 0.688 +ambush 0.688 +beastly 0.688 +shrapnel 0.688 +socialanxiety 0.688 +cadaver 0.688 +leukemia 0.688 +rabid 0.688 +endanger 0.688 +contagion 0.688 +anarchism 0.688 +hurt 0.688 +trepidation 0.688 +gory 0.688 +paranoid 0.688 +alarm 0.688 +blast 0.688 +gallows 0.686 +coffin 0.684 +madness 0.675 +spook 0.673 +fury 0.672 +awful 0.672 +victim 0.672 +ghost 0.672 +trembling 0.672 +scarier 0.672 +stab 0.672 +viper 0.672 +nervouswreck 0.672 +tarantula 0.672 +thug 0.672 +dungeon 0.672 +carcass 0.672 +freakedout 0.672 +vermin 0.672 +felon 0.672 +atrocity 0.672 +fangs 0.672 +militants 0.672 +perishing 0.672 +militia 0.672 +grim 0.672 +outbreak 0.672 +abhorrent 0.672 +abuse 0.672 +frankenstorm 0.672 +sinister 0.672 +menace 0.672 +hurting 0.672 +gang 0.672 +crushing 0.672 +combatant 0.672 +eruption 0.672 +shatter 0.672 +persecute 0.672 +revolver 0.672 +injury 0.672 +mangle 0.672 +soscared 0.672 +menacing 0.672 +desolation 0.667 +ferocious 0.667 +battered 0.667 +cutthroat 0.664 +pandemic 0.664 +volcano 0.663 +scares 0.660 +cruelly 0.658 +nefarious 0.656 +fearfully 0.656 +purgatory 0.656 +despotic 0.656 +tumult 0.656 +malicious 0.656 +emetophobia 0.656 +selfharm 0.656 +lunatic 0.656 +bully 0.656 +typhoon 0.656 +xenophobia 0.656 +treason 0.656 +oppressive 0.656 +battlefield 0.656 +dictator 0.656 +smash 0.656 +radioactive 0.656 +encroachment 0.656 +stroke 0.656 +traitor 0.656 +blizzard 0.656 +coma 0.656 +cruel 0.656 +endangered 0.656 +armament 0.656 +ruthless 0.656 +punishment 0.656 +shitless 0.656 +neurosis 0.656 +debauchery 0.656 +spider 0.656 +distress 0.656 +alarming 0.656 +revenge 0.656 +crazed 0.656 +insane 0.656 +projectile 0.654 +flog 0.653 +bang 0.652 +ransom 0.644 +criminality 0.642 +hanging 0.641 +deteriorate 0.641 +dementia 0.641 +punished 0.641 +perturbation 0.641 +haunt 0.641 +raptors 0.641 +abortion 0.641 +despair 0.641 +cantbreathe 0.641 +scoundrel 0.641 +isolated 0.641 +quivering 0.641 +duress 0.641 +dreading 0.641 +targeted 0.641 +rattlesnake 0.641 +demise 0.641 +warlock 0.641 +perilous 0.641 +dastardly 0.641 +raging 0.641 +injurious 0.641 +intimidate 0.641 +conflict 0.641 +wildfire 0.641 +wreck 0.641 +tumour 0.641 +retaliation 0.641 +vehement 0.641 +demented 0.641 +hideous 0.641 +banshee 0.641 +antichrist 0.641 +aghast 0.641 +bestial 0.639 +serpent 0.638 +condemnation 0.637 +corrosive 0.636 +armaments 0.636 +fire 0.636 +exclusion 0.636 +nervousness 0.627 +seize 0.625 +pneumonia 0.625 +spiders 0.625 +revolting 0.625 +vampire 0.625 +mercenary 0.625 +sarcoma 0.625 +incarceration 0.625 +manic 0.625 +injure 0.625 +smuggler 0.625 +pestilence 0.625 +hurtful 0.625 +stunned 0.625 +vengeful 0.625 +irreparable 0.625 +lunacy 0.625 +thundering 0.625 +disfigured 0.625 +artillery 0.625 +incendiary 0.625 +daemon 0.625 +wracking 0.625 +turbulent 0.625 +landslide 0.625 +malice 0.625 +enemy 0.625 +combative 0.625 +sickening 0.625 +repression 0.625 +infection 0.625 +wicked 0.625 +inhuman 0.625 +meltdown 0.625 +prison 0.625 +ruinous 0.625 +madman 0.625 +virulence 0.625 +ill 0.621 +barbarian 0.620 +battled 0.615 +plummet 0.613 +blackmail 0.612 +hangman 0.610 +contaminated 0.610 +darkened 0.610 +merciless 0.609 +beating 0.609 +aggression 0.609 +injection 0.609 +alienation 0.609 +insurmountable 0.609 +dagger 0.609 +conflagration 0.609 +butcher 0.609 +malaria 0.609 +interrogation 0.609 +despotism 0.609 +wrath 0.609 +prosecute 0.609 +disintegrate 0.609 +shackle 0.609 +oblivion 0.609 +homeless 0.609 +sufferer 0.609 +rob 0.609 +ogre 0.609 +oppressor 0.609 +abandonment 0.609 +deplorable 0.609 +injuring 0.609 +illness 0.609 +bleeding 0.609 +infanticide 0.609 +scourge 0.609 +threat 0.604 +firearms 0.600 +nerves 0.600 +raid 0.600 +eviction 0.596 +villain 0.595 +torrent 0.594 +pounding 0.594 +haze 0.594 +cardiomyopathy 0.594 +infidel 0.594 +deceit 0.594 +possessed 0.594 +dragon 0.594 +terrible 0.594 +belligerent 0.594 +restrained 0.594 +goblin 0.594 +hypertrophy 0.594 +paranoia 0.594 +tribulation 0.594 +flee 0.594 +shelling 0.594 +masochism 0.594 +tremor 0.594 +burglar 0.594 +sickness 0.594 +anxiety 0.594 +pain 0.594 +sepsis 0.594 +euthanasia 0.594 +omen 0.594 +foe 0.594 +ominous 0.594 +fraught 0.594 +convict 0.594 +rot 0.594 +casket 0.594 +accursed 0.594 +lightning 0.594 +villainous 0.594 +wounded 0.592 +elimination 0.588 +lava 0.588 +spank 0.587 +hostilities 0.586 +dismal 0.584 +blockade 0.582 +punch 0.580 +haunted 0.578 +angina 0.578 +infliction 0.578 +dispossessed 0.578 +tumultuous 0.578 +quarantine 0.578 +desecration 0.578 +coward 0.578 +eatingdisorders 0.578 +grizzly 0.578 +demoralized 0.578 +worry 0.578 +curse 0.578 +deprivation 0.578 +shudder 0.578 +bacteria 0.578 +pained 0.578 +stealing 0.578 +failure 0.578 +sostressed 0.578 +hateful 0.578 +forbidding 0.578 +cringe 0.578 +parasite 0.578 +loss 0.578 +abyss 0.578 +surgery 0.578 +volatility 0.578 +apprehensive 0.578 +confined 0.578 +clashing 0.578 +jeopardy 0.578 +shady 0.578 +jail 0.578 +dire 0.578 +evacuate 0.578 +assail 0.578 +perdition 0.577 +mob 0.577 +toxin 0.575 +unholy 0.575 +comatose 0.575 +pillage 0.574 +incest 0.571 +wound 0.571 +forced 0.569 +cowardice 0.567 +domination 0.566 +crypt 0.566 +witch 0.565 +smuggle 0.565 +worries 0.562 +banished 0.562 +purge 0.562 +inflict 0.562 +masks 0.562 +afflict 0.562 +sacrifices 0.562 +deterioration 0.562 +eeek 0.562 +gunpowder 0.562 +misfortune 0.562 +ulcer 0.562 +incubus 0.562 +apprehend 0.562 +lawsuit 0.562 +distressing 0.562 +prisoner 0.562 +jitters 0.562 +corrupting 0.562 +thrash 0.562 +martyr 0.562 +travesty 0.562 +duel 0.562 +pitfall 0.562 +evasion 0.562 +overpowering 0.562 +vanished 0.562 +impending 0.562 +risky 0.562 +martyrdom 0.562 +appalling 0.562 +syncope 0.562 +polio 0.562 +risk 0.562 +confine 0.562 +grave 0.562 +turbulence 0.562 +degrading 0.562 +punishing 0.562 +powerless 0.562 +incrimination 0.562 +freak 0.562 +mange 0.562 +hunter 0.562 +unsafe 0.561 +sin 0.560 +worstfeeling 0.560 +perpetrator 0.560 +occult 0.559 +intimidation 0.559 +disable 0.558 +decay 0.557 +affliction 0.557 +autopsy 0.557 +vulnerability 0.548 +flood 0.547 +bondage 0.547 +abhor 0.547 +overthrow 0.547 +appendicitis 0.547 +outcry 0.547 +cannon 0.547 +siren 0.547 +growling 0.547 +jeopardize 0.547 +deformity 0.547 +samurai 0.547 +neuralgia 0.547 +talons 0.547 +defenseless 0.547 +beware 0.547 +noxious 0.547 +asylum 0.547 +scorpion 0.547 +outburst 0.547 +derogation 0.547 +enmity 0.547 +ailing 0.547 +scandal 0.547 +adder 0.547 +communism 0.547 +thief 0.547 +plunge 0.547 +precarious 0.547 +expulsion 0.547 +mad 0.547 +brigade 0.547 +needles 0.547 +insanity 0.547 +apparition 0.547 +senile 0.547 +coercion 0.547 +gonorrhea 0.547 +retribution 0.545 +uprising 0.545 +cemetery 0.541 +badness 0.539 +phantom 0.538 +abandoned 0.534 +fled 0.534 +rejection 0.533 +rebellion 0.531 +disembodied 0.531 +captor 0.531 +stormy 0.531 +stalk 0.531 +wrangling 0.531 +helpless 0.531 +subjugation 0.531 +slave 0.531 +hopelessness 0.531 +superstitious 0.531 +broken 0.531 +manifestation 0.531 +cowardly 0.531 +abandon 0.531 +deserted 0.531 +jarring 0.531 +frenzied 0.531 +theft 0.531 +bacterium 0.531 +saber 0.531 +manipulation 0.531 +lawlessness 0.531 +impotence 0.531 +penetration 0.531 +swastika 0.531 +atherosclerosis 0.531 +shaking 0.531 +carnivorous 0.531 +eek 0.531 +leeches 0.531 +buried 0.531 +harbinger 0.531 +endocarditis 0.531 +failing 0.531 +stressed 0.531 +punish 0.531 +unstable 0.531 +freakout 0.531 +incursion 0.531 +distrust 0.531 +suspense 0.529 +blood 0.525 +bear 0.524 +hiding 0.524 +unlawful 0.519 +crazy 0.519 +anxious 0.518 +cult 0.518 +captive 0.517 +deportation 0.517 +detainee 0.516 +enforce 0.516 +suspect 0.516 +oppress 0.516 +revulsion 0.516 +grievous 0.516 +fang 0.516 +exile 0.516 +insidious 0.516 +plunder 0.516 +foreboding 0.516 +intolerance 0.516 +incite 0.516 +sorcery 0.516 +emaciated 0.516 +shriek 0.516 +busted 0.516 +helplessness 0.516 +exacerbation 0.516 +biopsy 0.516 +badfeeling 0.516 +relapse 0.516 +plight 0.516 +growl 0.516 +troublesome 0.516 +chased 0.516 +embolism 0.516 +darkness 0.516 +conspirator 0.516 +palsy 0.516 +harshness 0.516 +unthinkable 0.516 +sting 0.516 +robber 0.516 +pernicious 0.516 +smite 0.516 +depression 0.508 +confinement 0.507 +snowmageddon 0.500 +illegal 0.500 +eeeek 0.500 +towering 0.500 +intolerant 0.500 +subvert 0.500 +cliff 0.500 +sinful 0.500 +wasp 0.500 +suppress 0.500 +brute 0.500 +prohibited 0.500 +suppression 0.500 +ruined 0.500 +instability 0.500 +constraint 0.500 +odious 0.500 +downfall 0.500 +surrender 0.500 +raving 0.500 +mistrust 0.500 +alcoholism 0.500 +blob 0.500 +frenetic 0.500 +scalpel 0.500 +vertigo 0.500 +prayforme 0.500 +infarct 0.500 +defiance 0.500 +squeamish 0.500 +madden 0.500 +premeditated 0.500 +hunting 0.500 +woe 0.491 +intrusion 0.484 +hearse 0.484 +lion 0.484 +armor 0.484 +hate 0.484 +rat 0.484 +syringe 0.484 +ravine 0.484 +endemic 0.484 +blackness 0.484 +divorce 0.484 +disgusting 0.484 +hallucination 0.484 +defamation 0.484 +rabble 0.484 +ambulance 0.484 +hospital 0.484 +worse 0.484 +dismay 0.484 +indictment 0.484 +dishonor 0.484 +poaching 0.484 +freakish 0.484 +cutting 0.484 +jumpy 0.484 +insecurity 0.484 +perjury 0.484 +lash 0.484 +accusing 0.484 +slam 0.484 +ravenous 0.484 +sonervous 0.484 +fiend 0.484 +palpitations 0.484 +coerce 0.484 +canthandleit 0.484 +retard 0.484 +cracked 0.484 +restriction 0.484 +indefensible 0.484 +prejudiced 0.484 +shiver 0.484 +warrior 0.484 +worrying 0.484 +flinch 0.484 +ohno 0.484 +sinner 0.483 +averse 0.483 +inspection 0.483 +despairing 0.474 +missing 0.474 +darken 0.471 +austere 0.470 +depressed 0.469 +quiver 0.469 +overwhelmed 0.469 +unhealthy 0.469 +decomposition 0.469 +toothache 0.469 +foreclose 0.469 +infidelity 0.469 +superstition 0.469 +subversion 0.469 +illegality 0.469 +animosity 0.469 +inmate 0.469 +criticize 0.469 +revoke 0.469 +accused 0.469 +sinking 0.469 +intrusive 0.469 +soulless 0.469 +thresh 0.469 +aftermath 0.469 +scrapie 0.469 +fierce 0.469 +fret 0.469 +nervous 0.469 +breakdown 0.469 +jaws 0.469 +idolatry 0.469 +asteroid 0.469 +fever 0.469 +admonition 0.469 +precipice 0.469 +regime 0.469 +armored 0.469 +indict 0.469 +startle 0.469 +spear 0.468 +worried 0.466 +nasty 0.466 +thirteenth 0.465 +puma 0.465 +contraband 0.464 +insecure 0.461 +disturbance 0.459 +denunciation 0.456 +destitute 0.455 +stigma 0.455 +powerfully 0.454 +derogatory 0.453 +batter 0.453 +warn 0.453 +rifle 0.453 +resign 0.453 +quandary 0.453 +scold 0.453 +straits 0.453 +disreputable 0.453 +spasm 0.453 +dinosaur 0.453 +restrain 0.453 +rigor 0.453 +shrill 0.453 +stranger 0.453 +disruption 0.453 +apprehension 0.453 +grope 0.453 +wail 0.453 +unspeakable 0.453 +howl 0.453 +hydrocephalus 0.453 +penalty 0.453 +omgomgomg 0.453 +lockup 0.453 +indoctrination 0.453 +ohgod 0.453 +penal 0.453 +orphan 0.453 +resisting 0.453 +illicit 0.453 +urgent 0.450 +arraignment 0.450 +tramp 0.440 +behemoth 0.439 +stress 0.439 +mace 0.438 +obstruct 0.438 +entangled 0.438 +expel 0.438 +perverse 0.438 +targeting 0.438 +dislocated 0.438 +accuser 0.438 +dentists 0.438 +yell 0.438 +asp 0.438 +forfeiture 0.438 +infirmity 0.438 +dominate 0.438 +tribunal 0.438 +aghhh 0.438 +predicament 0.438 +bewildered 0.438 +looming 0.438 +debacle 0.438 +stripped 0.438 +indomitable 0.438 +unprepared 0.438 +atrophy 0.438 +coldsweat 0.438 +rheumatism 0.438 +falter 0.438 +irreconcilable 0.438 +broke 0.438 +scarcity 0.438 +impermeable 0.438 +cabal 0.438 +probation 0.438 +wince 0.438 +accidental 0.438 +illegitimate 0.438 +gasping 0.438 +concealed 0.438 +displaced 0.438 +prick 0.438 +rebels 0.435 +insulting 0.435 +halting 0.435 +mysterious 0.435 +repulsion 0.431 +glare 0.430 +punitive 0.425 +sordid 0.425 +tempest 0.423 +stake 0.423 +ultimatum 0.422 +infamous 0.422 +reticent 0.422 +dissident 0.422 +coyote 0.422 +deleterious 0.422 +usurped 0.422 +prowl 0.422 +alien 0.422 +depress 0.422 +bier 0.422 +disappear 0.422 +delusion 0.422 +heathen 0.422 +anathema 0.422 +depresson 0.422 +unnatural 0.422 +suspension 0.422 +stresses 0.422 +troll 0.422 +wilderness 0.422 +burdensome 0.422 +offense 0.422 +hydra 0.422 +publicspeaking 0.422 +bayonet 0.422 +varicella 0.422 +lament 0.422 +extrajudicial 0.422 +bigot 0.422 +steal 0.422 +stressin 0.422 +unsteady 0.422 +thumping 0.422 +fainting 0.422 +adversity 0.418 +ineptitude 0.417 +outsider 0.413 +ugliness 0.410 +vulture 0.410 +immoral 0.410 +scar 0.406 +rubble 0.406 +weakly 0.406 +distressed 0.406 +nausea 0.406 +whimper 0.406 +stretcher 0.406 +dismissal 0.406 +ohdear 0.406 +penance 0.406 +omnipotence 0.406 +insolvent 0.406 +escape 0.406 +resection 0.406 +deport 0.406 +disallowed 0.406 +stressing 0.406 +disgust 0.406 +possession 0.406 +ghetto 0.406 +tearful 0.406 +dominant 0.406 +disorder 0.406 +drones 0.406 +wary 0.406 +blackout 0.406 +claw 0.406 +disabled 0.406 +screech 0.406 +stressful 0.406 +recklessness 0.406 +squall 0.406 +socialism 0.405 +conspiracy 0.400 +toughness 0.400 +defection 0.398 +absence 0.396 +moan 0.394 +crusade 0.392 +discrimination 0.391 +avoiding 0.391 +concealment 0.391 +overt 0.391 +theocratic 0.391 +unemployed 0.391 +poverty 0.391 +brimstone 0.391 +cyst 0.391 +radon 0.391 +conquer 0.391 +unrest 0.391 +separation 0.391 +suspicion 0.391 +spaz 0.391 +scarecrow 0.391 +hardened 0.391 +refutation 0.391 +repellent 0.391 +snare 0.391 +cleave 0.391 +gulp 0.391 +nervy 0.391 +submission 0.391 +procedure 0.391 +whatdoido 0.391 +xanax 0.391 +musket 0.391 +descent 0.391 +excitation 0.391 +stifled 0.391 +lose 0.391 +diagnosis 0.391 +urgency 0.391 +mental 0.391 +reject 0.391 +exigent 0.391 +insolvency 0.391 +dubious 0.391 +orc 0.388 +outcast 0.388 +throb 0.388 +disapprove 0.380 +dontpanic 0.378 +withdrawals 0.377 +plea 0.377 +kerosene 0.375 +bunker 0.375 +escaped 0.375 +dentistry 0.375 +taunt 0.375 +expose 0.375 +bad 0.375 +barricade 0.375 +bankrupt 0.375 +coldness 0.375 +frigate 0.375 +interrogate 0.375 +grieve 0.375 +ocd 0.375 +dissolution 0.375 +military 0.375 +obi 0.375 +sneaking 0.375 +chimera 0.375 +locust 0.375 +embarrassment 0.375 +mentalhealth 0.375 +sultan 0.375 +psychological 0.375 +suspected 0.375 +antsy 0.375 +obligor 0.375 +khan 0.375 +nauseous 0.375 +whirlpool 0.375 +misconception 0.375 +flu 0.375 +chasm 0.375 +edict 0.375 +pressure 0.375 +repellant 0.373 +unknown 0.369 +pare 0.367 +jealousy 0.365 +depreciation 0.359 +contempt 0.359 +government 0.359 +desert 0.359 +spike 0.359 +onedge 0.359 +formidable 0.359 +exam 0.359 +wasting 0.359 +stint 0.359 +sortie 0.359 +bottomless 0.359 +rejects 0.359 +timid 0.359 +burke 0.359 +cur 0.359 +jaundice 0.359 +revolution 0.359 +cautionary 0.359 +dart 0.359 +warned 0.359 +pessimism 0.359 +mug 0.359 +difficult 0.359 +measles 0.359 +consternation 0.359 +rebel 0.359 +recurring 0.359 +protestant 0.359 +anomaly 0.359 +headaches 0.359 +mournful 0.359 +mandamus 0.359 +concerned 0.359 +sectarian 0.359 +conquest 0.359 +bankruptcy 0.359 +constrain 0.358 +languishing 0.358 +bane 0.356 +warden 0.354 +impeach 0.354 +adverse 0.352 +lawyer 0.349 +libel 0.348 +retrenchment 0.345 +imminent 0.345 +hiss 0.344 +bearish 0.344 +loneliness 0.344 +obstacle 0.344 +discipline 0.344 +verdict 0.344 +reckless 0.344 +knell 0.344 +swerve 0.344 +taboo 0.344 +parachute 0.344 +sorrow 0.344 +hesitation 0.344 +servile 0.344 +defy 0.344 +launches 0.344 +fanaticism 0.344 +aaaaaaah 0.344 +opium 0.344 +shame 0.344 +resistant 0.344 +shaky 0.344 +eel 0.344 +opposed 0.344 +mri 0.344 +belittle 0.344 +shortage 0.344 +unjustifiable 0.344 +recession 0.344 +cutter 0.344 +evade 0.344 +pest 0.344 +psych 0.344 +avoidance 0.344 +contentious 0.344 +disrespectful 0.343 +phalanx 0.342 +creature 0.340 +specter 0.331 +mortgage 0.331 +enigmatic 0.329 +bugaboo 0.328 +shutdown 0.328 +spillin 0.328 +encumbrance 0.328 +caution 0.328 +senseless 0.328 +police 0.328 +remove 0.328 +dike 0.328 +feeling 0.328 +subordinate 0.328 +quash 0.328 +undesirable 0.328 +smut 0.328 +defendant 0.328 +supremacy 0.328 +loom 0.328 +hives 0.328 +mishap 0.328 +uhoh 0.328 +weirdo 0.328 +wrongly 0.328 +wimp 0.328 +adrift 0.328 +gladiator 0.328 +outpost 0.328 +ethereal 0.328 +dominion 0.328 +unlucky 0.328 +shank 0.328 +gametime 0.328 +unsettled 0.327 +scarce 0.327 +antisocial 0.324 +astray 0.320 +vigilant 0.319 +socialist 0.318 +halter 0.318 +pessimist 0.317 +pacing 0.316 +ordnance 0.312 +whirlwind 0.312 +seclusion 0.312 +muzzle 0.312 +trickery 0.312 +collusion 0.312 +nether 0.312 +unkind 0.312 +uneasy 0.312 +valium 0.312 +dentist 0.312 +obsessing 0.312 +powerful 0.312 +cram 0.312 +thorny 0.312 +litigate 0.312 +blight 0.312 +therapist 0.312 +deadline 0.312 +opponent 0.312 +ahhhhhhhh 0.312 +wimpy 0.312 +discontinuity 0.312 +clinical 0.312 +foreigner 0.312 +chargeable 0.312 +conspire 0.312 +bewilderment 0.312 +laxative 0.312 +unexpected 0.312 +overthinking 0.309 +doubts 0.308 +seriousness 0.305 +irrational 0.305 +erase 0.303 +teasing 0.303 +razor 0.303 +sweating 0.298 +medical 0.297 +reluctant 0.297 +adjudicate 0.297 +timidity 0.297 +depreciated 0.297 +avoid 0.297 +endless 0.297 +unsurpassed 0.297 +crouching 0.297 +deflation 0.297 +warning 0.297 +flounder 0.297 +giant 0.297 +hide 0.297 +bitch 0.297 +swamp 0.297 +auditor 0.297 +dashed 0.297 +inflation 0.297 +bale 0.297 +weighty 0.297 +mislead 0.297 +mage 0.297 +deluge 0.287 +disinformation 0.286 +court 0.284 +aversion 0.283 +mistaken 0.281 +cartridge 0.281 +cautious 0.281 +bigoted 0.281 +unfriendly 0.281 +wan 0.281 +surveillance 0.281 +hurryup 0.281 +confusion 0.281 +submitting 0.281 +flying 0.281 +challenge 0.281 +oncoming 0.281 +remains 0.281 +notready 0.281 +apache 0.281 +rush 0.281 +swelling 0.281 +yelp 0.281 +fortress 0.281 +dwarfed 0.281 +discourage 0.281 +unruly 0.281 +intense 0.279 +noncompliance 0.276 +alerts 0.276 +planes 0.274 +displeased 0.273 +cop 0.273 +unbridled 0.271 +posse 0.266 +blindfold 0.266 +force 0.266 +auditions 0.266 +operation 0.266 +hooded 0.266 +banger 0.266 +forgotten 0.266 +crouch 0.266 +flurries 0.266 +shanghai 0.266 +insomnia 0.266 +blemish 0.266 +problem 0.266 +sneak 0.266 +newjob 0.266 +uncanny 0.266 +hood 0.266 +regiment 0.266 +elevation 0.266 +cloak 0.266 +immerse 0.266 +confession 0.266 +acrobat 0.266 +cupping 0.266 +skid 0.266 +crowds 0.266 +belt 0.266 +sentence 0.266 +affront 0.266 +spur 0.262 +mortgagor 0.258 +defense 0.258 +hag 0.250 +guard 0.250 +run 0.250 +cataract 0.250 +unfamiliar 0.250 +impatiently 0.250 +standstill 0.250 +rating 0.250 +rascal 0.250 +forewarned 0.250 +breakingnews 0.250 +doubt 0.250 +obliging 0.250 +foul 0.250 +defend 0.250 +spinster 0.250 +repent 0.250 +delusional 0.250 +indecisive 0.250 +insect 0.250 +picket 0.250 +indifference 0.250 +sunk 0.250 +jobinterview 0.250 +react 0.250 +swampy 0.250 +scapegoat 0.250 +stealthy 0.250 +grounded 0.242 +badhabit 0.242 +highest 0.236 +intercede 0.234 +psychiatrist 0.234 +buck 0.234 +insomniac 0.234 +dependence 0.234 +scaffold 0.234 +shrink 0.234 +rekindle 0.234 +overdrive 0.234 +bee 0.234 +sleepless 0.234 +inequality 0.234 +pinion 0.234 +finalized 0.234 +chicken 0.234 +difficulty 0.234 +instinctive 0.234 +discontent 0.234 +shelters 0.234 +verge 0.234 +aaaah 0.234 +buzz 0.234 +thatmoment 0.234 +rushing 0.233 +overslept 0.226 +default 0.226 +confessional 0.225 +impatient 0.224 +aga 0.219 +unequal 0.219 +jungle 0.219 +thrill 0.219 +bait 0.219 +immigrant 0.219 +waver 0.219 +veer 0.219 +lastminute 0.219 +fingerscrossed 0.219 +whatif 0.219 +stingy 0.219 +blues 0.219 +tactics 0.219 +revelations 0.219 +sweat 0.219 +cane 0.219 +heft 0.219 +overtired 0.218 +prognosis 0.217 +alertness 0.216 +hyped 0.214 +wishmeluck 0.212 +somuchtodo 0.212 +toomuchtodo 0.212 +tryouts 0.210 +clowns 0.207 +fluctuation 0.204 +examination 0.204 +restless 0.204 +intimacy 0.203 +quail 0.203 +overcome 0.203 +acceptances 0.203 +birth 0.203 +phew 0.203 +mighty 0.203 +recesses 0.203 +uphill 0.203 +help 0.203 +cross 0.203 +hurry 0.203 +fearless 0.200 +change 0.198 +ware 0.198 +withstand 0.197 +asap 0.191 +overcoming 0.188 +waitinggame 0.188 +intrigue 0.188 +stillness 0.188 +owing 0.188 +cautiously 0.188 +watch 0.188 +attorney 0.188 +bug 0.188 +fragile 0.188 +unorganised 0.188 +rule 0.188 +advance 0.188 +knots 0.188 +tract 0.188 +heighten 0.188 +gnome 0.188 +deadlines 0.188 +elf 0.185 +stillwaiting 0.184 +lonely 0.183 +slippery 0.181 +interview 0.180 +everyman 0.178 +speculation 0.176 +needtoknow 0.173 +surprise 0.172 +humanrights 0.172 +shell 0.172 +assessment 0.172 +worship 0.172 +chaff 0.172 +composure 0.172 +settlor 0.172 +interviewer 0.172 +unsure 0.172 +competition 0.172 +regulatory 0.172 +readytogo 0.172 +birch 0.172 +rod 0.172 +checkpoint 0.172 +uncertain 0.172 +less 0.167 +coy 0.162 +iris 0.160 +intimately 0.156 +sly 0.156 +hearing 0.156 +retirement 0.156 +legalized 0.156 +bases 0.156 +ceasefire 0.156 +audition 0.156 +needit 0.156 +medication 0.156 +countdown 0.156 +courageous 0.154 +overthinker 0.153 +backtrack 0.151 +dawned 0.150 +censor 0.149 +bailiff 0.147 +syllabus 0.147 +gent 0.141 +newcomer 0.141 +rationality 0.141 +imagination 0.141 +cove 0.141 +waiting 0.141 +caricature 0.141 +delay 0.141 +eventuality 0.141 +validity 0.141 +shy 0.140 +alreadyyyyy 0.140 +symptom 0.133 +excite 0.132 +raccoon 0.127 +campaigning 0.125 +clown 0.125 +marry 0.125 +gameday 0.125 +hawk 0.125 +soready 0.125 +sprite 0.125 +tryout 0.125 +prevent 0.125 +needtorelax 0.125 +swim 0.125 +ahhh 0.125 +pharmacy 0.123 +sag 0.123 +policeman 0.121 +dreamt 0.111 +lace 0.111 +knot 0.109 +incase 0.109 +holiness 0.109 +confidence 0.109 +notoriety 0.109 +homework 0.109 +bigday 0.109 +weight 0.109 +pray 0.109 +destination 0.109 +slender 0.100 +undecided 0.098 +sympathetic 0.097 +god 0.094 +case 0.094 +confident 0.094 +helmet 0.094 +poise 0.094 +treat 0.094 +locate 0.094 +loyal 0.094 +grades 0.094 +counsellor 0.094 +northeast 0.088 +graduation 0.078 +compassion 0.078 +nurture 0.078 +graded 0.075 +mum 0.070 +infant 0.067 +youth 0.062 +civilians 0.062 +parade 0.062 +gradschool 0.062 +cash 0.062 +civilian 0.062 +cloudiness 0.062 +journey 0.062 +guidelines 0.062 +soulmate 0.062 +opera 0.057 +synonymous 0.056 +honest 0.047 +praying 0.047 +intelligence 0.038 +volunteer 0.031 +lines 0.031 +romance 0.031 +obey 0.016 diff --git a/app-gui/src/main/resources/emolex/joy-scores.txt b/app-gui/src/main/resources/emolex/joy-scores.txt new file mode 100644 index 0000000..be4e4ea --- /dev/null +++ b/app-gui/src/main/resources/emolex/joy-scores.txt @@ -0,0 +1,1268 @@ +happiest 0.986 +happiness 0.984 +bliss 0.971 +celebrating 0.970 +jubilant 0.969 +ecstatic 0.954 +elation 0.944 +beaming 0.938 +bestdayever 0.938 +loveee 0.932 +celebration 0.929 +awesomeness 0.926 +joy 0.924 +happily 0.922 +fabulous 0.922 +exuberance 0.922 +excitement 0.922 +joyous 0.922 +makesmehappy 0.922 +euphoria 0.922 +lovee 0.920 +gratitude 0.914 +happydance 0.912 +merriment 0.912 +spectacular 0.912 +overjoyed 0.909 +purebliss 0.909 +triumphant 0.907 +lovelovelove 0.906 +ecstasy 0.906 +cheerful 0.906 +cheer 0.897 +elated 0.894 +jolly 0.891 +lovethis 0.891 +peaceofmind 0.891 +delighted 0.891 +exhilaration 0.891 +excitation 0.891 +pleasures 0.891 +laugh 0.891 +marvelously 0.881 +blissful 0.879 +loving 0.879 +outstanding 0.879 +joyful 0.879 +pleasurable 0.877 +overthemoon 0.875 +lovinglife 0.875 +yaaaay 0.875 +happyplace 0.875 +iloveher 0.875 +glee 0.875 +enthusiastic 0.875 +sohappy 0.868 +superb 0.864 +laughing 0.864 +woohoo 0.864 +wonderful 0.863 +ilovechristmas 0.859 +hooray 0.859 +brilliant 0.859 +cheering 0.859 +glory 0.859 +tearsofjoy 0.859 +magnificent 0.859 +hallelujah 0.859 +yayyyy 0.859 +celebrated 0.859 +loved 0.859 +exciting 0.853 +heavenly 0.853 +thrilled 0.851 +mademyday 0.848 +hohoho 0.845 +wonderfully 0.844 +blessing 0.844 +favoriteholiday 0.844 +celebrate 0.844 +celebrations 0.833 +blessed 0.833 +festive 0.833 +sweetness 0.833 +paradise 0.833 +marvellous 0.833 +compliment 0.831 +enchanting 0.828 +smiling 0.828 +allsmiles 0.828 +love 0.828 +homesweethome 0.826 +thankyougod 0.824 +marvelous 0.824 +laughter 0.824 +goodmood 0.819 +happyheart 0.818 +joys 0.818 +sensational 0.818 +celebratory 0.818 +excellence 0.818 +delightful 0.818 +goodness 0.818 +excited 0.818 +rejoicing 0.818 +greatful 0.816 +jovial 0.814 +glorious 0.812 +victorious 0.812 +excellent 0.812 +bonanza 0.812 +rejoice 0.812 +splendid 0.812 +enjoy 0.812 +lovemaking 0.812 +greatday 0.812 +smiley 0.812 +goodtimes 0.811 +whatmakesmesmile 0.811 +happyday 0.809 +myfavorite 0.804 +yeahhhh 0.803 +gladness 0.803 +yayyy 0.803 +pleasure 0.803 +thankyoulord 0.803 +giggle 0.802 +lovinlife 0.797 +yesss 0.797 +happytweet 0.797 +success 0.797 +dancing 0.797 +lovemylife 0.797 +happier 0.797 +magnificence 0.797 +grateful 0.789 +happy 0.788 +amuse 0.788 +splendor 0.788 +fun 0.788 +glorify 0.781 +solucky 0.781 +glad 0.781 +enchanted 0.781 +sothankful 0.781 +radiant 0.781 +beautiful 0.781 +giggling 0.781 +perfection 0.779 +christmassy 0.779 +heavens 0.779 +romance 0.779 +thrilling 0.776 +happyvalentinesday 0.773 +entertain 0.773 +cheered 0.773 +positivity 0.773 +congrats 0.773 +cheers 0.773 +lovable 0.773 +miraculous 0.773 +fiesta 0.773 +funday 0.772 +enjoying 0.771 +amused 0.766 +smiles 0.766 +lifeisgood 0.766 +thebest 0.766 +cuddling 0.766 +sosweet 0.766 +christmasspirit 0.766 +goodfeeling 0.766 +delight 0.765 +orgasm 0.765 +party 0.765 +positive 0.761 +enlighten 0.758 +cheerfulness 0.758 +miracles 0.758 +sweetheart 0.758 +giddy 0.757 +christmastime 0.757 +pleasing 0.750 +gratify 0.750 +smile 0.750 +laughs 0.750 +greatness 0.750 +friendliness 0.750 +happyholidays 0.750 +romantic 0.750 +blessings 0.750 +tistheseason 0.750 +frolic 0.748 +positiveenergy 0.742 +rewarding 0.742 +magical 0.742 +miracle 0.742 +selflove 0.742 +jubilee 0.742 +triumph 0.742 +goodvibes 0.742 +enthusiasm 0.742 +feelgood 0.736 +prosperity 0.735 +passionate 0.734 +admiration 0.734 +feelinggood 0.734 +tgif 0.734 +victory 0.734 +enchant 0.734 +vivacious 0.734 +luxurious 0.734 +behappy 0.734 +greatnight 0.734 +goodday 0.734 +glorification 0.733 +glowing 0.729 +sing 0.729 +breathtaking 0.728 +yessss 0.728 +fulfillment 0.728 +atpeace 0.727 +hurrah 0.727 +merry 0.727 +santa 0.727 +award 0.727 +christmasbreak 0.727 +thankful 0.727 +cheery 0.727 +win 0.727 +pleased 0.725 +inspiration 0.725 +radiance 0.725 +uplift 0.723 +optimistic 0.723 +holidays 0.721 +thrill 0.721 +heaven 0.721 +godisgreat 0.721 +lucky 0.721 +amusement 0.719 +congratulatory 0.719 +harmony 0.719 +brighten 0.719 +lover 0.719 +perfect 0.719 +lovely 0.719 +thriving 0.719 +praising 0.719 +utopian 0.719 +xmas 0.719 +heartfelt 0.719 +luxury 0.712 +treasures 0.712 +magic 0.712 +bestfeeling 0.712 +merrychristmas 0.712 +achievement 0.712 +holiday 0.712 +yay 0.712 +luckiest 0.712 +intimate 0.710 +yaaay 0.706 +chuckle 0.706 +rave 0.706 +soblessed 0.706 +proud 0.704 +cherish 0.703 +sweetest 0.703 +amazingly 0.703 +optimism 0.703 +fuckyeah 0.703 +goodnews 0.703 +cuddled 0.703 +satisfying 0.703 +beautification 0.703 +truelove 0.703 +lovelife 0.703 +gooood 0.703 +goodlife 0.703 +appreciates 0.703 +winning 0.703 +yaay 0.700 +entertained 0.700 +excite 0.697 +newbeginnings 0.693 +praisejesus 0.691 +birthday 0.691 +exquisite 0.688 +content 0.688 +godsend 0.688 +thankyoujesus 0.688 +adoration 0.688 +angelic 0.688 +greatfriends 0.688 +favorite 0.688 +metime 0.688 +honored 0.688 +holidayseason 0.688 +entertaining 0.688 +majestic 0.682 +brightens 0.682 +exaltation 0.682 +goodhealth 0.682 +smiled 0.682 +bestfriends 0.682 +memoriesiwontforget 0.682 +precious 0.682 +luscious 0.682 +appreciated 0.682 +tranquility 0.679 +embrace 0.676 +marry 0.676 +positively 0.676 +grin 0.672 +giggles 0.672 +enliven 0.672 +bday 0.672 +relaxation 0.672 +hug 0.672 +hilarious 0.672 +contentment 0.672 +weeeee 0.672 +dearest 0.672 +accomplished 0.672 +fulfilled 0.667 +adore 0.667 +bountiful 0.667 +victor 0.667 +boisterous 0.667 +fulfill 0.664 +cuddles 0.662 +prosperous 0.660 +serenity 0.656 +glow 0.656 +encouraged 0.656 +christmaseve 0.656 +appreciation 0.656 +happynewyear 0.656 +satisfy 0.656 +innerpeace 0.656 +captivate 0.656 +besties 0.656 +romanticism 0.656 +humor 0.656 +pleasant 0.656 +satisfaction 0.652 +praised 0.652 +abundance 0.652 +treasure 0.652 +praises 0.652 +engaged 0.652 +relaxing 0.652 +fortunes 0.652 +nothingbetter 0.647 +complement 0.647 +affection 0.647 +relieved 0.647 +carnival 0.643 +uplifting 0.641 +divine 0.641 +champion 0.641 +thanksgiving 0.641 +achieve 0.641 +jackpot 0.641 +priceless 0.641 +saintly 0.641 +sensuality 0.641 +wedding 0.641 +harmoniously 0.641 +honeymoon 0.636 +exalt 0.636 +twinkle 0.636 +cuddle 0.636 +felicity 0.636 +peaceful 0.636 +yayy 0.636 +winner 0.636 +reverie 0.636 +climax 0.636 +comforting 0.636 +xoxo 0.634 +reward 0.625 +gorgeous 0.625 +praisegod 0.625 +generosity 0.625 +hearts 0.625 +stargazing 0.625 +snuggling 0.625 +fondness 0.625 +amusing 0.625 +sweet 0.625 +brighter 0.625 +festival 0.625 +sex 0.622 +kind 0.621 +parade 0.621 +genial 0.621 +applause 0.621 +beauty 0.621 +fulfilling 0.618 +aspiring 0.618 +newlife 0.618 +godbless 0.616 +virtuous 0.613 +kiss 0.610 +rainbows 0.609 +generous 0.609 +christmas 0.609 +enlightenment 0.609 +winnings 0.609 +playful 0.609 +super 0.609 +awards 0.609 +praiseworthy 0.609 +rekindle 0.609 +adorable 0.609 +elegance 0.609 +independence 0.607 +amour 0.607 +kindness 0.606 +inspired 0.606 +wonder 0.606 +successful 0.606 +heheh 0.606 +onelove 0.606 +hilarity 0.606 +freely 0.606 +surprises 0.606 +entertainment 0.603 +passion 0.603 +whimsical 0.603 +beautify 0.601 +stressfree 0.601 +sunrise 0.600 +godisgood 0.597 +revere 0.594 +snuggled 0.594 +accomplishment 0.594 +jesus 0.594 +angel 0.594 +goodmusic 0.594 +inspire 0.594 +flirt 0.594 +thankgod 0.594 +whoo 0.594 +goodies 0.594 +peacefully 0.594 +fanfare 0.594 +friendship 0.591 +heroic 0.591 +summer 0.591 +fortune 0.591 +highest 0.591 +singing 0.591 +exalted 0.591 +woot 0.588 +contented 0.588 +overflowing 0.588 +rollicking 0.588 +hope 0.586 +accolade 0.586 +cozy 0.583 +delicious 0.579 +ambition 0.578 +friendly 0.578 +praise 0.578 +raving 0.578 +sensuous 0.578 +picturesque 0.578 +thelife 0.578 +everlasting 0.578 +darling 0.578 +sparkle 0.577 +yeahhh 0.576 +flattering 0.576 +succeeding 0.576 +peace 0.576 +heroism 0.576 +luckygirl 0.576 +sensual 0.576 +grace 0.576 +special 0.574 +livelife 0.574 +tantalizing 0.572 +pumped 0.567 +relax 0.562 +hero 0.562 +sweets 0.562 +admirable 0.562 +yey 0.562 +surprise 0.562 +hugs 0.562 +prosper 0.562 +revels 0.562 +sunny 0.562 +prevail 0.562 +liking 0.562 +humorous 0.562 +worthwhile 0.562 +superstar 0.562 +bless 0.561 +favorable 0.561 +tenderness 0.561 +newyear 0.561 +freedom 0.561 +masterpiece 0.561 +dreams 0.559 +hopeful 0.559 +home 0.559 +cruising 0.556 +gracias 0.554 +faithfulness 0.553 +eagerness 0.552 +closeness 0.552 +sunshine 0.551 +comfy 0.551 +gift 0.547 +bonus 0.547 +daughter 0.547 +vacation 0.547 +confidence 0.547 +zeal 0.547 +astonishment 0.547 +heart 0.547 +completion 0.547 +gifts 0.547 +mistletoe 0.547 +elite 0.547 +good 0.547 +celestial 0.547 +illuminate 0.547 +lifted 0.547 +goodmorning 0.547 +charmed 0.546 +encouragement 0.545 +sublime 0.545 +dance 0.545 +recreation 0.545 +gush 0.545 +god 0.545 +free 0.544 +freshstart 0.544 +savior 0.543 +sanctuary 0.541 +grandchildren 0.540 +wellness 0.537 +revel 0.534 +alive 0.531 +bridal 0.531 +inspirational 0.531 +vitality 0.531 +liberation 0.531 +holiness 0.531 +firstborn 0.531 +money 0.531 +rainbow 0.531 +dayoff 0.531 +serene 0.531 +confident 0.531 +soothing 0.531 +music 0.531 +matrimony 0.531 +soar 0.531 +savor 0.531 +fab 0.531 +mastery 0.530 +warmth 0.530 +elegant 0.530 +glimmer 0.530 +blossom 0.530 +illumination 0.530 +welcomed 0.530 +treat 0.529 +faithful 0.529 +snuggles 0.522 +laurels 0.521 +commendable 0.519 +strengthening 0.516 +succeed 0.516 +aspire 0.516 +abundant 0.516 +powerful 0.516 +almighty 0.516 +jingle 0.516 +silly 0.516 +remarkable 0.516 +zest 0.516 +pride 0.516 +brotherly 0.516 +greeted 0.516 +presents 0.516 +resplendent 0.516 +fancy 0.516 +noschool 0.516 +leisure 0.515 +vivid 0.515 +thanking 0.515 +therapeutic 0.515 +familytime 0.515 +zen 0.515 +reunited 0.515 +animated 0.515 +comfort 0.515 +princely 0.515 +shining 0.515 +complete 0.515 +kudos 0.515 +payday 0.515 +cutie 0.515 +coronation 0.515 +spirit 0.515 +newme 0.515 +kid 0.515 +marriage 0.514 +relationship 0.514 +daymade 0.514 +godly 0.514 +spouse 0.507 +intimately 0.507 +achieved 0.500 +soulful 0.500 +welcoming 0.500 +satisfied 0.500 +family 0.500 +meritorious 0.500 +purr 0.500 +motherhood 0.500 +carefree 0.500 +gem 0.500 +excel 0.500 +healthy 0.500 +surreal 0.500 +diamond 0.500 +charitable 0.500 +inviting 0.500 +erotic 0.500 +memorable 0.500 +veracity 0.500 +friends 0.500 +stressrelief 0.500 +holyspirit 0.500 +respect 0.500 +beach 0.500 +nature 0.500 +dignity 0.500 +bloom 0.500 +accomplish 0.500 +christ 0.500 +encourage 0.500 +teamjesus 0.500 +visionary 0.500 +baby 0.500 +refreshed 0.500 +aura 0.493 +health 0.493 +liberty 0.486 +oasis 0.486 +yehey 0.486 +approved 0.486 +rapture 0.485 +loyal 0.485 +aspiration 0.485 +inseparable 0.485 +betrothed 0.485 +privileged 0.485 +crescendo 0.485 +crowning 0.485 +gentle 0.485 +liberate 0.485 +nocomplaints 0.485 +engaging 0.485 +bounty 0.485 +prestige 0.485 +yummy 0.484 +chocolate 0.484 +desire 0.484 +heyday 0.484 +selfworth 0.484 +dream 0.484 +transcendence 0.484 +luck 0.484 +creativity 0.484 +bouquet 0.484 +aloha 0.484 +trophy 0.484 +fete 0.484 +destiny 0.484 +datenight 0.484 +boyfriend 0.480 +commemoration 0.479 +intelligence 0.477 +readiness 0.473 +friend 0.471 +enthusiast 0.471 +bride 0.471 +lush 0.470 +inheritance 0.470 +calming 0.470 +soothe 0.470 +adventure 0.470 +kiddo 0.470 +nostalgia 0.470 +tickle 0.470 +massage 0.470 +purring 0.469 +bonding 0.469 +eternal 0.469 +benevolence 0.469 +nurture 0.469 +giving 0.469 +princess 0.469 +pretty 0.469 +amicable 0.469 +getaway 0.469 +goals 0.469 +humanitarian 0.469 +luster 0.469 +bridegroom 0.469 +pray 0.469 +rest 0.469 +heartily 0.469 +child 0.466 +salutary 0.465 +invite 0.457 +beam 0.456 +reminiscing 0.456 +tropical 0.455 +befriend 0.455 +hee 0.455 +ceremony 0.455 +friday 0.455 +elevation 0.455 +sonice 0.455 +aesthetics 0.455 +scholarship 0.455 +kindred 0.455 +mindfulness 0.455 +freshair 0.455 +birth 0.453 +scenery 0.453 +faith 0.453 +namaste 0.453 +vindication 0.453 +allure 0.453 +noworries 0.453 +commemorate 0.453 +approve 0.453 +forgiveness 0.453 +waterfall 0.453 +journey 0.447 +meditation 0.446 +relaxed 0.442 +weekend 0.441 +tranquil 0.441 +tender 0.441 +present 0.441 +righteousness 0.439 +sharing 0.439 +lyrical 0.439 +esteem 0.439 +nostalgic 0.439 +prayer 0.439 +unbeaten 0.438 +share 0.438 +eager 0.438 +strength 0.438 +meditate 0.438 +newday 0.438 +husband 0.438 +life 0.438 +sonnet 0.438 +relief 0.438 +mighty 0.438 +warm 0.429 +winterbreak 0.429 +movingforward 0.429 +buddy 0.427 +oneness 0.426 +medal 0.424 +unsurpassed 0.424 +carols 0.424 +candlelight 0.424 +amen 0.424 +reverence 0.424 +ejaculation 0.424 +healthful 0.424 +unconstrained 0.424 +thelittlethings 0.424 +wealth 0.422 +graduation 0.422 +glitter 0.422 +lml 0.422 +ease 0.422 +sledding 0.422 +safe 0.422 +frisky 0.422 +energy 0.422 +calmness 0.422 +symphony 0.422 +helpful 0.422 +musical 0.422 +beginnings 0.422 +nostress 0.421 +soundness 0.421 +promise 0.415 +reunite 0.414 +mother 0.412 +salvation 0.412 +poems 0.412 +purify 0.409 +travel 0.409 +lavender 0.409 +aromatherapy 0.409 +inauguration 0.409 +clown 0.409 +immaculate 0.409 +lighten 0.409 +star 0.406 +completing 0.406 +heal 0.406 +live 0.406 +cash 0.406 +companion 0.406 +opportune 0.406 +charity 0.406 +flowers 0.406 +wishing 0.406 +income 0.403 +soul 0.401 +munchies 0.400 +progress 0.397 +indescribable 0.397 +christian 0.397 +emancipation 0.397 +equality 0.394 +rhythmical 0.394 +childhood 0.394 +calm 0.394 +picnic 0.394 +together 0.394 +fullness 0.394 +hammock 0.394 +movies 0.393 +zealous 0.393 +choir 0.391 +goofy 0.391 +humanity 0.391 +adventures 0.391 +affluence 0.391 +playground 0.391 +starry 0.391 +meaningful 0.391 +auspicious 0.391 +littlethings 0.391 +warms 0.391 +gesture 0.387 +witty 0.382 +shopping 0.382 +vow 0.382 +communion 0.379 +jump 0.379 +vibes 0.379 +worship 0.379 +reverend 0.377 +unique 0.375 +scenic 0.375 +courtship 0.375 +reunion 0.375 +rising 0.375 +full 0.375 +redeemed 0.375 +unforgettable 0.375 +mirth 0.375 +hymn 0.375 +simplicity 0.375 +spirits 0.375 +youth 0.375 +beaches 0.375 +experience 0.375 +advance 0.375 +sonorous 0.375 +baptismal 0.368 +alliance 0.368 +grant 0.366 +moonlight 0.364 +kitten 0.364 +authentic 0.364 +conciliation 0.364 +sanctification 0.364 +improve 0.364 +pure 0.364 +improves 0.364 +weightloss 0.362 +raspberries 0.360 +feeling 0.359 +devotional 0.359 +fidelity 0.359 +listenting 0.359 +proficiency 0.359 +jest 0.359 +independent 0.359 +tinsel 0.359 +revival 0.359 +sanctify 0.359 +cocoa 0.353 +giver 0.353 +purpose 0.348 +romp 0.348 +deliverance 0.348 +dolphin 0.348 +unification 0.348 +roaring 0.348 +melody 0.348 +choral 0.348 +favor 0.348 +exceed 0.348 +hotyoga 0.347 +electric 0.344 +nowork 0.344 +hedonism 0.344 +pledge 0.344 +humble 0.344 +kiddos 0.344 +thx 0.344 +fruits 0.344 +newstart 0.344 +manicure 0.344 +cookies 0.344 +date 0.344 +roadtrip 0.344 +voluptuous 0.344 +celebrity 0.342 +rhythm 0.338 +bridesmaid 0.338 +obliging 0.333 +familiarity 0.333 +spa 0.333 +connoisseur 0.333 +coffee 0.333 +edification 0.333 +partner 0.333 +garden 0.333 +renovation 0.333 +gazing 0.333 +dawn 0.333 +snowday 0.333 +young 0.333 +foodie 0.331 +synchronize 0.329 +saint 0.328 +carol 0.328 +hobby 0.328 +noregrets 0.328 +amnesty 0.328 +healing 0.328 +tribulation 0.328 +TRUE 0.328 +chirping 0.328 +psalm 0.328 +pedicure 0.328 +respite 0.324 +mellow 0.318 +recreational 0.318 +classics 0.318 +cousins 0.318 +restorative 0.318 +lazyday 0.318 +reconciliation 0.316 +superman 0.312 +living 0.312 +simplify 0.312 +recovery 0.312 +relight 0.312 +sunset 0.312 +crafts 0.312 +pony 0.312 +deal 0.312 +presto 0.312 +fitness 0.312 +sterling 0.312 +wisdom 0.312 +dove 0.312 +playhouse 0.312 +woods 0.312 +muchneeded 0.312 +progression 0.312 +lord 0.312 +improvement 0.309 +infant 0.309 +absolution 0.306 +endless 0.303 +established 0.303 +banquet 0.303 +decorating 0.303 +honest 0.303 +gently 0.303 +providing 0.300 +softly 0.297 +yearning 0.297 +spiritual 0.297 +growth 0.297 +quaint 0.297 +notable 0.297 +feat 0.297 +strolling 0.297 +lounging 0.297 +meditating 0.297 +fraternal 0.297 +joker 0.297 +spending 0.297 +light 0.297 +morals 0.297 +mine 0.297 +harvest 0.297 +breeze 0.297 +fervor 0.295 +volunteer 0.294 +quotes 0.294 +gain 0.288 +create 0.288 +midwife 0.288 +resources 0.288 +psalms 0.288 +taoism 0.288 +hippie 0.288 +receiving 0.287 +ocean 0.286 +lsd 0.286 +snowfall 0.286 +hiking 0.283 +chill 0.281 +evergreen 0.281 +candid 0.281 +unwind 0.281 +toast 0.281 +destination 0.281 +infinity 0.281 +buddhist 0.281 +rested 0.281 +truce 0.281 +buzzing 0.281 +venerable 0.279 +retirement 0.275 +balance 0.275 +buddha 0.273 +drinks 0.273 +compensate 0.273 +fireplace 0.273 +devout 0.273 +rapt 0.273 +swim 0.273 +snowing 0.271 +sublimation 0.270 +fruity 0.268 +whim 0.266 +salute 0.266 +sun 0.266 +sunday 0.266 +buddhism 0.266 +cathedral 0.266 +ministry 0.266 +humility 0.266 +yoga 0.266 +fortitude 0.266 +sketching 0.266 +paragon 0.266 +waves 0.266 +artwork 0.265 +practiced 0.264 +clean 0.260 +food 0.258 +exercise 0.258 +immerse 0.258 +running 0.258 +fitting 0.258 +found 0.258 +clarity 0.258 +autumn 0.254 +countryside 0.250 +undying 0.250 +diary 0.250 +football 0.250 +fit 0.250 +visitor 0.250 +ardent 0.250 +chilled 0.250 +chirp 0.250 +mountain 0.250 +expedient 0.250 +hardy 0.250 +candles 0.250 +contagious 0.250 +advocacy 0.250 +outdoors 0.250 +clap 0.250 +demonstrative 0.250 +morning 0.250 +cradle 0.247 +trance 0.246 +preservative 0.242 +procession 0.242 +grow 0.242 +intense 0.242 +church 0.242 +pay 0.242 +breakfast 0.242 +supremacy 0.242 +consecration 0.235 +incense 0.234 +ordination 0.234 +lyre 0.234 +vote 0.234 +nursery 0.234 +skiing 0.234 +humbled 0.234 +salary 0.234 +art 0.234 +candle 0.234 +snowy 0.234 +doll 0.234 +lifetime 0.234 +pastry 0.229 +remedy 0.227 +firefly 0.227 +chilling 0.227 +rescue 0.225 +perspective 0.221 +orchard 0.221 +camping 0.221 +orchestra 0.221 +breezy 0.219 +possess 0.219 +lamb 0.219 +castle 0.219 +gardens 0.219 +brisk 0.212 +ribbon 0.212 +raindrops 0.212 +reggae 0.212 +pho 0.212 +teach 0.212 +repay 0.212 +listneing 0.212 +mucis 0.212 +bouttime 0.212 +countrymusic 0.212 +nap 0.206 +vernal 0.203 +lights 0.203 +legalized 0.203 +hire 0.203 +uncontrollable 0.203 +chant 0.203 +unexpected 0.203 +stillness 0.203 +cove 0.203 +save 0.200 +symmetry 0.197 +pastor 0.197 +atone 0.197 +trees 0.197 +oneday 0.197 +scripture 0.196 +mountains 0.194 +quiet 0.188 +liquor 0.188 +walking 0.188 +craziness 0.188 +custom 0.188 +pathway 0.188 +forefathers 0.188 +sympathetic 0.188 +whiteness 0.188 +tea 0.188 +soppy 0.188 +patient 0.186 +dollhouse 0.182 +bath 0.182 +score 0.182 +movingon 0.182 +supporter 0.180 +accompaniment 0.179 +pursuit 0.176 +outburst 0.176 +frosty 0.174 +workout 0.172 +closure 0.172 +luncheon 0.172 +wintery 0.172 +service 0.172 +civilized 0.169 +wages 0.169 +december 0.167 +fain 0.167 +glide 0.162 +acrobat 0.162 +finally 0.157 +chai 0.156 +obtainable 0.156 +organization 0.156 +peppermint 0.156 +stroll 0.156 +break 0.156 +elf 0.156 +bathtub 0.156 +reproductive 0.156 +balm 0.152 +advent 0.152 +measured 0.152 +scifi 0.152 +spaniel 0.145 +tan 0.141 +ditty 0.141 +bubble 0.141 +beer 0.141 +simple 0.141 +oils 0.141 +green 0.137 +books 0.136 +buss 0.136 +makingdisciples 0.136 +chow 0.135 +pitter 0.134 +flows 0.130 +silence 0.127 +bookstore 0.125 +circumstances 0.125 +solitude 0.125 +roadster 0.125 +wine 0.125 +wilderness 0.121 +soak 0.121 +priesthood 0.121 +japan 0.121 +critical 0.116 +neutral 0.114 +wind 0.109 +hunting 0.109 +untie 0.109 +opera 0.109 +white 0.109 +weight 0.109 +sand 0.109 +classical 0.106 +labor 0.106 +affliction 0.103 +lake 0.103 +organ 0.094 +dwelling 0.094 +tree 0.090 +pond 0.089 +latte 0.078 +marrow 0.078 +sipping 0.076 +benign 0.074 +majority 0.073 +leaf 0.065 +troubles 0.062 +basketball 0.062 +explosions 0.061 +cream 0.061 +shepherd 0.058 +tuesday 0.047 +turbulence 0.045 +calf 0.040 +hardship 0.031 +unhappiness 0.016 +sixty 0.016 diff --git a/app-gui/src/main/resources/emolex/sadness-scores.txt b/app-gui/src/main/resources/emolex/sadness-scores.txt new file mode 100644 index 0000000..e1ec741 --- /dev/null +++ b/app-gui/src/main/resources/emolex/sadness-scores.txt @@ -0,0 +1,1298 @@ +heartbreaking 0.969 +mourning 0.969 +tragic 0.961 +holocaust 0.953 +suicidal 0.941 +misery 0.938 +massacre 0.931 +euthanasia 0.927 +depression 0.925 +fatal 0.922 +bereavement 0.922 +grieving 0.922 +bereaved 0.920 +devastation 0.917 +death 0.915 +suicide 0.912 +devastated 0.912 +catastrophe 0.911 +horrifying 0.907 +tragedy 0.906 +died 0.906 +depressing 0.906 +anguish 0.902 +agony 0.900 +deadly 0.898 +weeping 0.896 +deceased 0.891 +stillbirth 0.891 +murderer 0.877 +cancer 0.875 +dying 0.875 +rape 0.875 +devastating 0.875 +sadness 0.864 +morbidity 0.864 +execution 0.859 +abandonment 0.859 +crucifixion 0.859 +grief 0.859 +depressed 0.859 +perish 0.859 +traumatic 0.859 +atrocity 0.859 +cadaver 0.853 +betrayed 0.848 +treachery 0.848 +funeral 0.844 +grieve 0.844 +murderous 0.844 +miserable 0.844 +hopelessness 0.844 +persecution 0.844 +sad 0.844 +suffering 0.844 +sorrow 0.844 +homicide 0.844 +slaughtering 0.844 +destroyed 0.844 +horrific 0.844 +unhappiness 0.839 +crippled 0.836 +bloodshed 0.836 +pained 0.833 +manslaughter 0.833 +carnage 0.833 +unbearable 0.830 +stillborn 0.830 +torment 0.828 +helplessness 0.828 +annihilation 0.828 +slavery 0.828 +annihilated 0.828 +enslaved 0.828 +casualty 0.828 +horrors 0.828 +murder 0.828 +mourn 0.828 +morbid 0.828 +abandoned 0.828 +sickness 0.828 +mutilation 0.828 +miscarriage 0.824 +starvation 0.819 +cruelty 0.812 +childloss 0.812 +disgrace 0.812 +killing 0.812 +oppression 0.812 +terrorism 0.812 +failure 0.812 +famine 0.812 +heartache 0.812 +burial 0.812 +saddens 0.812 +distraught 0.812 +despair 0.812 +sadly 0.812 +mournful 0.812 +bloody 0.806 +inhumanity 0.804 +perishing 0.804 +malignancy 0.803 +mortification 0.802 +kill 0.797 +lifeless 0.797 +dreadful 0.797 +slave 0.797 +desolation 0.797 +devastate 0.797 +perished 0.797 +assassination 0.797 +mortuary 0.797 +dreadfully 0.797 +leukemia 0.797 +sarcoma 0.797 +lethal 0.797 +gallows 0.797 +brokenheart 0.792 +banishment 0.790 +afflict 0.789 +disheartened 0.788 +bury 0.781 +desecration 0.781 +demoralized 0.781 +tumour 0.781 +terrorize 0.781 +crying 0.781 +heartbreak 0.781 +die 0.773 +lynch 0.773 +sufferer 0.770 +loneliness 0.766 +abortion 0.766 +dismemberment 0.766 +diseased 0.766 +fearful 0.766 +destitute 0.766 +torture 0.766 +slayer 0.766 +cemetery 0.766 +fatality 0.766 +condolence 0.766 +doomed 0.766 +painfully 0.758 +moribund 0.758 +disaster 0.758 +depress 0.755 +condemnation 0.754 +victimized 0.750 +obliteration 0.750 +depressive 0.750 +terrorist 0.750 +guilt 0.750 +incest 0.750 +pandemic 0.750 +unhappy 0.750 +defeated 0.750 +painful 0.750 +deplorable 0.750 +damnation 0.750 +doomsday 0.750 +corpse 0.750 +abduction 0.750 +sorrowful 0.750 +regretful 0.750 +desperation 0.750 +cry 0.750 +sickening 0.750 +hemorrhage 0.750 +unfairness 0.745 +molestation 0.744 +exile 0.742 +abysmal 0.742 +hellish 0.738 +exterminate 0.736 +disgraced 0.734 +homeless 0.734 +destroying 0.734 +battered 0.734 +betrayal 0.734 +horrid 0.734 +warfare 0.734 +assassin 0.734 +disastrous 0.734 +lonesome 0.734 +miserably 0.734 +morgue 0.734 +slaughter 0.734 +earthquake 0.734 +orphan 0.734 +listless 0.729 +grave 0.727 +emptiness 0.727 +unfortunately 0.727 +alienated 0.727 +fraught 0.722 +forsaken 0.719 +leprosy 0.719 +cried 0.719 +paralysis 0.719 +malicious 0.719 +ashamed 0.719 +woe 0.719 +danger 0.719 +disheartening 0.719 +heartless 0.719 +violently 0.719 +cripple 0.719 +horror 0.719 +atrophy 0.719 +missing 0.719 +emaciated 0.719 +pain 0.719 +demise 0.717 +sickly 0.712 +disgruntled 0.712 +violence 0.712 +rejected 0.712 +torn 0.710 +calamity 0.709 +grim 0.708 +grievous 0.704 +hearse 0.703 +extinct 0.703 +crushed 0.703 +isolation 0.703 +meltdown 0.703 +obit 0.703 +paralyzed 0.703 +carcinoma 0.703 +suffocating 0.703 +deformed 0.703 +inhuman 0.703 +punishing 0.703 +incurable 0.703 +strangle 0.703 +disfigured 0.703 +victim 0.703 +deformity 0.703 +slaughterhouse 0.703 +decomposition 0.703 +humiliate 0.703 +buried 0.703 +oppressor 0.703 +abandon 0.703 +tearful 0.703 +isolate 0.703 +lifesucks 0.700 +hell 0.700 +ruinous 0.698 +banish 0.697 +ruined 0.697 +accursed 0.697 +widow 0.697 +vanished 0.695 +displaced 0.691 +poverty 0.690 +illness 0.688 +hopeless 0.688 +travesty 0.688 +deserted 0.688 +regretting 0.688 +loss 0.688 +pathetic 0.688 +nohope 0.688 +stab 0.688 +shooting 0.688 +foreveralone 0.688 +imprisoned 0.688 +insanity 0.688 +hurtful 0.688 +terminal 0.688 +epidemic 0.688 +hurt 0.688 +depraved 0.688 +banished 0.688 +infidelity 0.688 +neglected 0.688 +sob 0.688 +teary 0.688 +dementia 0.688 +widower 0.688 +hospice 0.688 +dismissal 0.686 +alienation 0.685 +hardship 0.685 +kidnap 0.682 +choke 0.682 +bleeding 0.673 +outcast 0.672 +despairing 0.672 +woefully 0.672 +belittle 0.672 +evil 0.672 +disparage 0.672 +feelingdown 0.672 +imprisonment 0.672 +frightful 0.672 +punished 0.672 +missingyou 0.672 +wretched 0.672 +abortive 0.672 +obituary 0.672 +gory 0.672 +wretch 0.672 +poison 0.672 +coffin 0.672 +deprivation 0.672 +malevolent 0.672 +wail 0.672 +disabled 0.672 +decomposed 0.672 +barren 0.670 +poisoned 0.667 +executioner 0.667 +disease 0.665 +oppress 0.664 +disembodied 0.660 +tear 0.656 +hate 0.656 +lonely 0.656 +dreary 0.656 +blighted 0.656 +ailing 0.656 +demonic 0.656 +peril 0.656 +jail 0.656 +lamenting 0.656 +shitty 0.656 +polio 0.656 +mangle 0.656 +ruin 0.656 +weep 0.656 +steal 0.656 +casket 0.656 +bleak 0.656 +carcass 0.653 +regretted 0.652 +beating 0.652 +cowardice 0.652 +disability 0.648 +affliction 0.645 +emergency 0.641 +hatred 0.641 +termination 0.641 +awful 0.641 +exorcism 0.641 +sinful 0.641 +scourge 0.641 +perilous 0.641 +poisonous 0.641 +worry 0.641 +drown 0.641 +infertility 0.641 +shroud 0.641 +powerless 0.641 +woeful 0.641 +failing 0.641 +terribly 0.641 +inequality 0.641 +incarceration 0.641 +stricken 0.641 +psychosis 0.638 +disappointed 0.636 +demolish 0.636 +dismay 0.636 +lament 0.636 +burdensome 0.634 +mausoleum 0.630 +shattered 0.630 +tyrant 0.625 +disappointing 0.625 +insurmountable 0.625 +wound 0.625 +impotence 0.625 +wrecked 0.625 +abuse 0.625 +demolished 0.625 +palsy 0.625 +lost 0.625 +posthumous 0.625 +gloom 0.625 +schizophrenia 0.625 +cursed 0.625 +undesired 0.625 +forlorn 0.625 +terminate 0.625 +dishonor 0.625 +regret 0.625 +bitterly 0.625 +hurting 0.625 +duress 0.625 +oppressive 0.625 +deteriorate 0.625 +soulless 0.623 +divorce 0.623 +melancholy 0.621 +cremation 0.621 +bomb 0.621 +forsake 0.621 +worried 0.621 +plight 0.621 +unforgiving 0.612 +sepsis 0.611 +overwhelmed 0.609 +fearfully 0.609 +languishing 0.609 +alcoholism 0.609 +irreparable 0.609 +bankrupt 0.609 +gore 0.609 +debacle 0.609 +cruel 0.609 +injured 0.609 +faithless 0.609 +ugliness 0.609 +derogatory 0.609 +injure 0.609 +disappoint 0.609 +crushing 0.609 +shackle 0.609 +dire 0.609 +sacrifices 0.609 +breakup 0.609 +subjugation 0.609 +excluded 0.609 +sinner 0.609 +degrading 0.609 +worthless 0.609 +guilty 0.609 +shatter 0.609 +disparaging 0.609 +dilapidated 0.609 +shameful 0.609 +curse 0.608 +anthrax 0.600 +robbery 0.600 +alone 0.600 +angst 0.598 +losing 0.594 +prison 0.594 +somber 0.594 +contaminated 0.594 +deprived 0.594 +martyrdom 0.594 +irreconcilable 0.594 +poaching 0.594 +bawl 0.594 +eviction 0.594 +ill 0.594 +helpless 0.594 +downfall 0.594 +deportation 0.594 +crumbling 0.594 +distress 0.594 +disappointment 0.594 +demon 0.594 +nothingness 0.594 +condolences 0.594 +crypt 0.594 +longing 0.594 +shame 0.594 +captivity 0.594 +obliterate 0.594 +chaos 0.594 +violation 0.594 +vendetta 0.594 +broken 0.594 +abyss 0.594 +petloss 0.594 +offender 0.594 +remorse 0.594 +betray 0.594 +dysentery 0.593 +blight 0.591 +melancholic 0.591 +rupture 0.588 +traitor 0.588 +haggard 0.587 +lie 0.585 +cholera 0.583 +degeneracy 0.578 +undesirable 0.578 +gloomy 0.578 +turmoil 0.578 +terrible 0.578 +frighten 0.578 +unwell 0.578 +bully 0.578 +bitterness 0.578 +discrimination 0.578 +whine 0.578 +humiliation 0.578 +sordid 0.578 +immoral 0.578 +harmful 0.578 +interment 0.578 +denied 0.578 +damage 0.578 +delirium 0.576 +captive 0.576 +pessimism 0.576 +deplore 0.576 +whimper 0.576 +disliked 0.576 +devil 0.576 +damages 0.576 +hateful 0.575 +bigoted 0.574 +perdition 0.569 +adultery 0.566 +corrupting 0.565 +worsening 0.562 +flog 0.562 +dismal 0.562 +comatose 0.562 +autopsy 0.562 +worrying 0.562 +deceive 0.562 +tomb 0.562 +deceit 0.562 +wallow 0.562 +pessimist 0.562 +rejection 0.562 +sadday 0.562 +shipwreck 0.562 +deceitful 0.562 +urn 0.562 +punitive 0.562 +injury 0.562 +resentment 0.562 +endocarditis 0.562 +rheumatism 0.562 +infliction 0.562 +expire 0.562 +tyranny 0.562 +anathema 0.562 +pauper 0.562 +runaway 0.562 +upset 0.562 +departed 0.558 +martyr 0.556 +smite 0.555 +malaria 0.547 +hanging 0.547 +chagrin 0.547 +malaise 0.547 +memorial 0.547 +resignation 0.547 +absence 0.547 +imissyou 0.547 +bummed 0.547 +unkind 0.547 +isolated 0.547 +plague 0.547 +shot 0.547 +bomber 0.547 +hydrocephalus 0.547 +surrendering 0.547 +unfulfilled 0.547 +discourage 0.547 +disillusionment 0.547 +reject 0.547 +shun 0.547 +pity 0.547 +glum 0.547 +nefarious 0.546 +groan 0.545 +concussion 0.545 +dark 0.545 +incrimination 0.545 +weakly 0.544 +aching 0.544 +discontent 0.543 +undertaker 0.538 +assailant 0.536 +deterioration 0.536 +sorely 0.531 +antisocial 0.531 +homesick 0.531 +confined 0.531 +inimical 0.531 +attacking 0.531 +tarnish 0.531 +forfeiture 0.531 +theft 0.531 +outburst 0.531 +fooled 0.531 +disgust 0.531 +embolism 0.531 +requiem 0.531 +console 0.531 +dispossessed 0.531 +disparity 0.531 +sick 0.531 +prisoner 0.531 +embarrassment 0.531 +ache 0.531 +inflict 0.531 +neurosis 0.531 +epitaph 0.531 +penance 0.531 +sullen 0.531 +grievance 0.530 +relapse 0.530 +forgotten 0.530 +unpleasant 0.530 +disable 0.529 +defenseless 0.526 +defunct 0.518 +ridicule 0.518 +misfortune 0.516 +blindness 0.516 +unfriendly 0.516 +delusion 0.516 +wither 0.516 +stifled 0.516 +elimination 0.516 +unlucky 0.516 +sore 0.516 +retard 0.516 +vegetative 0.516 +stripped 0.516 +sin 0.516 +sequestration 0.516 +displeased 0.516 +accident 0.516 +dumps 0.516 +hideous 0.516 +weakness 0.516 +decayed 0.516 +unrequited 0.509 +dictatorship 0.509 +complain 0.509 +lose 0.509 +regrettable 0.509 +insecure 0.509 +witchcraft 0.508 +drugged 0.500 +disrespectful 0.500 +unfair 0.500 +gonorrhea 0.500 +disturbed 0.500 +rot 0.500 +negative 0.500 +howl 0.500 +dolor 0.500 +mortality 0.500 +mad 0.500 +atherosclerosis 0.500 +impossible 0.500 +crash 0.500 +injurious 0.500 +chronic 0.500 +frowning 0.500 +discomfort 0.500 +intolerant 0.500 +ungodly 0.500 +aftermath 0.500 +explode 0.500 +cringe 0.500 +battled 0.500 +deport 0.500 +nauseous 0.500 +exclusion 0.500 +aggravating 0.500 +senile 0.500 +anxiety 0.500 +weary 0.500 +cytomegalovirus 0.500 +prosecute 0.500 +difficulty 0.500 +bier 0.500 +bankruptcy 0.500 +endemic 0.500 +offended 0.500 +damper 0.500 +messedup 0.500 +coma 0.500 +evict 0.500 +derogation 0.491 +rob 0.491 +shriek 0.485 +recession 0.485 +evasion 0.484 +wrongful 0.484 +resign 0.484 +coward 0.484 +moan 0.484 +weariness 0.484 +inadequate 0.484 +disturbance 0.484 +insult 0.484 +frailty 0.484 +adversity 0.484 +repress 0.484 +wince 0.484 +worn 0.484 +nasty 0.484 +sabotage 0.484 +criticism 0.484 +arsenic 0.484 +reprisal 0.484 +beg 0.484 +hospital 0.484 +offense 0.484 +broke 0.484 +infectious 0.483 +dishonest 0.482 +decay 0.482 +dissolution 0.480 +lowest 0.478 +unhealthy 0.474 +irritation 0.470 +perversion 0.469 +disapproval 0.469 +moody 0.469 +vulnerability 0.469 +penal 0.469 +domination 0.469 +unfavorable 0.469 +illegal 0.469 +uncaring 0.469 +leftout 0.469 +segregate 0.469 +collusion 0.469 +unfortunate 0.469 +sedition 0.469 +penalty 0.469 +pernicious 0.469 +ail 0.469 +conflict 0.469 +dashed 0.469 +uneasiness 0.469 +convict 0.469 +collapse 0.469 +fallout 0.469 +expulsion 0.469 +frustrate 0.469 +criticize 0.469 +measles 0.469 +recidivism 0.469 +frayed 0.467 +infamy 0.464 +plunder 0.461 +depreciated 0.460 +wane 0.456 +badly 0.455 +unlawful 0.455 +gone 0.453 +scarcity 0.453 +secluded 0.453 +memorials 0.453 +surrender 0.453 +inability 0.453 +tribulation 0.453 +perplexity 0.453 +inhospitable 0.453 +invade 0.453 +worse 0.453 +disapprove 0.453 +wrongly 0.453 +revolver 0.453 +vulgarity 0.453 +bittersweet 0.453 +discriminate 0.453 +foreclose 0.453 +upheaval 0.453 +wreck 0.453 +despotism 0.453 +fell 0.453 +frown 0.453 +confiscate 0.453 +criticise 0.453 +doldrums 0.453 +refugee 0.453 +avalanche 0.453 +lowly 0.448 +lone 0.446 +guillotine 0.446 +encumbrance 0.441 +annulment 0.440 +delirious 0.439 +confinement 0.439 +badday 0.439 +bummer 0.439 +underpaid 0.438 +detainee 0.438 +restriction 0.438 +stigma 0.438 +fugitive 0.438 +sympathize 0.438 +indigent 0.438 +bum 0.438 +pensive 0.438 +paucity 0.438 +blues 0.438 +emotional 0.438 +diminish 0.438 +disapproving 0.438 +disapproved 0.438 +darkened 0.438 +apathetic 0.438 +imprudent 0.438 +abscess 0.438 +insignificant 0.438 +animosity 0.438 +cancellation 0.438 +problem 0.438 +forbid 0.438 +lunacy 0.438 +dislocated 0.438 +disagreement 0.438 +lethargy 0.438 +rejects 0.438 +disconnected 0.438 +absent 0.438 +departure 0.438 +ghetto 0.438 +unattainable 0.438 +futile 0.438 +coercion 0.438 +deflate 0.438 +insolvency 0.438 +farewell 0.438 +appendicitis 0.438 +bothering 0.435 +disqualified 0.435 +tripping 0.429 +sunk 0.426 +draining 0.424 +lastday 0.424 +varicella 0.424 +retribution 0.424 +cardiomyopathy 0.422 +scarce 0.422 +thief 0.422 +unequal 0.422 +cutting 0.422 +neuralgia 0.422 +unwelcome 0.422 +haunted 0.422 +insolvent 0.422 +rip 0.422 +cyst 0.422 +jarring 0.422 +deviation 0.422 +wrongdoing 0.422 +bad 0.422 +handicap 0.422 +dispassionate 0.422 +falling 0.422 +beggar 0.422 +difficulties 0.421 +invader 0.420 +drab 0.420 +fall 0.418 +illegitimate 0.416 +expel 0.414 +darkness 0.409 +meaningless 0.409 +syncope 0.407 +obnoxious 0.406 +darken 0.406 +enmity 0.406 +bitch 0.406 +confine 0.406 +hoax 0.406 +precarious 0.406 +feudalism 0.406 +wildfire 0.406 +fatigued 0.406 +fault 0.406 +stroke 0.406 +subjected 0.406 +fury 0.406 +unsatisfied 0.405 +spank 0.403 +deluge 0.402 +sigh 0.402 +spinster 0.400 +blue 0.400 +owing 0.398 +needalife 0.398 +embarrass 0.394 +pitfall 0.394 +seriousness 0.394 +pointless 0.394 +cage 0.391 +brute 0.391 +exhausted 0.391 +debt 0.391 +condescension 0.391 +reproach 0.391 +noose 0.391 +insulting 0.391 +ifonly 0.391 +stretcher 0.391 +trickery 0.391 +punch 0.391 +coldness 0.391 +dwarfed 0.391 +ravenous 0.391 +feeble 0.391 +inefficient 0.391 +refused 0.391 +daemon 0.391 +banshee 0.391 +monsoon 0.391 +rue 0.391 +ineptitude 0.391 +subvert 0.384 +jealousy 0.382 +geriatric 0.379 +miss 0.379 +struggle 0.379 +inexcusable 0.379 +entangled 0.377 +descent 0.377 +ashes 0.377 +inconsiderate 0.375 +sucks 0.375 +blackness 0.375 +slump 0.375 +noncompliance 0.375 +scar 0.375 +murky 0.375 +funk 0.375 +landslide 0.375 +disqualify 0.375 +wasting 0.375 +exhaustion 0.375 +goodbye 0.375 +sympathy 0.375 +oust 0.375 +parting 0.375 +withdraw 0.375 +inferior 0.375 +prostitution 0.375 +dispel 0.375 +overcast 0.375 +rabid 0.375 +unattractive 0.373 +delay 0.373 +apologize 0.370 +crazy 0.368 +bastard 0.366 +deteriorated 0.365 +inter 0.364 +empty 0.364 +mocking 0.363 +adder 0.361 +perpetrator 0.359 +hindering 0.359 +affront 0.359 +arraignment 0.359 +fruitless 0.359 +unable 0.359 +disconnect 0.359 +defendant 0.359 +corse 0.359 +obesity 0.359 +taunt 0.359 +servile 0.359 +misunderstanding 0.359 +austere 0.359 +doubt 0.359 +wrangling 0.359 +hunter 0.359 +unsuccessful 0.359 +inefficiency 0.359 +consecration 0.359 +tremor 0.359 +unemployed 0.359 +fuss 0.359 +unpopular 0.359 +fainting 0.359 +numbness 0.359 +flounder 0.359 +idiocy 0.359 +lockup 0.359 +plaintive 0.359 +unrest 0.351 +spoiler 0.348 +intervention 0.348 +waste 0.348 +wimpy 0.348 +absentee 0.348 +flaw 0.347 +desert 0.344 +cumbersome 0.344 +specter 0.344 +resigned 0.344 +furrow 0.344 +lagging 0.344 +forfeit 0.344 +uninspired 0.344 +plea 0.344 +intercede 0.344 +stained 0.344 +litigate 0.344 +blindly 0.344 +attenuation 0.344 +militia 0.344 +surgery 0.344 +detention 0.344 +lawsuit 0.344 +thrash 0.344 +uninvited 0.344 +unaccountable 0.339 +myopia 0.339 +mishap 0.338 +probation 0.336 +severance 0.333 +disagreeing 0.333 +incompetent 0.328 +nether 0.328 +endless 0.328 +dependence 0.328 +disallowed 0.328 +bondage 0.328 +soreness 0.328 +unacknowledged 0.328 +squall 0.328 +unacceptable 0.328 +adrift 0.328 +nepotism 0.328 +sterile 0.328 +bacteria 0.328 +leave 0.328 +scold 0.327 +flaccid 0.324 +hobo 0.323 +fragile 0.319 +stingy 0.319 +sue 0.318 +scarcely 0.318 +wan 0.312 +committal 0.312 +mistake 0.312 +clouded 0.312 +skid 0.312 +defy 0.312 +thresh 0.312 +fatty 0.312 +nostalgia 0.312 +inhibit 0.312 +evanescence 0.312 +ulcer 0.312 +hamstring 0.312 +nonsensical 0.312 +conceal 0.311 +blemish 0.310 +resisting 0.309 +sympathetic 0.307 +bugaboo 0.304 +confess 0.303 +opium 0.303 +alas 0.302 +incase 0.297 +halting 0.297 +incompatible 0.297 +migraine 0.297 +mislead 0.297 +toocold 0.297 +suppress 0.297 +inappropriate 0.297 +discontinuity 0.297 +setback 0.297 +dull 0.297 +weak 0.297 +subsidence 0.297 +wrinkled 0.297 +hermit 0.296 +moving 0.295 +shrink 0.295 +shiver 0.291 +tramp 0.288 +unimportant 0.288 +constraint 0.288 +rubble 0.282 +negro 0.281 +grey 0.281 +flinch 0.281 +apathy 0.281 +confession 0.281 +down 0.281 +remove 0.281 +unseat 0.281 +wearily 0.281 +taint 0.281 +excluding 0.281 +overdue 0.281 +shortage 0.281 +grumpy 0.281 +flop 0.281 +revoke 0.281 +adverse 0.281 +black 0.281 +scrapie 0.281 +timid 0.281 +senseless 0.281 +knell 0.275 +soldier 0.273 +humbled 0.273 +confusion 0.273 +throb 0.273 +jurisprudence 0.273 +gray 0.269 +shack 0.266 +mixedemotions 0.266 +obstacle 0.266 +lax 0.266 +remiss 0.266 +slur 0.266 +unrealistic 0.266 +drifted 0.266 +eternity 0.266 +leaving 0.266 +inconvenient 0.263 +misrepresentation 0.259 +restrict 0.259 +stagnant 0.259 +disservice 0.258 +nosun 0.255 +backwater 0.255 +wilderness 0.255 +error 0.250 +anchorage 0.250 +unexplained 0.250 +humbug 0.250 +gullible 0.250 +speculation 0.250 +communism 0.250 +uneducated 0.250 +tempest 0.250 +bang 0.250 +labored 0.250 +incomplete 0.250 +wasteful 0.250 +pine 0.250 +undying 0.250 +older 0.250 +demonstrative 0.242 +melodrama 0.242 +rainyday 0.242 +necessity 0.236 +boredom 0.235 +cloudy 0.234 +hollow 0.234 +burke 0.234 +trash 0.234 +pale 0.234 +depart 0.234 +uninteresting 0.234 +sentence 0.234 +void 0.234 +cancel 0.234 +foggy 0.234 +warp 0.234 +misty 0.234 +blockade 0.234 +healing 0.234 +case 0.228 +rainy 0.227 +onerous 0.223 +bottom 0.223 +uninterested 0.223 +fasting 0.220 +coping 0.219 +discolored 0.219 +thirst 0.219 +boooo 0.219 +pious 0.219 +blunder 0.219 +indifference 0.219 +dole 0.219 +cocaine 0.218 +tough 0.212 +revolution 0.203 +fat 0.203 +arid 0.203 +sluggish 0.203 +yucky 0.203 +sprain 0.203 +chilly 0.203 +lower 0.203 +chargeable 0.203 +hoary 0.203 +wanting 0.202 +progression 0.201 +closure 0.195 +unbeaten 0.193 +rack 0.188 +halter 0.188 +meh 0.188 +cold 0.188 +tease 0.188 +splitting 0.188 +rumor 0.188 +cataract 0.188 +invalid 0.188 +heartfelt 0.188 +oddity 0.188 +veal 0.188 +retirement 0.188 +interrupted 0.188 +concerned 0.184 +sarcasm 0.181 +strip 0.179 +feeling 0.172 +sap 0.172 +memories 0.172 +eschew 0.172 +esteem 0.172 +cupping 0.172 +overload 0.172 +divided 0.172 +destination 0.170 +nosnow 0.169 +limited 0.167 +rain 0.163 +willful 0.160 +untitled 0.157 +stint 0.156 +weeds 0.156 +cross 0.156 +pare 0.155 +snort 0.154 +procession 0.152 +inconsequential 0.152 +tax 0.142 +overpriced 0.141 +lesbian 0.141 +weight 0.141 +tolerate 0.141 +mug 0.141 +emo 0.141 +touchy 0.140 +grounded 0.130 +kennel 0.130 +commemorate 0.125 +late 0.125 +theocratic 0.125 +margin 0.125 +socialist 0.125 +stillness 0.125 +meek 0.125 +terrific 0.125 +sisterhood 0.125 +clouds 0.125 +unpaid 0.125 +default 0.121 +lace 0.118 +unpublished 0.116 +interested 0.114 +fortress 0.110 +fleece 0.109 +priesthood 0.109 +rating 0.109 +ultimate 0.109 +lush 0.109 +orchestra 0.109 +harry 0.109 +sanctify 0.108 +income 0.100 +winning 0.094 +quiet 0.094 +sonnet 0.094 +boo 0.094 +vainly 0.091 +hut 0.078 +opera 0.078 +humble 0.078 +motivating 0.078 +wet 0.078 +ovation 0.078 +hug 0.078 +treat 0.076 +hymn 0.064 +honest 0.062 +relics 0.061 +couch 0.060 +waffle 0.047 +shell 0.045 +musical 0.045 +savor 0.034 +napkin 0.031 +vote 0.031 +sing 0.017 +music 0.016 +mother 0.016 +nutritious 0.015 +lovely 0.009 +liquor 0.000 +sweetheart 0.000 +romance 0.000 +art 0.000 diff --git a/app-gui/src/main/resources/emolex/surprise-scores.txt b/app-gui/src/main/resources/emolex/surprise-scores.txt new file mode 100644 index 0000000..b37981a --- /dev/null +++ b/app-gui/src/main/resources/emolex/surprise-scores.txt @@ -0,0 +1,585 @@ +surprise 0.930 +explode 0.906 +flabbergast 0.906 +explosion 0.898 +eruption 0.883 +explosive 0.883 +ambush 0.883 +frighten 0.875 +startle 0.875 +shockingly 0.875 +surprisingly 0.875 +surprised 0.867 +surprising 0.867 +frightened 0.867 +thrilling 0.859 +miracle 0.859 +outburst 0.859 +blast 0.852 +alarm 0.852 +astonishingly 0.852 +thunderstruck 0.844 +shock 0.844 +jolt 0.844 +catastrophe 0.836 +dazzle 0.836 +fright 0.836 +unexpectedly 0.836 +bang 0.836 +emergency 0.828 +startling 0.828 +bewilderment 0.828 +suddenly 0.828 +astound 0.820 +stunned 0.820 +earthquake 0.812 +disaster 0.812 +jackpot 0.812 +climax 0.805 +astonish 0.805 +aghast 0.805 +astonishment 0.805 +scare 0.797 +awestruck 0.797 +exclaim 0.789 +erupt 0.789 +bomb 0.789 +amazement 0.781 +alarming 0.773 +abduction 0.773 +invade 0.773 +miraculous 0.773 +raid 0.773 +detonate 0.773 +kidnap 0.766 +stupefy 0.758 +unpredictable 0.758 +dumfound 0.758 +overwhelming 0.758 +accident 0.750 +unimaginable 0.750 +outrageous 0.750 +erratic 0.750 +bewilder 0.742 +flinch 0.742 +amaze 0.742 +blitz 0.742 +petrify 0.742 +wreck 0.742 +horror 0.742 +slaughter 0.742 +frantic 0.734 +stupefaction 0.734 +crash 0.734 +frenetic 0.734 +excitement 0.734 +sudden 0.727 +vanished 0.727 +outcry 0.727 +moonstruck 0.727 +riotous 0.727 +bewildered 0.719 +rupture 0.719 +scream 0.719 +shriek 0.719 +amazedness 0.719 +awe 0.719 +manslaughter 0.719 +sabotage 0.719 +unanticipated 0.719 +breathless 0.719 +unexpected 0.711 +gasp 0.711 +electrify 0.711 +avalanche 0.711 +uncontrollable 0.711 +shot 0.711 +stun 0.711 +suspense 0.703 +unforeseen 0.703 +abrupt 0.703 +intruder 0.703 +devastation 0.703 +slam 0.703 +surge 0.703 +stab 0.695 +excite 0.695 +unprecedented 0.695 +yell 0.695 +strike 0.695 +dumfounder 0.695 +volatility 0.695 +urgent 0.695 +carnage 0.688 +spectacular 0.688 +disturbance 0.688 +incredible 0.688 +recklessness 0.680 +slap 0.680 +thrill 0.680 +monstrous 0.680 +clamor 0.680 +terrorist 0.672 +exhilaration 0.672 +captivate 0.672 +accidental 0.672 +inexplicable 0.672 +accidentally 0.672 +striking 0.672 +exciting 0.672 +freakish 0.664 +dire 0.664 +volcano 0.664 +topple 0.664 +revolution 0.664 +revolt 0.656 +incendiary 0.656 +sneak 0.656 +bloodshed 0.656 +unspeakable 0.656 +violent 0.648 +unintended 0.648 +mutiny 0.648 +spellbound 0.648 +epidemic 0.648 +disruption 0.648 +attacking 0.648 +amazingly 0.648 +unsuspecting 0.648 +cyclone 0.648 +excitation 0.641 +wildfire 0.641 +indescribable 0.641 +shout 0.641 +screech 0.641 +tumult 0.641 +enthusiasm 0.641 +improvisation 0.641 +agape 0.633 +gape 0.633 +apparition 0.633 +anomaly 0.633 +presto 0.633 +treachery 0.633 +uncertain 0.633 +plunder 0.633 +excited 0.625 +urgency 0.625 +murderous 0.625 +trick 0.625 +distress 0.625 +tempest 0.625 +sorcery 0.625 +wonderment 0.625 +mystery 0.625 +slaughtering 0.625 +quickness 0.617 +inimaginable 0.617 +murder 0.617 +vanish 0.617 +intense 0.617 +intrusive 0.617 +prank 0.617 +trickery 0.617 +coup 0.609 +splash 0.609 +strangle 0.609 +unstable 0.609 +thief 0.609 +magical 0.609 +shatter 0.609 +blindfold 0.609 +jubilee 0.602 +betray 0.602 +tackle 0.602 +deluge 0.602 +assail 0.602 +inconceivable 0.602 +stupor 0.602 +defy 0.602 +alerts 0.594 +stupendous 0.594 +monstrosity 0.594 +mishap 0.594 +shrill 0.594 +lightning 0.594 +uncanny 0.586 +paralyzed 0.586 +pitfall 0.586 +randomly 0.586 +mysterious 0.586 +deceit 0.586 +bonus 0.586 +wild 0.586 +wondrous 0.586 +death 0.578 +stagger 0.578 +raving 0.578 +oddity 0.578 +rejoicing 0.578 +bizarre 0.578 +jubilant 0.578 +godsend 0.578 +fluke 0.578 +electric 0.578 +premature 0.578 +revenge 0.570 +dynamic 0.570 +dismay 0.570 +uncover 0.562 +jerk 0.562 +nefarious 0.562 +reappear 0.562 +reward 0.562 +fascinate 0.562 +ecstatic 0.562 +crescendo 0.555 +whim 0.555 +conjure 0.555 +zany 0.555 +thaumaturgy 0.555 +unbridled 0.547 +tantalizing 0.547 +daze 0.547 +heroism 0.547 +thwart 0.547 +rarity 0.547 +illuminate 0.547 +ejaculation 0.547 +rescue 0.547 +winner 0.547 +illusion 0.539 +treason 0.539 +cheer 0.539 +celebration 0.539 +punch 0.539 +lunge 0.539 +lucky 0.539 +insult 0.539 +marvel 0.539 +interrupt 0.539 +violation 0.539 +concealed 0.531 +banger 0.531 +fearfully 0.531 +affront 0.531 +sensation 0.531 +jest 0.531 +snag 0.531 +improvise 0.523 +wonder 0.523 +victimized 0.523 +immediacy 0.523 +undiscovered 0.523 +rejoice 0.523 +liberate 0.523 +abandonment 0.523 +veer 0.523 +scorpion 0.523 +majestic 0.523 +tickle 0.516 +yelp 0.516 +stealthily 0.516 +chance 0.516 +howl 0.516 +transcendence 0.508 +garish 0.508 +rave 0.508 +luck 0.508 +unintentionally 0.508 +swerve 0.508 +magnificent 0.508 +reflex 0.508 +pop 0.508 +alertness 0.500 +pang 0.500 +embarrassment 0.500 +fainting 0.500 +erotic 0.500 +marvelous 0.500 +slayer 0.500 +misbehavior 0.500 +diversion 0.500 +remarkable 0.500 +enliven 0.500 +heroic 0.500 +infrequent 0.500 +chimera 0.492 +infarct 0.492 +trump 0.492 +decoy 0.492 +greatness 0.492 +unutterable 0.492 +exigent 0.492 +birthday 0.492 +camouflage 0.492 +nab 0.492 +underestimate 0.484 +daemon 0.484 +zeal 0.484 +prick 0.484 +fanfare 0.484 +inexpressible 0.484 +curiosity 0.484 +magician 0.484 +horde 0.484 +variable 0.484 +subversive 0.477 +dreadfully 0.477 +incident 0.477 +unguarded 0.477 +strange 0.477 +fortune 0.477 +gawk 0.477 +sneeze 0.477 +chicane 0.477 +illumination 0.477 +rapid 0.469 +wizard 0.469 +prowl 0.469 +leery 0.469 +reversal 0.469 +hilarious 0.461 +slip 0.461 +coincidence 0.461 +subito 0.461 +divergent 0.461 +break 0.461 +evanescence 0.453 +confession 0.453 +overestimate 0.453 +merriment 0.453 +ordeal 0.453 +hoax 0.453 +raffle 0.453 +winning 0.453 +wonderful 0.453 +feat 0.445 +excel 0.445 +stound 0.445 +gambling 0.445 +splendid 0.445 +laughter 0.445 +perchance 0.445 +enthusiast 0.445 +brighten 0.438 +senseless 0.438 +changeable 0.438 +rapt 0.438 +splendor 0.438 +unintentional 0.438 +unique 0.438 +gift 0.430 +trepidation 0.430 +stealthy 0.430 +lawsuit 0.430 +fascination 0.430 +intrigue 0.430 +fiesta 0.430 +delighted 0.430 +originality 0.422 +quicksilver 0.422 +enchant 0.422 +judgment 0.422 +stealth 0.422 +riddle 0.422 +illegitimate 0.414 +syncope 0.414 +liberation 0.414 +perjury 0.414 +veracity 0.414 +elusive 0.414 +experiment 0.414 +spirits 0.414 +eager 0.406 +allure 0.406 +applause 0.406 +fete 0.406 +inspired 0.406 +parade 0.406 +gambler 0.406 +divorce 0.398 +guess 0.398 +princely 0.398 +secrecy 0.398 +burlesque 0.398 +supremacy 0.391 +aspiration 0.391 +peri 0.391 +incontinence 0.391 +hermaphrodite 0.391 +cheerful 0.391 +inheritance 0.383 +lose 0.383 +score 0.383 +praiseworthy 0.383 +crowning 0.383 +buck 0.383 +cadaver 0.383 +compliment 0.375 +gulp 0.375 +mystic 0.375 +frisky 0.375 +camouflaged 0.375 +succeed 0.375 +advance 0.375 +hope 0.367 +joker 0.367 +excavation 0.367 +sensual 0.367 +sparkle 0.367 +entertainment 0.359 +feeling 0.359 +blessings 0.352 +award 0.352 +obit 0.352 +clown 0.352 +modify 0.352 +postponement 0.352 +newcomer 0.352 +glorify 0.344 +celebrity 0.344 +proficiency 0.344 +hero 0.344 +start 0.344 +highest 0.344 +wonderfully 0.344 +sanctify 0.336 +warned 0.336 +unbeaten 0.336 +grin 0.336 +optimism 0.336 +dissolution 0.336 +rekindle 0.336 +prodigious 0.336 +memorable 0.336 +hypertrophy 0.328 +admiration 0.328 +hap 0.320 +angel 0.320 +examination 0.320 +present 0.320 +catch 0.320 +liberty 0.312 +inaffable 0.312 +puma 0.312 +embrace 0.312 +dismissal 0.312 +treat 0.312 +flirt 0.312 +scrimmage 0.312 +kiss 0.312 +saint 0.312 +occasional 0.312 +saintly 0.305 +gratify 0.305 +sally 0.305 +perfection 0.305 +generosity 0.305 +polarity 0.297 +warn 0.297 +ceremony 0.297 +differently 0.297 +palpable 0.297 +larger 0.297 +finally 0.297 +favorable 0.297 +inviting 0.289 +greeting 0.289 +medal 0.289 +romance 0.289 +resignation 0.281 +candid 0.281 +labor 0.281 +trip 0.281 +accolade 0.281 +stare 0.273 +glimmer 0.266 +immerse 0.266 +somatic 0.266 +playful 0.266 +festival 0.266 +admire 0.266 +insolvency 0.266 +compensate 0.266 +invite 0.266 +mimicry 0.266 +hypothesis 0.258 +complement 0.258 +chuckle 0.258 +receiving 0.258 +laugh 0.258 +honeymoon 0.250 +pleasant 0.242 +independence 0.242 +marry 0.242 +opera 0.242 +hopeful 0.234 +holiness 0.234 +rhythmical 0.234 +chant 0.234 +trophy 0.234 +leave 0.234 +assessment 0.234 +procession 0.227 +deal 0.227 +placard 0.227 +cherish 0.219 +musical 0.219 +shopping 0.219 +good 0.219 +dawn 0.211 +shell 0.211 +simplify 0.211 +sweet 0.203 +purity 0.203 +nullify 0.203 +morals 0.203 +money 0.203 +precious 0.195 +preservative 0.195 +synchronize 0.195 +unfulfilled 0.195 +humanitarian 0.195 +singularly 0.188 +obliging 0.188 +foresee 0.180 +lovely 0.180 +pray 0.180 +graduation 0.180 +art 0.172 +sun 0.172 +thirst 0.172 +youth 0.172 +mouth 0.172 +goodness 0.164 +young 0.164 +practiced 0.156 +latent 0.156 +visor 0.156 +overdue 0.156 +expect 0.148 +loyal 0.148 +wireless 0.148 +destination 0.148 +cream 0.141 +quote 0.141 +infant 0.141 +slush 0.141 +playground 0.133 +organization 0.125 +vote 0.125 +teach 0.125 +smile 0.117 +weight 0.117 +dolphin 0.117 +sisterhood 0.109 +cable 0.109 +sunny 0.102 +steady 0.094 +spa 0.086 +peaceful 0.086 +leisure 0.086 +tree 0.078 +picnic 0.078 +worm 0.055 diff --git a/app-gui/src/main/resources/emolex/trust-scores.txt b/app-gui/src/main/resources/emolex/trust-scores.txt new file mode 100644 index 0000000..92393cd --- /dev/null +++ b/app-gui/src/main/resources/emolex/trust-scores.txt @@ -0,0 +1,1564 @@ +truthfulness 0.906 +trusted 0.883 +trustworthy 0.867 +honor 0.844 +honest 0.844 +honesty 0.844 +truth 0.844 +truthful 0.836 +trusting 0.836 +brotherhood 0.820 +entrust 0.812 +credibility 0.805 +honorable 0.805 +committed 0.805 +loyalty 0.805 +trust 0.805 +integrity 0.805 +faithful 0.797 +sincere 0.797 +true 0.789 +responsible 0.789 +wisdom 0.789 +partnership 0.789 +cooperative 0.781 +vow 0.781 +verification 0.781 +oath 0.781 +sisterhood 0.773 +respectable 0.773 +promise 0.773 +credible 0.773 +hero 0.773 +verified 0.773 +qualified 0.766 +respected 0.766 +authentication 0.766 +compassion 0.759 +safekeeping 0.758 +reputable 0.758 +reliability 0.758 +approval 0.758 +love 0.758 +trusts 0.758 +moral 0.758 +advised 0.750 +friend 0.750 +loyal 0.750 +respect 0.750 +ally 0.750 +genuine 0.750 +stable 0.750 +friendships 0.750 +authentic 0.750 +competence 0.750 +safeguard 0.750 +companion 0.750 +freedom 0.742 +wholesome 0.742 +accepting 0.742 +proven 0.742 +respects 0.742 +faith 0.742 +confirmation 0.734 +reassurance 0.734 +admirable 0.734 +protecting 0.734 +trustee 0.734 +heartfelt 0.734 +supporter 0.734 +respectful 0.734 +unification 0.734 +confident 0.727 +confidentially 0.727 +credential 0.727 +partners 0.727 +agreement 0.727 +friendship 0.727 +alliance 0.727 +equality 0.727 +excellence 0.727 +fact 0.727 +believing 0.727 +virtuous 0.719 +honored 0.719 +intelligence 0.719 +virtue 0.719 +closeness 0.719 +authenticate 0.719 +kindred 0.719 +justice 0.711 +charitable 0.711 +cooperation 0.711 +determination 0.711 +consistency 0.711 +dedication 0.711 +straightforward 0.711 +guarantee 0.711 +creditable 0.711 +allegiance 0.711 +cooperating 0.711 +sanctuary 0.703 +reverence 0.703 +morality 0.703 +proof 0.703 +innocent 0.703 +motherhood 0.703 +guardianship 0.703 +admiration 0.703 +fulfilled 0.703 +reliable 0.703 +admire 0.703 +friendliness 0.703 +prepared 0.703 +protected 0.703 +mentor 0.703 +assurance 0.703 +mother 0.703 +nurture 0.703 +accountable 0.695 +bodyguard 0.695 +compassionate 0.695 +agreeable 0.695 +allied 0.695 +humanitarian 0.695 +courage 0.695 +guardian 0.695 +pact 0.695 +scientist 0.695 +indestructible 0.695 +approving 0.695 +skillful 0.695 +morals 0.695 +certified 0.695 +marriage 0.695 +united 0.695 +guidance 0.688 +esteem 0.688 +valor 0.688 +competent 0.688 +secure 0.688 +pledge 0.688 +authenticity 0.688 +monogamy 0.688 +justifiable 0.688 +adviser 0.688 +humanity 0.688 +believed 0.688 +solidity 0.688 +perfection 0.688 +understanding 0.688 +familiarity 0.680 +hope 0.680 +approve 0.680 +goodness 0.680 +indivisible 0.680 +elders 0.680 +protector 0.680 +official 0.680 +diplomatic 0.680 +confide 0.680 +confirmed 0.680 +professional 0.680 +strongest 0.680 +inspire 0.680 +humble 0.680 +confidential 0.680 +grandfather 0.680 +affirm 0.680 +advocacy 0.680 +leader 0.680 +acceptance 0.680 +agreeing 0.680 +diligence 0.680 +expertise 0.680 +commendable 0.680 +encyclopedia 0.672 +accepted 0.672 +safe 0.672 +intelligent 0.672 +accredited 0.672 +covenant 0.672 +unwavering 0.672 +healing 0.672 +dignity 0.672 +believes 0.672 +mastery 0.672 +cohesive 0.672 +faultless 0.672 +harmoniously 0.672 +sanctify 0.672 +benevolence 0.672 +supporting 0.664 +merit 0.664 +disciple 0.664 +proficient 0.664 +guidebook 0.664 +heroic 0.664 +accountability 0.664 +spiritual 0.664 +reliance 0.664 +specialist 0.664 +fulfillment 0.664 +communicate 0.664 +impeccable 0.664 +ambassador 0.664 +expert 0.664 +advocate 0.664 +attestation 0.664 +accept 0.664 +team 0.664 +affirmatively 0.664 +authority 0.664 +strengthening 0.661 +steadfast 0.656 +gentleman 0.656 +excellent 0.656 +favorable 0.656 +familiar 0.656 +elder 0.656 +structure 0.656 +holiness 0.656 +warranty 0.656 +constancy 0.656 +proficiency 0.656 +counsel 0.656 +strength 0.656 +facts 0.656 +defended 0.656 +scientific 0.656 +achieve 0.656 +relationship 0.656 +supports 0.656 +assuredly 0.648 +saint 0.648 +protective 0.648 +successful 0.648 +solidarity 0.648 +counselor 0.648 +harmony 0.648 +assist 0.648 +advisable 0.648 +brother 0.648 +lovable 0.648 +matrimony 0.648 +noble 0.648 +agreed 0.648 +academic 0.648 +accepts 0.648 +unconditionally 0.648 +heroism 0.648 +competency 0.648 +rely 0.648 +uphold 0.648 +inspiration 0.648 +comrade 0.648 +peaceful 0.648 +worthy 0.643 +assure 0.641 +conscientious 0.641 +credence 0.641 +benefactor 0.641 +teacher 0.641 +ordained 0.641 +durability 0.641 +judiciary 0.641 +kind 0.641 +unity 0.641 +coexist 0.641 +establish 0.641 +relationships 0.641 +doctor 0.641 +lawful 0.641 +legal 0.641 +loving 0.641 +real 0.641 +champion 0.641 +confidence 0.641 +leading 0.641 +mamma 0.641 +intimate 0.634 +important 0.633 +legitimacy 0.633 +endorse 0.633 +fidelity 0.633 +brotherly 0.633 +bless 0.633 +homage 0.633 +fortitude 0.633 +backbone 0.633 +judicial 0.633 +authorize 0.633 +saintly 0.633 +aspiration 0.633 +courageous 0.633 +physician 0.633 +convincing 0.633 +sanctification 0.633 +soundness 0.633 +devotional 0.633 +hopeful 0.633 +approved 0.633 +deepest 0.633 +conscience 0.633 +therapeutic 0.633 +practiced 0.633 +majestic 0.625 +caretaker 0.625 +angel 0.625 +engaged 0.625 +positivity 0.625 +beliefs 0.625 +purify 0.625 +wonderful 0.625 +profound 0.625 +encourage 0.625 +certify 0.625 +assured 0.625 +regard 0.625 +professorship 0.625 +communication 0.625 +evident 0.625 +fireman 0.625 +authorization 0.625 +blessing 0.625 +accurate 0.625 +achievement 0.625 +civilized 0.625 +advice 0.617 +fundamental 0.617 +approvement 0.617 +believer 0.617 +thoughtful 0.617 +god 0.617 +haven 0.617 +absolution 0.617 +passionate 0.617 +gospel 0.617 +optimism 0.617 +corroborate 0.617 +good 0.617 +cherish 0.617 +constantly 0.617 +appreciation 0.617 +heroine 0.617 +unimpeachable 0.617 +objective 0.617 +truce 0.617 +attentive 0.617 +commend 0.617 +qualities 0.617 +rational 0.617 +bedrock 0.617 +planning 0.617 +triumphant 0.617 +teach 0.617 +accord 0.617 +testament 0.617 +surety 0.617 +reassure 0.617 +comfort 0.609 +officer 0.609 +scripture 0.609 +awareness 0.609 +progression 0.609 +excel 0.609 +steward 0.609 +considerate 0.609 +babysitter 0.609 +brilliant 0.609 +heal 0.609 +vetted 0.609 +notary 0.609 +happy 0.609 +mediator 0.609 +magnificence 0.609 +praise 0.609 +patron 0.609 +civilization 0.609 +praiseworthy 0.609 +blessings 0.609 +liking 0.609 +definitive 0.609 +purification 0.609 +recommend 0.609 +helpful 0.602 +peace 0.602 +sympathetic 0.602 +experienced 0.602 +enlightenment 0.602 +witness 0.602 +embrace 0.602 +humility 0.602 +guarded 0.602 +fulfill 0.602 +identify 0.602 +inspired 0.602 +serenity 0.602 +unconditional 0.602 +transcendence 0.602 +unquestionable 0.602 +mainstay 0.602 +symmetry 0.602 +nun 0.602 +brighten 0.602 +brave 0.602 +steady 0.602 +befriend 0.594 +philanthropic 0.594 +fairly 0.594 +efficient 0.594 +complimentary 0.594 +sage 0.594 +endowment 0.594 +depend 0.594 +assessment 0.594 +visionary 0.594 +tranquility 0.594 +marry 0.594 +grant 0.594 +openly 0.594 +council 0.594 +vigilant 0.594 +vigilance 0.594 +nurse 0.594 +praised 0.594 +generosity 0.594 +eminence 0.594 +enlighten 0.594 +generous 0.594 +commendation 0.594 +strengthen 0.594 +substantiate 0.594 +gratitude 0.594 +ministry 0.594 +admiral 0.594 +spouse 0.594 +regent 0.594 +sweetheart 0.589 +angelic 0.586 +educational 0.586 +joyful 0.586 +husbandry 0.586 +enjoying 0.586 +helper 0.586 +convince 0.586 +attest 0.586 +father 0.586 +share 0.586 +meritorious 0.586 +godly 0.586 +inheritance 0.586 +bylaw 0.586 +seniority 0.586 +prestige 0.586 +serene 0.586 +firmness 0.586 +lovely 0.586 +conservation 0.586 +sobriety 0.586 +collectively 0.586 +testimony 0.586 +rooted 0.586 +delegate 0.586 +mate 0.586 +diplomacy 0.586 +ambition 0.586 +victory 0.586 +revere 0.586 +checklist 0.586 +designation 0.586 +unfailing 0.586 +constitutional 0.586 +magnificent 0.586 +compliance 0.586 +monk 0.586 +acclaim 0.586 +tribe 0.586 +shelter 0.578 +structural 0.578 +coexisting 0.578 +upright 0.578 +legalized 0.578 +watchdog 0.578 +cheerfulness 0.578 +professor 0.578 +impartiality 0.578 +irrefutable 0.578 +judge 0.578 +authoritative 0.578 +dutiful 0.578 +communion 0.578 +adore 0.578 +philanthropist 0.578 +careful 0.578 +revival 0.578 +unquestioned 0.578 +obey 0.578 +commandant 0.578 +smile 0.578 +inviting 0.578 +navigator 0.578 +convinced 0.578 +immaculate 0.570 +plausible 0.570 +insure 0.570 +earned 0.570 +consult 0.570 +guide 0.570 +everlasting 0.570 +corroboration 0.570 +principal 0.570 +matron 0.570 +pilot 0.570 +abundance 0.570 +pedigree 0.570 +advise 0.570 +collaborator 0.570 +heavenly 0.570 +compass 0.570 +adhering 0.570 +measured 0.570 +connective 0.570 +unequivocal 0.570 +determinate 0.570 +ordinance 0.570 +relative 0.570 +punctual 0.570 +counsellor 0.570 +modest 0.570 +cuddle 0.570 +unquestionably 0.570 +complement 0.570 +volunteers 0.570 +apostle 0.570 +apostolic 0.562 +frankness 0.562 +insight 0.562 +earn 0.562 +fort 0.562 +jury 0.562 +spotless 0.562 +strong 0.562 +vitality 0.562 +prize 0.562 +devout 0.562 +admit 0.562 +miracle 0.562 +congregation 0.562 +curable 0.562 +concordance 0.562 +uplift 0.562 +content 0.562 +cohesion 0.562 +applaud 0.562 +ordination 0.562 +compensate 0.562 +remarkable 0.562 +soothing 0.562 +save 0.562 +treasurer 0.562 +jurist 0.562 +lovemaking 0.562 +pertinent 0.562 +vigorous 0.562 +succeeding 0.562 +pleasant 0.562 +reunion 0.555 +reconciliation 0.555 +betrothed 0.555 +exalt 0.555 +buddy 0.555 +veteran 0.555 +illumination 0.555 +midwife 0.555 +physicist 0.555 +restorative 0.555 +coalesce 0.555 +ambulance 0.555 +influential 0.555 +prophet 0.555 +greatness 0.555 +auditor 0.555 +defender 0.555 +worship 0.555 +impartial 0.555 +succeed 0.555 +destined 0.555 +discretion 0.555 +mediate 0.555 +precedence 0.555 +providing 0.555 +cultivate 0.555 +privacy 0.555 +foresight 0.555 +intuition 0.555 +congruence 0.555 +constant 0.555 +patience 0.555 +meditate 0.555 +vote 0.555 +coach 0.555 +inclusion 0.555 +temperate 0.547 +provide 0.547 +securities 0.547 +friendly 0.547 +heritage 0.547 +salvation 0.547 +readiness 0.547 +forgive 0.547 +independence 0.547 +law 0.547 +statement 0.547 +invocation 0.547 +conciliation 0.547 +prevalent 0.547 +eyewitness 0.547 +cheer 0.547 +commanding 0.547 +ancestral 0.547 +impenetrable 0.547 +convent 0.547 +reinforcement 0.547 +promises 0.547 +engaging 0.547 +rejoice 0.547 +liberty 0.547 +prudent 0.547 +durable 0.547 +govern 0.547 +registry 0.547 +proud 0.547 +obedience 0.539 +applause 0.539 +uncensured 0.539 +watchman 0.539 +obvious 0.539 +delightful 0.539 +responsive 0.539 +chronicle 0.539 +forefathers 0.539 +memorable 0.539 +regularity 0.539 +immovable 0.539 +exalted 0.539 +ensemble 0.539 +inimitable 0.539 +proctor 0.539 +aspiring 0.539 +chastity 0.539 +admitting 0.539 +choices 0.539 +perfect 0.539 +stamina 0.539 +antidote 0.539 +recovery 0.539 +instructions 0.539 +reinforcements 0.539 +institute 0.539 +architecture 0.539 +relevant 0.539 +define 0.539 +inoculation 0.539 +eager 0.539 +psalms 0.539 +majority 0.539 +tantamount 0.539 +obliging 0.539 +hospital 0.531 +accompaniment 0.531 +answerable 0.531 +heavens 0.531 +expedient 0.531 +seal 0.531 +fraternal 0.531 +strive 0.531 +omniscient 0.531 +rescue 0.531 +transcript 0.531 +immunization 0.531 +evergreen 0.531 +edification 0.531 +princely 0.531 +refuge 0.531 +inseparable 0.531 +deed 0.531 +sponsor 0.531 +bride 0.531 +retirement 0.531 +ballot 0.531 +center 0.531 +school 0.531 +dependent 0.531 +deliverance 0.531 +cradle 0.531 +analyst 0.531 +verily 0.531 +firstborn 0.531 +terms 0.531 +doubtless 0.531 +bloom 0.531 +candid 0.531 +approbation 0.527 +commonwealth 0.523 +coronation 0.523 +neighbor 0.523 +graduation 0.523 +award 0.523 +adoration 0.523 +ourselves 0.523 +liberate 0.523 +benedictory 0.523 +account 0.523 +celebration 0.523 +honeymoon 0.523 +laureate 0.523 +chaplain 0.523 +powerful 0.523 +dictionary 0.523 +countenance 0.523 +hug 0.523 +connoisseur 0.523 +captivate 0.523 +unbroken 0.523 +taught 0.523 +elevation 0.523 +notable 0.523 +ratify 0.523 +salutary 0.523 +correctness 0.523 +unimpeached 0.523 +improvement 0.523 +winning 0.523 +paragon 0.523 +nobility 0.523 +feeling 0.518 +management 0.516 +confession 0.516 +advent 0.516 +predominant 0.516 +committee 0.516 +remedy 0.516 +nobleman 0.516 +obstetrician 0.516 +measure 0.516 +enchanted 0.516 +amen 0.516 +deserve 0.516 +tender 0.516 +passwords 0.516 +inform 0.516 +organization 0.516 +fully 0.516 +credit 0.516 +reverie 0.516 +association 0.516 +compliment 0.516 +formative 0.516 +freely 0.516 +perpetuity 0.516 +minded 0.516 +sentinel 0.516 +pray 0.516 +framework 0.516 +tribunal 0.516 +volunteer 0.509 +custodian 0.508 +philosopher 0.508 +constable 0.508 +amour 0.508 +patronage 0.508 +diversity 0.508 +priest 0.508 +venerable 0.508 +policy 0.508 +confessional 0.508 +unsurpassed 0.508 +courtship 0.508 +enable 0.508 +virgin 0.508 +savor 0.508 +sovereign 0.508 +tolerance 0.508 +instruct 0.508 +medical 0.508 +shepherd 0.508 +intact 0.508 +accolade 0.508 +vouch 0.508 +automatic 0.508 +housewife 0.508 +reward 0.508 +forgiving 0.508 +beautification 0.508 +admissible 0.508 +lieutenant 0.508 +synchronize 0.500 +guard 0.500 +warden 0.500 +timing 0.500 +pontiff 0.500 +related 0.500 +superman 0.500 +info 0.500 +undying 0.500 +watchful 0.500 +backer 0.500 +personal 0.500 +nerds 0.500 +doctrine 0.500 +indelible 0.500 +infinity 0.500 +romantic 0.500 +birth 0.500 +majesty 0.500 +darling 0.500 +religions 0.500 +guru 0.500 +instruction 0.500 +treasure 0.500 +gateway 0.500 +retain 0.500 +alive 0.500 +pious 0.500 +badge 0.500 +optimist 0.500 +infallibility 0.500 +vindication 0.500 +apologetic 0.500 +grow 0.492 +hosannah 0.492 +hardy 0.492 +radiance 0.492 +spokesman 0.492 +chairman 0.492 +inevitable 0.492 +elegance 0.492 +musical 0.492 +jubilant 0.492 +salute 0.492 +church 0.492 +harbor 0.492 +proverbs 0.492 +aspire 0.492 +laudatory 0.492 +formality 0.492 +constitute 0.492 +attraction 0.492 +psalm 0.492 +improve 0.492 +contributor 0.492 +umpire 0.492 +fellow 0.492 +judgement 0.492 +sheriff 0.492 +synonymous 0.492 +grandchildren 0.492 +privy 0.492 +popularity 0.492 +endow 0.492 +moderator 0.492 +efforts 0.492 +path 0.484 +referee 0.484 +countryman 0.484 +income 0.484 +depth 0.484 +found 0.484 +armor 0.484 +voucher 0.484 +crowning 0.484 +approbate 0.484 +diagnosis 0.484 +confess 0.484 +hire 0.484 +laudation 0.484 +clean 0.484 +favorite 0.484 +assembly 0.484 +colonel 0.484 +romance 0.484 +affection 0.484 +forecast 0.484 +enjoy 0.484 +arbiter 0.484 +concord 0.484 +like 0.484 +police 0.484 +ranger 0.484 +sweet 0.484 +sterling 0.477 +apologize 0.477 +expect 0.477 +preponderance 0.477 +lover 0.477 +votive 0.477 +sermon 0.477 +purely 0.477 +mathematical 0.477 +frank 0.477 +parliament 0.477 +signature 0.477 +episcopal 0.477 +follow 0.477 +counted 0.477 +lamb 0.477 +policeman 0.477 +consul 0.477 +sacrifice 0.477 +landmark 0.477 +veracity 0.477 +word 0.477 +glory 0.477 +calculator 0.477 +putative 0.477 +nursery 0.477 +pastor 0.477 +matter 0.477 +intended 0.469 +flagship 0.469 +dove 0.469 +cashier 0.469 +uncritical 0.469 +judicious 0.469 +tribune 0.469 +top 0.469 +vicar 0.469 +capacity 0.469 +author 0.469 +marshal 0.469 +passion 0.469 +religion 0.469 +instructor 0.469 +eagerness 0.469 +associate 0.469 +commission 0.469 +recruits 0.469 +mighty 0.469 +effective 0.469 +immerse 0.469 +judgment 0.469 +underwrite 0.469 +regal 0.469 +prefer 0.469 +bridesmaid 0.469 +tutelage 0.469 +gain 0.469 +title 0.469 +fortress 0.461 +oblige 0.461 +theological 0.461 +trade 0.461 +kitten 0.461 +cautious 0.461 +admitted 0.461 +consecration 0.461 +aunt 0.461 +eventually 0.461 +necessarily 0.461 +moorings 0.461 +manage 0.461 +custody 0.461 +attendant 0.461 +bank 0.461 +contains 0.461 +magnetic 0.461 +patriarchal 0.461 +commerce 0.461 +socially 0.461 +priesthood 0.461 +crucial 0.461 +courier 0.461 +lesson 0.461 +medal 0.461 +partake 0.461 +enroll 0.461 +lifestyle 0.461 +cathedral 0.455 +puppy 0.453 +exchange 0.453 +president 0.453 +eagle 0.453 +present 0.453 +dawn 0.453 +deputy 0.453 +encomium 0.453 +chart 0.453 +oasis 0.453 +foresee 0.453 +commonplace 0.453 +level 0.453 +chairwoman 0.453 +strategist 0.453 +synergistic 0.453 +governor 0.453 +insulation 0.453 +laud 0.453 +excited 0.453 +finally 0.453 +journeyman 0.453 +perceive 0.453 +indemnity 0.445 +crew 0.445 +chemist 0.445 +sir 0.445 +asserting 0.445 +statistical 0.445 +remains 0.445 +orthodoxy 0.445 +enliven 0.445 +orchestra 0.445 +chocolate 0.445 +tradesmen 0.445 +operation 0.445 +director 0.445 +negotiate 0.445 +impart 0.445 +theorem 0.445 +chancellor 0.445 +dictum 0.445 +usual 0.445 +exaltation 0.445 +magnify 0.445 +lord 0.445 +employ 0.445 +lodging 0.445 +formula 0.445 +bridegroom 0.445 +sensual 0.445 +handbook 0.445 +matters 0.445 +imagination 0.438 +sun 0.438 +cabinet 0.438 +merci 0.438 +elite 0.438 +inauguration 0.438 +villager 0.438 +exhaustive 0.438 +conveyancing 0.438 +economy 0.438 +emphasize 0.438 +governess 0.438 +comptroller 0.438 +elect 0.438 +conformity 0.438 +abbot 0.438 +mlk 0.438 +oracle 0.438 +encore 0.438 +butler 0.438 +tandem 0.438 +arbitrator 0.438 +fate 0.438 +atone 0.438 +digit 0.438 +lesbians 0.430 +simplify 0.430 +base 0.430 +invite 0.430 +compact 0.430 +deacon 0.430 +jeremiah 0.430 +bridal 0.430 +rule 0.430 +neutrality 0.430 +circle 0.430 +errand 0.430 +resources 0.430 +hail 0.430 +wealth 0.430 +persuade 0.430 +pay 0.430 +bequest 0.430 +grammar 0.430 +repay 0.430 +sentry 0.430 +occupant 0.430 +estimable 0.430 +playful 0.430 +grit 0.430 +blanket 0.430 +utopian 0.430 +cop 0.430 +differential 0.430 +elucidate 0.430 +lender 0.430 +disclosed 0.430 +toughness 0.430 +impressionable 0.430 +count 0.430 +supplication 0.422 +sing 0.422 +continue 0.422 +probity 0.422 +assignee 0.422 +primer 0.422 +apprentice 0.422 +axiom 0.422 +easiest 0.422 +forum 0.422 +dominion 0.422 +dealings 0.422 +accountant 0.422 +trading 0.422 +parish 0.422 +antiseptic 0.422 +travel 0.422 +truss 0.422 +respite 0.422 +wonderstruck 0.422 +eulogize 0.422 +treat 0.422 +fixed 0.422 +diary 0.422 +intend 0.422 +reconsideration 0.422 +supremacy 0.422 +perennial 0.422 +shopkeeper 0.422 +enablement 0.422 +theocratic 0.422 +hymn 0.422 +maintenance 0.422 +cogent 0.414 +transaction 0.414 +deference 0.414 +akin 0.414 +athlete 0.414 +choir 0.414 +labor 0.414 +incline 0.414 +privilege 0.414 +amortization 0.414 +kudos 0.414 +routine 0.414 +commodore 0.414 +synod 0.414 +salary 0.414 +cash 0.414 +gate 0.414 +preservative 0.414 +trainer 0.414 +gazette 0.414 +leap 0.414 +reporter 0.414 +offering 0.414 +conglomerate 0.414 +fellas 0.414 +rapt 0.414 +consort 0.414 +serve 0.414 +specialize 0.414 +trophy 0.406 +system 0.406 +sanction 0.406 +legislator 0.406 +executor 0.406 +linguist 0.406 +tree 0.406 +leisure 0.406 +extol 0.406 +nation 0.406 +fitting 0.406 +patrol 0.406 +dermatologist 0.406 +luxury 0.406 +abacus 0.406 +radar 0.406 +relancer 0.406 +reimbursement 0.406 +judged 0.406 +glorify 0.406 +budget 0.406 +clan 0.398 +intense 0.398 +electorate 0.398 +popular 0.398 +explain 0.398 +parietal 0.398 +merchandise 0.398 +journalism 0.398 +nest 0.398 +eulogy 0.398 +pursue 0.398 +depository 0.398 +paths 0.398 +iron 0.398 +ground 0.398 +quaint 0.398 +barter 0.398 +fain 0.398 +yearning 0.398 +favs 0.398 +deluxe 0.398 +clearance 0.398 +climax 0.398 +glow 0.398 +gentry 0.398 +neutral 0.398 +chandler 0.391 +follower 0.391 +regardless 0.391 +intercession 0.391 +usher 0.391 +horse 0.391 +recline 0.391 +surrogate 0.391 +deal 0.391 +downright 0.391 +escort 0.391 +baggage 0.391 +stages 0.391 +paean 0.391 +collins 0.391 +eulogistic 0.391 +homie 0.391 +translation 0.391 +star 0.391 +gay 0.391 +armory 0.391 +cube 0.391 +accounts 0.391 +messenger 0.391 +grin 0.391 +culinary 0.383 +fortune 0.383 +encomiastic 0.383 +faculty 0.383 +series 0.383 +plaudit 0.383 +leaning 0.383 +edited 0.383 +bounty 0.383 +reparation 0.383 +larger 0.383 +someday 0.383 +bartender 0.383 +label 0.383 +crisp 0.383 +possess 0.383 +curfew 0.383 +lean 0.383 +gage 0.383 +confederate 0.375 +sex 0.375 +cover 0.375 +bouquet 0.375 +desires 0.375 +differences 0.375 +berminat 0.375 +clapping 0.375 +assessor 0.375 +adjust 0.375 +jual 0.375 +picnic 0.375 +personalities 0.375 +general 0.375 +superstar 0.367 +microscope 0.367 +dogma 0.367 +bursary 0.367 +senate 0.367 +knickers 0.367 +magnet 0.367 +pretty 0.367 +disclaim 0.367 +periodicity 0.367 +throne 0.367 +marine 0.367 +collateral 0.367 +bargain 0.367 +marrow 0.367 +homosexual 0.367 +manual 0.367 +cosmopolitan 0.367 +dolphin 0.367 +garrison 0.367 +bailiff 0.367 +swell 0.367 +nestle 0.367 +bristol 0.367 +money 0.359 +lettered 0.359 +vulnerable 0.359 +maxim 0.359 +dance 0.359 +roadster 0.359 +green 0.359 +footing 0.359 +stark 0.359 +promo 0.359 +calls 0.359 +mortgagee 0.359 +eulogium 0.359 +fender 0.359 +privileged 0.359 +boomerang 0.359 +fade 0.359 +circumstances 0.359 +phalanx 0.359 +aga 0.359 +fuse 0.352 +banker 0.352 +font 0.352 +attorney 0.352 +rave 0.352 +pocketbac 0.352 +crescendo 0.352 +poll 0.352 +seals 0.352 +laser 0.352 +aneka 0.352 +tactics 0.352 +administrative 0.352 +suggest 0.352 +show 0.352 +axiomatic 0.352 +playground 0.344 +clap 0.344 +bounce 0.344 +lace 0.344 +weigh 0.344 +white 0.344 +monde 0.344 +dealt 0.344 +holder 0.344 +petit 0.344 +endless 0.344 +purr 0.344 +dame 0.344 +shoutout 0.344 +proviso 0.344 +servant 0.344 +entertainment 0.344 +food 0.336 +repute 0.336 +carol 0.336 +cement 0.336 +county 0.336 +hairchalk 0.336 +estimation 0.336 +shoulder 0.336 +legislature 0.336 +lens 0.336 +opera 0.336 +canons 0.328 +struggles 0.328 +wear 0.328 +gauging 0.328 +karunia 0.328 +corporation 0.328 +zeal 0.328 +youll 0.328 +execution 0.328 +theory 0.328 +swear 0.328 +trans 0.320 +sist 0.320 +sur 0.320 +unofficial 0.320 +sib 0.320 +cap 0.320 +interior 0.320 +rod 0.320 +aksesoris 0.320 +proxy 0.320 +handgel 0.320 +girder 0.320 +heyday 0.320 +clerical 0.320 +pulsa 0.320 +darkest 0.320 +behel 0.320 +disposed 0.320 +fill 0.320 +pavement 0.320 +respon 0.320 +gubernatorial 0.312 +bruh 0.312 +spa 0.312 +reseller 0.312 +tema 0.312 +smith 0.312 +veal 0.312 +prophylactic 0.312 +pill 0.312 +holla 0.312 +romans 0.312 +mau 0.312 +imperfections 0.312 +spaniel 0.312 +presumption 0.305 +sundial 0.305 +harga 0.305 +hermit 0.305 +actress 0.305 +pake 0.305 +warn 0.305 +aquapix 0.305 +dha 0.305 +secret 0.305 +thermometer 0.305 +exception 0.305 +ori 0.297 +divan 0.297 +tiket 0.297 +shopping 0.297 +talaga 0.297 +resistance 0.297 +congressman 0.297 +hemat 0.297 +pin 0.297 +kita 0.297 +wigan 0.297 +ganna 0.297 +indonesia 0.297 +hairclip 0.297 +tickle 0.297 +flatter 0.297 +pith 0.297 +levee 0.297 +pivot 0.297 +carl 0.297 +mandarin 0.297 +zest 0.289 +chicane 0.289 +challenges 0.289 +insolvent 0.289 +owing 0.289 +shorty 0.289 +ribet 0.289 +gon 0.289 +machine 0.289 +weight 0.289 +calf 0.289 +contagiously 0.289 +terbang 0.281 +gullible 0.281 +denying 0.281 +mule 0.281 +fisheye 0.281 +tentang 0.281 +regrets 0.281 +surrender 0.281 +flirt 0.281 +florence 0.281 +fiesta 0.281 +don 0.273 +rejection 0.273 +celebrity 0.273 +unik 0.273 +bisa 0.273 +conquer 0.273 +jellylens 0.273 +ejaculation 0.273 +congress 0.273 +autism 0.273 +chubby 0.273 +sappy 0.273 +indent 0.273 +nigga 0.273 +sepatu 0.266 +khan 0.266 +jodie 0.266 +weakness 0.266 +fashion 0.266 +truck 0.266 +bbw 0.266 +antifungal 0.266 +acrobat 0.258 +minat 0.258 +utk 0.258 +stephanie 0.258 +crumpled 0.258 +hai 0.258 +dare 0.258 +wadsworth 0.258 +puff 0.258 +urs 0.258 +defeated 0.258 +zealous 0.258 +ella 0.250 +secrecy 0.250 +sadness 0.250 +rota 0.250 +fabrication 0.250 +bureaucracy 0.250 +obstacle 0.242 +ting 0.242 +denial 0.242 +juga 0.242 +aku 0.242 +merchant 0.242 +flange 0.242 +dgn 0.234 +wot 0.234 +ada 0.234 +tas 0.234 +pesawat 0.234 +burden 0.234 +naman 0.234 +murah 0.234 +bitterness 0.234 +xxx 0.234 +gusset 0.234 +criticism 0.234 +secrets 0.234 +mag 0.234 +alb 0.234 +flaws 0.227 +faults 0.227 +sceptical 0.227 +devastating 0.227 +shyt 0.227 +beliebers 0.227 +thrift 0.227 +reject 0.227 +peepul 0.219 +libel 0.219 +chuckle 0.219 +erotic 0.219 +envy 0.219 +pawn 0.211 +battles 0.211 +idc 0.211 +undone 0.211 +sneaking 0.211 +koo 0.211 +garansi 0.211 +censor 0.211 +denied 0.211 +moat 0.203 +hopeless 0.203 +untuk 0.203 +coax 0.203 +doubt 0.203 +whstupp 0.203 +disappointments 0.203 +deceiving 0.203 +dubious 0.195 +erased 0.195 +pry 0.195 +yuk 0.188 +jealousy 0.188 +wack 0.188 +ehh 0.188 +mislead 0.180 +insecurities 0.180 +deny 0.180 +weaknesses 0.180 +addict 0.172 +doubts 0.172 +unreliable 0.172 +unaccountable 0.172 +shatter 0.172 +falsehood 0.164 +thang 0.156 +bieber 0.148 +fugitive 0.141 +divorce 0.133 +bait 0.133 +mistakes 0.133 +scoundrel 0.117 diff --git a/app-gui/src/main/resources/install.ico b/app-gui/src/main/resources/install.ico new file mode 100644 index 0000000..e3aa583 Binary files /dev/null and b/app-gui/src/main/resources/install.ico differ diff --git a/app-gui/src/main/resources/logo.png b/app-gui/src/main/resources/logo.png new file mode 100644 index 0000000..9fb3f5e Binary files /dev/null and b/app-gui/src/main/resources/logo.png differ diff --git a/app-gui/src/main/resources/nlp-models/en-ner-location.bin b/app-gui/src/main/resources/nlp-models/en-ner-location.bin new file mode 100644 index 0000000..f3788bc Binary files /dev/null and b/app-gui/src/main/resources/nlp-models/en-ner-location.bin differ diff --git a/app-gui/src/main/resources/nlp-models/en-ner-person.bin b/app-gui/src/main/resources/nlp-models/en-ner-person.bin new file mode 100644 index 0000000..2f68318 Binary files /dev/null and b/app-gui/src/main/resources/nlp-models/en-ner-person.bin differ diff --git a/app-gui/src/main/resources/splash.bmp b/app-gui/src/main/resources/splash.bmp new file mode 100644 index 0000000..9bf2d25 Binary files /dev/null and b/app-gui/src/main/resources/splash.bmp differ diff --git a/app-gui/src/main/resources/storyinspector.css b/app-gui/src/main/resources/storyinspector.css new file mode 100644 index 0000000..7f56cbb --- /dev/null +++ b/app-gui/src/main/resources/storyinspector.css @@ -0,0 +1,50 @@ +.buttonCharacter { + -fx-background-color: #0d6efd; + -fx-border-color: #0d6efd; +} + +.buttonCharacter .label{ + -fx-text-fill: white; +} + +.buttonCharacter:focused { + -fx-background-color: darkgray; +} + +.buttonCharacter:focused .label { + -fx-text-fill: blue; +} + +.buttonLocation { + -fx-background-color: #0dcaf0; + -fx-border-color: #0dcaf0; +} + +.buttonLocation .label{ + -fx-text-fill: white; +} + +.buttonLocation:focused { + -fx-background-color: darkgray; +} + +.buttonLocation:focused .label { + -fx-text-fill: #0dcaf0; +} + +.bordered-titled-title { + -fx-background-color: white; + -fx-translate-y: -16; +} + +.bordered-titled-border { + -fx-content-display: top; + -fx-border-insets: 20 15 15 15; + -fx-background-color: white; + -fx-border-color: black; + -fx-border-width: 2; +} + +.bordered-titled-content { + -fx-padding: 26 10 10 10; +} \ No newline at end of file diff --git a/app-gui/src/main/resources/storyinspectori18n_en_US.properties b/app-gui/src/main/resources/storyinspectori18n_en_US.properties new file mode 100644 index 0000000..aa42f14 --- /dev/null +++ b/app-gui/src/main/resources/storyinspectori18n_en_US.properties @@ -0,0 +1,37 @@ +# number format +numberInteger = ###,###,### +numberPercent = #,##0.00 '%' + +# main page +storyInspectorTitle = Story Inspector +bookMenu = _Book +bookMenuAdd = _Import +bookMenuQuit = _Quit +bookTreeMyLibrary = My Library +bookBy = by + +# add book wizard +addBookWizTitle = Import new book +addBookWizDisclaimer = First, let's make sure your book is prepared for importing: \n \n\ + - You have a Word (or .txt) file containing all the chapters in the book. \n\ + - All chapter names start with the word Chapter (case insensitive) and end with punctuation (period, question, or exclamation mark).\n\ + - Any sentence before a chapter ends with punctuation (period, question, or exclamation mark). \n \n +addBookWizDisclaimerCheck = Yes, my book is ready for importing +bookPropsTitle = Title (*): +bookPropsAuthor = Author (*): +bookPropsFile = File (*): +bookPropsFileBtn = _Select File +bookStructChapterArea = Processing... +bookStructIntro = The book %s by %s has %d chapter(s): +bookStructChapterEntry = %d - %s (%d words) +bookStructCheck = Yes, the book chapters are correct. +bookStructEnd = If the chapters don't seem correct, please go back to the previous steps, verify and re-upload the file. +bookQueuedIntro = Story Inspector has queued the book %s by %s for processing. \n\ + This may take up to a few hours and requires Story Inspector to remain open. \n \n\ + Click 'Finish' in order to close this wizard. +bookProcessing = Processing... +bookTaskMessage = %d%% complete (%d min. left) + +# Reports +reportTaskTabTitle = Tasks + diff --git a/book-importer/pom.xml b/book-importer/pom.xml index f2208e4..cdf8fa7 100644 --- a/book-importer/pom.xml +++ b/book-importer/pom.xml @@ -44,16 +44,21 @@ 5.0.0 + + + + + + + + + + + org.docx4j - docx4j - 3.3.5 - - - org.slf4j - slf4j-log4j12 - - + docx4j-JAXB-Internal + 8.0.0 javax.xml.bind diff --git a/book-importer/src/main/java/com/o3/storyinspector/bookimporter/breakdown/ChapterTokenizer.java b/book-importer/src/main/java/com/o3/storyinspector/bookimporter/breakdown/ChapterTokenizer.java index 7e7568e..6312b40 100644 --- a/book-importer/src/main/java/com/o3/storyinspector/bookimporter/breakdown/ChapterTokenizer.java +++ b/book-importer/src/main/java/com/o3/storyinspector/bookimporter/breakdown/ChapterTokenizer.java @@ -5,15 +5,28 @@ import edu.stanford.nlp.ling.HasWord; import edu.stanford.nlp.ling.SentenceUtils; import edu.stanford.nlp.process.DocumentPreprocessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.Reader; import java.util.ArrayList; import java.util.List; public class ChapterTokenizer { + private static final Logger LOGGER = LoggerFactory.getLogger(ChapterTokenizer.class); + public static List tokenizeFromFile(final String inputFilePath) { - return tokenize(new DocumentPreprocessor(inputFilePath)); + LOGGER.info("Preparing to tokenize file: " + inputFilePath); + try { + return tokenizeFromReader(new FileReader(inputFilePath)); + } catch (FileNotFoundException fileNotFoundException) { + LOGGER.error(fileNotFoundException.getMessage()); + fileNotFoundException.printStackTrace(); + return null; + } } public static List tokenizeFromReader(final Reader inputBookReader) { diff --git a/book-importer/src/main/java/com/o3/storyinspector/bookimporter/plaintext/PlainTextImporter.java b/book-importer/src/main/java/com/o3/storyinspector/bookimporter/plaintext/PlainTextImporter.java index bf396ac..64ec3f2 100644 --- a/book-importer/src/main/java/com/o3/storyinspector/bookimporter/plaintext/PlainTextImporter.java +++ b/book-importer/src/main/java/com/o3/storyinspector/bookimporter/plaintext/PlainTextImporter.java @@ -3,6 +3,7 @@ import com.o3.storyinspector.bookimporter.breakdown.ChapterTokenizer; import com.o3.storyinspector.storydom.Book; +import java.io.FileNotFoundException; import java.io.Reader; public class PlainTextImporter { diff --git a/pom.xml b/pom.xml index 09d6a2f..e196c0d 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ book-importer viz-tool api + app-gui