Commit 04c48204 authored by pudi9346's avatar pudi9346

Changed Prject Structure - main() is in startGUI.java

parent e3560dfb
Pipeline #2863 skipped
......@@ -26,7 +26,14 @@
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
<accessrules>
<accessrule kind="accessible" pattern="javafx/**"/>
</accessrules>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<accessrules>
<accessrule kind="accessible" pattern="javafx/**"/>
</accessrules>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
_hibernate_classalpha_idtext primary_key
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
log4j.rootLogger=WARN,A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n
\ No newline at end of file
package org.uebung7.gui;
public class Test {
}
package uebung7.fin.medReader;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.CacheMode;
import org.hibernate.Session;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.query.dsl.QueryBuilder;
/**
*
* All database-related action goes in here, i.e. initalization & search on sqllite
*
* @author Julia
*
*
*/
public class App {
public class DBSearch {
/*
* Verhältnis von Score 1 zu Score 2 muss mindestens 1,5 betragen. Ein
......@@ -23,20 +30,42 @@ public class App {
*/
private static final float RATIO = 1.5f;
/**
* Indizierung
*
* @throws InterruptedException
* Constructor takes diagnoses seperated by /n
* Executes search for each Diagnosis
* @param diagnosen
*/
private static void doIndex() throws InterruptedException {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
fullTextSession.disconnect();
fullTextSession.close();
public DBSearch(ArrayList<String> diagnosen){
/** DBG create Index only
Instant start = Instant.now();
try {
doIndex();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Instant end = Instant.now();
System.out.println("\n >>>>>>> DBG: DBSearch.java Time to create Index: " + Duration.between(start, end));
**/
/** DBG: Perfrom search for each diag**/
for(String searchString: diagnosen){
try {
searchDiag(searchString);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Info: Die Suchergebnisse der Lucene-Textsuche sind soriert nach Score -
* der beste Treffer steht ganz oben.
......@@ -57,6 +86,7 @@ public class App {
return false;
}
/**
*
......@@ -69,6 +99,7 @@ public class App {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
// Lucene Query erstellen - Suche in "text" (Diagnose-Namen) und
// "primary_key" (ICD10-Codes)
......@@ -161,16 +192,16 @@ public class App {
}
public static void main(String[] args) throws InterruptedException {
private void searchDiag(String searchStr) throws InterruptedException {
//String[] searchDiag
// Indizierung
//doIndex();
// doIndex();
// Such-String
String searchValue = "";
String searchValue = searchStr;
// searchValue = "ozufgefcdfdfbnf"; // kein Ergebnis
// searchValue = "Dysthymia"; // nur ein Ergebnis
searchValue = "Sozialerea Phobie"; // mehrere Ergebnisse - 1. eindeutig
//searchValue = "Mückenstich"; // mehrere Ergebnisse - 1. eindeutig
// searchValue = "Gemini"; // mehrere Ergebnisse -kein Ergebnis
// eindeutig
......@@ -184,22 +215,58 @@ public class App {
// searchValue = "Arterieller Hypertonus";
// searchValue = "Postpunktionelle Beschwerdesymptomatik";
// searchValue = "F40.1";
// DBG: Measure Query execution Time
Instant start = Instant.now();
// Suchen
List<AlphaID> searchResult = search(searchValue);
// Suchergebnis analysieren hinsichtlich eindeutiger Ergebnisse
List<AlphaID> searchResult = search(searchValue);
Instant end = Instant.now();
List<AlphaID> diagnosen = reduceResultIfUnique(searchResult);
// Suchergebnis analysieren hinsichtlich eindeutiger Ergebnisse
// Ausgabe der Ergebnisse
System.out.println(
"\n >>>>>>> Es wurden " + diagnosen.size() + " Einträge gefunden für '" + searchValue + "' <<<<<<< \n");
"\n >>>>>>> DBG: DBSearch.java Time: " + Duration.between(start, end)+" Es wurden " + diagnosen.size() + " Einträge gefunden für '" + searchValue + "' <<<<<<< \n");
for (AlphaID diagnose : diagnosen) {
System.out.println(diagnose.getAlpha_id() + " - " + diagnose.getPrimary_key() + " - " + diagnose.getText());
}
System.exit(0);
// System.exit(0);
}
// ToDo: Returns List? of all diagnoseses found to Frontent
public String getDiagnosisList(){
return "testReturn";
}
/**
* Indizierung
*
* @throws InterruptedException
*/
private static void doIndex() throws InterruptedException {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession
.createIndexer( AlphaID.class )
.batchSizeToLoadObjects( 25 )
.cacheMode( CacheMode.NORMAL )
.threadsToLoadObjects( 5 )
.threadsForSubsequentFetching( 20 )
.startAndWait();
fullTextSession.disconnect();
fullTextSession.close();
}
}
......@@ -16,136 +16,82 @@ import edu.stanford.nlp.classify.Classifier;
import edu.stanford.nlp.classify.ColumnDataClassifier;
import edu.stanford.nlp.ling.Datum;
public class MedReportReader {
// Pfad zu Diagnosen, Trainig und Property File
final static String diag = "diag.txt";
final static String prop = "icd10.prop";
final static String train = "icd10.train";
// Create new DataClassifier (use Propertyfile as defined in prop)
public static ColumnDataClassifier cdc = new ColumnDataClassifier(prop);
// Train Classifier with ICD10 Codes
public static Classifier<String, String> cla;
public class MedReportSplitter {
public static final String REGEXP_DIAGNOSE = "Diagnose\\({0,1}[n]{0,1}\\){0,1}";
// Map zur Speicherung der Strukturwörter (Diagnose, Anamnese,...) als
// KEY, Speicherung der zugeörigen Absätze als VALUE
private LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
private LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();;
// ArrayList mit allen Diagnosen
private ArrayList<Diagnose> diagnosen = new ArrayList<Diagnose>();
public static void main(String[] args) throws IOException {
// Trainieren des ICD-Code-Classifieres
cla = cdc.makeClassifier(cdc.readTrainingExamples(train));
private ArrayList<String> diagnosen = new ArrayList<String>();
// Lese beide Arztbriefe
for (int i = 1; i <= 2; i++) {
String path = "Arztbrief" + i + ".txt";
new MedReportReader(path);
}
}
public MedReportReader(String PATH) throws IOException {
public MedReportSplitter(String PATH) throws IOException {
// Arztbrief in String einlesen
String arztBriefAsString = new String(Files.readAllBytes(Paths.get(PATH)));
// Arztbrief einlesen, Struktur (Absatzname und Absatztext) in map
// speichern und Diagnosen in ArrayList speichern
readMedLetter(arztBriefAsString, map, diagnosen);
readMedLetter(arztBriefAsString);
// Ausgabe der Diagnosen
System.out.println("Diagnosen aus " + PATH + ": \n");
printJSON(diagnosen);
System.out.println("");
// Ausgabe der Brief-Struktur
// DEBUG Ausgabe der Diagnosen
System.out.println("DBG: MedReportSplit.java - Diagnosen aus " + PATH );
for(String diag: diagnosen){
System.out.println(diag);
}
/* DEBUG
//Ausgabe der Brief-Struktur
System.out.println("Struktur aus " + PATH + ":");
printStructure(map);
*/
}
/*
* Holt ICD-Code und Score der Übereinstimmung anhand einer
* Diagnose-Bezeichnung
*/
public static Diagnose getICDCode(int id, String diagnose) {
double score;
String icd10;
String[] inputArray = { "1", diagnose };
// Test given IPT against Classifier
Datum<String, String> d = cdc.makeDatumFromStrings(inputArray);
score = cla.scoresOf(d).getCount(cla.classOf(d));
icd10 = cla.classOf(d);
return new Diagnose(id, diagnose, icd10, score);
}
/*
* Ausgabe aus JSON
*/
public static void printJSON(ArrayList<Diagnose> diagnosen) {
Gson gson = new GsonBuilder().create();
for (int i = 0; i < diagnosen.size(); i++) {
String json = gson.toJson(diagnosen.get(i));
System.out.println(json);
}
}
/*
* Ausgabe der Brief-Struktur
*/
public static void printStructure(Map<String, String> map) {
System.out.println("--------------------------------------------");
for (String key : map.keySet()) {
System.out.println("ABSATZ: " + key);
System.out.println("--------------------------------------------");
System.out.println("TEXT: " + map.get(key));
System.out.println("--------------------------------------------");
private void readMedLetter(String arztBriefAsStr) {
String arztBriefAsString = null;
try {
arztBriefAsString = new String(Files.readAllBytes(Paths.get("Arztbrief1.txt")));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void readMedLetter(String arztBriefAsString, LinkedHashMap<String, String> map,
ArrayList<Diagnose> diagnosen) {
// Identifizieren der Strukturwörter (Diagnose, Anamnese,...) der
// Briefe. Annahme ist, dass diese eindeutig durch Wörter mit
// anschließendem Doppelpunkt erkannt werden können.
Pattern pattern1 = Pattern.compile("\n\n+.*[:]");
// Gesamten Arzt-Brief-String zerteilen an den Strukturwörtern;
// Strukturwort bleibt im Teilstring.
String[] splittedLetter = arztBriefAsString.split("(?=\n\n+.*[:])");
// Durchlaufen der gesplitteten Strings (z.B. "Diagnose: Text") und
// Trennung am Doppelpunkt ergibt jeweils Strukturwort und Text des
// Absatzes. Diese werden als KEY und VALUE in einer Map gespeichert
for (String retval : splittedLetter) {
Matcher m1 = pattern1.matcher(retval);
String keyValString[] = retval.split(":", 2);
while (m1.find()) {
map.put(keyValString[0].replace("\n\n", ""), keyValString[1]);
}
}
// Pattern für die Erkennung des Diagnose-Absatzes
Pattern patternDIAG = Pattern.compile(REGEXP_DIAGNOSE);
String[] tempDiag = null;
// Durchlaufen der Map und Suche nach Diagnose. Realisiserung mit
// Pattern, da unterschiedliche Schreibweisen vorhanden
for (String key : map.keySet()) {
Matcher mDIAG = patternDIAG.matcher(key);
// Wenn KEY für Absatz "Diagnose" gefunden wird der zugehörige Text
// mit den einzelnen Diagnosen aus dem zugehörigen VALUE der Map
// gelesen und zeilenweise in ein Array geschrieben
......@@ -154,23 +100,56 @@ public class MedReportReader {
tempDiag = value.split("\n");
}
}
// Array tempDiag enthält neben den Diagnosen auch leere Einträge, diese
// werden hier entfernt und alle Diagnosen in eine ArrayList
// geschrieben. Mit der Funktion getICDCode() wird der ICD-Code anhand
// des Diagnose-Namens ermittelt
int id = 1;
for (String diag : tempDiag) {
diag = diag.replace("\r", "");
if (diag.length() > 0) {
Diagnose d = getICDCode(id, diag.trim());
diagnosen.add(d);
id++;
diagnosen.add(diag.trim());
}
}
}
/* DEBUG
* Ausgabe aus JSON
public static void printJSON(ArrayList<Diagnose> diagnosen) {
Gson gson = new GsonBuilder().create();
for (int i = 0; i < diagnosen.size(); i++) {
String json = gson.toJson(diagnosen.get(i));
System.out.println(json);
}
}
DEBUG
* Ausgabe der Brief-Struktur
public static void printStructure(Map<String, String> map) {
System.out.println("--------------------------------------------");
for (String key : map.keySet()) {
System.out.println("ABSATZ: " + key);
System.out.println("--------------------------------------------");
System.out.println("TEXT: " + map.get(key));
System.out.println("--------------------------------------------");
}
}
*/
public ArrayList<String> getDiagnosen(){
return diagnosen;
}
}
package uebung7.fin;
import uebung7.fin.medReader.*;
import java.util.Scanner;
import javafx.application.Application;
import java.awt.Desktop;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javafx.scene.input.MouseEvent;
import javafx.scene.Scene;
import javafx.scene.control.*;
/*import javafx.scene.control.Label;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;*/
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.text.Text;
@SuppressWarnings("restriction")
public class startGUI extends Application {
// Für den einfach Zugriff mit statischen globalen Variablen gelöst
static TextField centertextfield = new TextField();
TreeView<String> tree;
static TreeItem<String> root = new TreeItem<String>();
static TreeItem<String> tmp_id = new TreeItem<String>();
static TreeItem<String> tmp_prop = new TreeItem<String>();
private String arztbrief = "";
private Desktop desktop = Desktop.getDesktop();
/** Main method:
* Launch Backend => Create Index
* Launch Frontend
* **/
public static void main(String[] args) {
launch(); // Comment to turn off Frontend
/* BackendDBG:
MedReportSplitter reportSplit = null;
try {
reportSplit = new MedReportSplitter("Arztbrief1.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DBSearch search = new DBSearch(reportSplit.getDiagnosen());
*/
//DEBUG
System.out.println("DBG: startGUI.java: running");
}
@Override
public void start(Stage primaryStage) {
// Root von vornherein ausgeklappt darstellen
root.setExpanded(true);
// Baum erstellen und Wurzel verstecken
tree = new TreeView<>(root);
tree.setShowRoot(false);
// Baum interaktiv gestalten (Blätter können angegklickt werden)
tree.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> {
if (newValue != null)
// Aktion beim Ankicken des jeweiligen Blattes
System.out.println(newValue.getValue()); // Zum Testen Value des
// Blatts ausgeben
});
// Allgemeines
primaryStage.setTitle("Übungsblatt 7+8 - Gruppe 2"); // Titel des
// Windows
BorderPane bp = new BorderPane(); // BorderPane initialisieren
bp.setPadding(new Insets(10, 20, 10, 20));
final FileChooser fileChooser = new FileChooser();
final Button btnBrowse = new Button("Durchsuchen");
final Button btnJSON = new Button("Als JSON exportieren");
final Button btnAnalyze = new Button("Analysieren");
final ComboBox pfadComboBox = new ComboBox();
pfadComboBox.setEditable(true);
pfadComboBox.valueProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue ov, String t, String t1) {
arztbrief = t1;
}
});
btnBrowse.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent e) {
configureFileChooser(fileChooser);
File file = fileChooser.showOpenDialog(primaryStage);
if (file != null) {
pfadComboBox.getItems().addAll(file.getPath());
pfadComboBox.setValue(file.getPath());
}
}
});
btnAnalyze.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent e) {
// Arztbrief ans Backend übergeben, wenn Auswahl getroffen wurde
// String arztbrief = Ausgewählter Pfad
if (arztbrief == "")
{System.out.println("ERROR: startGUI.java - Bitte Datei auswählen!");
}
else {
try {
// create new MedReportSplitter
// DEBUG:
MedReportSplitter reportSplit = new MedReportSplitter("Arztbrief1.txt");
// For FINAL VER
// MedReportSplitter reportSplit = new MedReportSplitter(arztbrief);
DBSearch search = new DBSearch(reportSplit.getDiagnosen());
// Get Diags found from Backend
System.out.println("DBG: startGUI.java Diagnosen Return: " + search.getDiagnosisList());
// ToDO: GUI: Selection of Diag etc...
} catch (IOException e1) {
// Error reading the file:
System.out.println("ERROR: startGUI.java - Datei konnte nicht geöffnet werden!");
}
}
}
});
btnJSON.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
FileChooser fileChooser = new FileChooser();
fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
// Nur .json Dateien als Möglichkeit festlegen
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON-Dateien (*.json)",
"*.json");
fileChooser.getExtensionFilters().add(extFilter);
// Speicherdialog anzeigen
File file = fileChooser.showSaveDialog(primaryStage);
if (file != null) {
// Datei als JSON speichern
SaveFile(file);
}
}
});
// Elemente des TopPanes initialisieren
Insets standardabstand = new Insets(10, 10, 10, 10);
Label toplabel = new Label("Arztbrief auswählen:");
Label emptylabel = new Label("");
// toplabel.setPadding(standardabstand);
btnAnalyze.setAlignment(toplabel.getAlignment());
HBox topbox1 = new HBox(20);
topbox1.setPadding(standardabstand);
HBox topbox2 = new HBox(20);
topbox2.setPadding(standardabstand);
HBox topbox3 = new HBox(20);
topbox2.setPadding(standardabstand);
VBox main_topbox = new VBox(1);
topbox1.getChildren().setAll(toplabel, pfadComboBox, btnBrowse);
topbox2.getChildren().setAll(btnAnalyze);
topbox3.getChildren().setAll(emptylabel);
main_topbox.getChildren().setAll(topbox1, topbox2, topbox3);
bp.setTop(main_topbox);
// Elemente der TreeView (LeftPane) initialisieren
VBox leftbox = new VBox();
Label treelabel = new Label("Gefundene Diagnosen");
leftbox.getChildren().setAll(treelabel, tree);
bp.setLeft(leftbox);
// Elemente für Standardausgabe (CenterPane) in JSON initialisieren
VBox centerbox_main = new VBox();
Label centerlabel = new Label("Weitere Informationen zur Diagnose (wikidata zeugs)");
centertextfield.setPadding(new Insets(10, 10, 10, 10));
centertextfield.setPrefSize(510, 400);
centertextfield.setMaxSize(510, 400);
centertextfield.setEditable(false);