From 8e74615a1ed3251e70eb8dccb99133ce5c509a7e Mon Sep 17 00:00:00 2001 From: deiflaender Date: Thu, 27 Oct 2022 12:08:25 +0200 Subject: [PATCH] RSS-123: Improved sorting algorithm for TextPositionSequences --- .../redaction/model/SearchableText.java | 4 +- .../utils/TextPositionSequenceComparator.java | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/TextPositionSequenceComparator.java diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/SearchableText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/SearchableText.java index 8ed10a20..ee3d80a1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/SearchableText.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/SearchableText.java @@ -6,6 +6,7 @@ import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSeque import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; import com.iqser.red.service.redaction.v1.server.redaction.utils.SeparatorUtils; import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; +import com.iqser.red.service.redaction.v1.server.redaction.utils.TextPositionSequenceComparator; import java.util.ArrayList; import java.util.Collections; @@ -217,8 +218,7 @@ public class SearchableText { public String getAsStringWithLinebreaksSorted(List sequences) { var sorted = sequences.stream() - .sorted(Comparator.comparing(a -> a.getTextPositions().get(0).getXDirAdj())) - .sorted(Comparator.comparing(a -> a.getTextPositions().get(0).getYDirAdj())) + .sorted(new TextPositionSequenceComparator()) .sorted(Comparator.comparing(a -> a.getPage())) .collect(Collectors.toList()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/TextPositionSequenceComparator.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/TextPositionSequenceComparator.java new file mode 100644 index 00000000..1502863e --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/TextPositionSequenceComparator.java @@ -0,0 +1,40 @@ +package com.iqser.red.service.redaction.v1.server.redaction.utils; + +import java.util.Comparator; + +import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSequence; + +public class TextPositionSequenceComparator implements Comparator { + + @Override + public int compare(TextPositionSequence pos1, TextPositionSequence pos2) { + // only compare text that is in the same direction + int cmp1 = Float.compare(pos1.getDir().getDegrees(), pos2.getDir().getDegrees()); + if (cmp1 != 0) { + return cmp1; + } + + // get the text direction adjusted coordinates + float x1 = pos1.getMinXDirAdj(); + float x2 = pos2.getMinXDirAdj(); + + float pos1YBottom = pos1.getMaxYDirAdj(); + float pos2YBottom = pos2.getMaxYDirAdj(); + + // note that the coordinates have been adjusted so 0,0 is in upper left + float pos1YTop = pos1YBottom - pos1.getHeight(); + float pos2YTop = pos2YBottom - pos2.getHeight(); + + float yDifference = Math.abs(pos1YBottom - pos2YBottom); + + // we will do a simple tolerance comparison + if (yDifference < .1 || pos2YBottom >= pos1YTop && pos2YBottom <= pos1YBottom || pos1YBottom >= pos2YTop && pos1YBottom <= pos2YBottom) { + return Float.compare(x1, x2); + } else if (pos1YBottom < pos2YBottom) { + return -1; + } else { + return 1; + } + } + +} \ No newline at end of file