From df2fcd2e5e48298131ebf7a00bf2ed80a9fc2d96 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Mon, 9 May 2022 12:14:09 +0300 Subject: [PATCH] RED-3946 - quotation-mark fix --- .../redaction/model/SearchableText.java | 15 +++++---------- .../redaction/utils/EntitySearchUtils.java | 9 ++------- .../redaction/utils/SeparatorUtils.java | 15 +++++++++++++++ .../AnalyseFileRealDataIntegrationTest.java | 18 ++++++++++-------- .../resources/performance/data/test-quote.pdf | Bin 0 -> 35067 bytes 5 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-quote.pdf 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 774b3b6c..3d89445a 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 @@ -3,6 +3,7 @@ package com.iqser.red.service.redaction.v1.server.redaction.model; import com.fasterxml.jackson.annotation.JsonIgnore; import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSequence; 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 java.util.ArrayList; @@ -92,8 +93,8 @@ public class SearchableText { .get(i) .charAt(j, caseInsensitive) == '-') { - if (counter != 0 || i == 0 && j == 0 || j != 0 && isSeparator(searchSpace.get(i) - .charAt(j - 1, caseInsensitive)) || j == 0 && i != 0 && isSeparator(searchSpace.get(i - 1) + if (counter != 0 || i == 0 && j == 0 || j != 0 && SeparatorUtils.isSeparator(searchSpace.get(i) + .charAt(j - 1, caseInsensitive)) || j == 0 && i != 0 && SeparatorUtils.isSeparator(searchSpace.get(i - 1) .charAt(searchSpace.get(i - 1) .length() - 1, caseInsensitive)) || j == 0 && i != 0 && searchSpace.get(i - 1) .charAt(searchSpace.get(i - 1).length() - 1, caseInsensitive) != ' ' && searchSpace.get(i) @@ -109,9 +110,9 @@ public class SearchableText { crossSequenceParts.add(partMatch); if (i == searchSpace.size() - 1 && j == searchSpace.get(i) - .length() - 1 || j != searchSpace.get(i).length() - 1 && isSeparator(searchSpace.get(i) + .length() - 1 || j != searchSpace.get(i).length() - 1 && SeparatorUtils.isSeparator(searchSpace.get(i) .charAt(j + 1, caseInsensitive)) || j == searchSpace.get(i) - .length() - 1 && isSeparator(searchSpace.get(i + 1) + .length() - 1 && SeparatorUtils.isSeparator(searchSpace.get(i + 1) .charAt(0, caseInsensitive)) || j == searchSpace.get(i) .length() - 1 && searchSpace.get(i) .charAt(j, caseInsensitive) != ' ' && searchSpace.get(i + 1) @@ -179,12 +180,6 @@ public class SearchableText { } - private boolean isSeparator(char c) { - - return Character.isWhitespace(c) || Pattern.matches("\\p{Punct}", String.valueOf(c)) || c == '\"' || c == '‘' || c == '’' || c == '”'; - } - - @Override public String toString() { return buildString(sequences); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java index 0fc10144..267bd156 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java @@ -4,7 +4,6 @@ import com.iqser.red.service.redaction.v1.server.redaction.model.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.*; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; -import org.ahocorasick.trie.Trie; import java.util.*; import java.util.regex.Pattern; @@ -47,18 +46,14 @@ public class EntitySearchUtils { private void validateAndAddEntity(Set entities, FindEntityDetails findEntityDetails, String inputString, int startIndex, int stopIndex) { - if (startIndex > -1 && (startIndex == 0 || Character.isWhitespace(inputString.charAt(startIndex - 1)) || isSeparator(inputString.charAt(startIndex - 1))) && (stopIndex == inputString.length() || isSeparator(inputString.charAt(stopIndex)))) { + if ((startIndex == 0 || SeparatorUtils.isSeparator(inputString.charAt(startIndex - 1))) + && (stopIndex == inputString.length() || SeparatorUtils.isSeparator(inputString.charAt(stopIndex)))) { entities.add(new Entity(inputString.substring(startIndex, stopIndex), findEntityDetails.getType(), startIndex, stopIndex, findEntityDetails.getHeadline(), findEntityDetails.getSectionNumber(), findEntityDetails.isDictionaryEntry(), findEntityDetails.isDossierDictionary(), findEntityDetails.getEngine(), findEntityDetails.getEntityType())); } } - private boolean isSeparator(char c) { - - return Character.isWhitespace(c) || Pattern.matches("\\p{Punct}", String.valueOf(c)) || c == '\"' || c == '‘' || c == '’'; - } - public Set clearAndFindPositions(Set entities, SearchableText text, Dictionary dictionary) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java new file mode 100644 index 00000000..5e4766ec --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.redaction.v1.server.redaction.utils; + +import java.util.Set; +import java.util.regex.Pattern; + +public class SeparatorUtils { + + private final static Set quotes = Set.of('\'', '\u0022', '\u00AB', '\u00BB', '\u2018', '\u2019', '\u201A', '\u201C', '\u201D', '\u201E' + , '\u2039', '\u203A'); + + + public static boolean isSeparator(char c) { + return Character.isWhitespace(c) || Pattern.matches("\\p{Punct}", String.valueOf(c)) || quotes.contains(c); + } +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java index 760c1993..42101901 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java @@ -7,7 +7,6 @@ import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; import com.iqser.red.service.redaction.v1.model.MessageType; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.junit.Ignore; import org.junit.Test; import org.springframework.core.io.ClassPathResource; @@ -18,7 +17,7 @@ import java.util.Set; @Slf4j public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest { - + public static final String FILE_NAME = "test-file"; @Test @SneakyThrows @@ -27,12 +26,12 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest ObjectMapper om = new ObjectMapper(); om.registerModule(new JavaTimeModule()); - var file = new ClassPathResource(BASE_DIR + "data/test-file.pdf").getInputStream(); + var file = new ClassPathResource(BASE_DIR + "data/" + FILE_NAME + ".pdf").getInputStream(); redactionStorageService.storeObject("dossierId", "fileId", FileType.ORIGIN, file); try { - var nerData = new ClassPathResource(BASE_DIR + "data/test-file.ner.json").getInputStream(); + var nerData = new ClassPathResource(BASE_DIR + "data/" + FILE_NAME + ".ner.json").getInputStream(); redactionStorageService.storeObject("dossierId", "fileId", FileType.NER_ENTITIES, nerData); } catch (Exception e) { log.warn("No NER File Provided"); @@ -52,8 +51,8 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest try { - var text = new ClassPathResource(BASE_DIR + "data/test-file.text.json").getInputStream(); - var sectionText = new ClassPathResource(BASE_DIR + "data/test-file.section-grid.json").getInputStream(); + var text = new ClassPathResource(BASE_DIR + "data/" + FILE_NAME + ".text.json").getInputStream(); + var sectionText = new ClassPathResource(BASE_DIR + "data/" + FILE_NAME + ".section-grid.json").getInputStream(); redactionStorageService.storeObject("dossierId", "fileId", FileType.TEXT, text); redactionStorageService.storeObject("dossierId", "fileId", FileType.SECTION_GRID, sectionText); } catch (Exception e) { @@ -66,7 +65,7 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest try { - var redactionLog = new ClassPathResource(BASE_DIR + "data/test-file.redaction-log.json").getInputStream(); + var redactionLog = new ClassPathResource(BASE_DIR + "data/" + FILE_NAME + ".redaction-log.json").getInputStream(); } catch (Exception e) { log.info("No redaction log provided, Performing full analysis"); @@ -76,10 +75,13 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest } - simulateIncrement(List.of("type"), "PII", 3L); + simulateIncrement(List.of("Desiree"), "PII", 3L); ar.setMessageType(MessageType.REANALYSE); String in = om.writeValueAsString(ar); redactionMessageReceiver.receiveAnalyzeRequest(in, false); + + + // var log = redactionStorageService.getRedactionLog("dossierId","fileId"); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-quote.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-quote.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2b0fb6e9e377daf5dcbc44f518af022ee10b7528 GIT binary patch literal 35067 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 wg2Dm-5fM=)R)8QIBkSr0P@1Nt^fc4 literal 0 HcmV?d00001