essentialTypes) {
+
+ return cluster.stream()
+ .filter(entity -> essentialTypes.contains(entity.type()))
+ .count();
+ }
+
+
/**
* Calls combine NerEntities with the following settings.
*
@@ -137,6 +197,76 @@ public class NerEntitiesAdapter {
CBI_ADDRESS_TYPES_TO_COMBINE,
MAX_DISTANCE_BETWEEN_PARTS,
MIN_PARTS_TO_COMBINE,
+ MIN_ESSENTIAL_TYPES_COMBINED,
+ ALLOW_DUPLICATES);
+ }
+
+
+ public Stream combineNerEntitiesOfAllGivenTypes(NerEntities entityRecognitionEntities,
+ Set essentialTypes,
+ Set typesToCombine,
+ int minPartsToCombine) {
+
+ return combineNerEntities(entityRecognitionEntities,
+ essentialTypes,
+ typesToCombine,
+ MAX_DISTANCE_BETWEEN_PARTS,
+ minPartsToCombine,
+ MIN_ESSENTIAL_TYPES_COMBINED,
+ ALLOW_DUPLICATES);
+ }
+
+
+ public Stream combineNerEntitiesOfAllGivenTypes(NerEntities entityRecognitionEntities,
+ Set essentialTypes,
+ Set typesToCombine,
+ int maxDistanceBetweenParts,
+ int minPartsToCombine) {
+
+ return combineNerEntities(entityRecognitionEntities,
+ essentialTypes,
+ typesToCombine,
+ maxDistanceBetweenParts,
+ minPartsToCombine,
+ MIN_ESSENTIAL_TYPES_COMBINED,
+ ALLOW_DUPLICATES);
+ }
+
+
+ public Stream combineNerEntitiesOfAllGivenTypes(NerEntities entityRecognitionEntities,
+ Set essentialTypes,
+ Set typesToCombine,
+ int maxDistanceBetweenParts,
+ int minPartsToCombine,
+ int minEssentialTypesCombined) {
+
+ return combineNerEntities(entityRecognitionEntities,
+ essentialTypes,
+ typesToCombine,
+ maxDistanceBetweenParts,
+ minPartsToCombine,
+ minEssentialTypesCombined,
+ ALLOW_DUPLICATES);
+ }
+
+
+ public Stream combineNerEntitiesOfAllGivenTypesWithConfidence(NerEntities entityRecognitionEntities,
+ Set essentialTypes,
+ Set typesToCombine,
+ int maxDistanceBetweenParts,
+ int minPartsToCombine,
+ int minEssentialTypesCombined,
+ Double confidence) {
+
+ return combineNerEntities(new NerEntities(entityRecognitionEntities.getNerEntityList()
+ .stream()
+ .filter(nerEntity -> nerEntity.confidence() == null || nerEntity.confidence() >= confidence)
+ .toList()),
+ essentialTypes,
+ typesToCombine,
+ maxDistanceBetweenParts,
+ minPartsToCombine,
+ minEssentialTypesCombined,
ALLOW_DUPLICATES);
}
diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java
index 93b816f5..e76417f3 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java
+++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java
@@ -153,14 +153,13 @@ public class RedactionStorageService {
}
-
@Timed("redactmanager_getImportedLegalBases")
public ImportedLegalBases getImportedLegalBases(String dossierId, String fileId) {
try {
return storageService.readJSONObject(TenantContext.getTenantId(),
- StorageIdUtils.getStorageId(dossierId, fileId, FileType.IMPORTED_LEGAL_BASES),
- ImportedLegalBases.class);
+ StorageIdUtils.getStorageId(dossierId, fileId, FileType.IMPORTED_LEGAL_BASES),
+ ImportedLegalBases.class);
} catch (StorageObjectDoesNotExist e) {
log.debug("Imported legal bases not available.");
return new ImportedLegalBases();
@@ -295,6 +294,17 @@ public class RedactionStorageService {
}
+ @Timed("redactmanager_getAzureNerEntities")
+ public NerEntitiesModel getAzureNerEntities(String dossierId, String fileId) {
+
+ try {
+ return storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.AZURE_NER_ENTITIES), NerEntitiesModel.class);
+ } catch (StorageObjectDoesNotExist e) {
+ throw new NotFoundException("NER Entities are not available.");
+ }
+ }
+
+
public ComponentLog getComponentLog(String dossierId, String fileId) {
try {
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java
index 2fc5cfd0..4d00e15d 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java
@@ -6,9 +6,11 @@ import static org.wildfly.common.Assert.assertTrue;
import java.awt.Color;
import java.awt.geom.Rectangle2D;
import java.io.File;
+import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -66,15 +68,38 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest {
String filePath = "files/new/crafted document.pdf";
String nerEntitiesFilePath = "ner_entities/crafted document.NER_ENTITIES.json";
Document document = buildGraphNoImages(filePath);
- List entityRecognitionEntities = validateAndCombine(parseNerEntities(nerEntitiesFilePath), document);
+ NerEntities nerEntities = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document);
+ getNerEntitiesForFile(new ClassPathResource(filePath), document, nerEntities);
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void testGetAzureNerEntities() {
+
+ String filePath = "files/new/intertek.ORIGIN.pdf";
+ String nerEntitiesFilePath = "ner_entities/intertek.NER_ENTITIES.json";
+ String azureNerEntitiesFilePath = "ner_entities/intertek.AZURE_NER_ENTITIES.json";
+ Document document = buildGraphNoImages(filePath);
+ NerEntities azureNerEntities = NerEntitiesAdapter.toNerEntities(parseNerEntities(azureNerEntitiesFilePath), document);
+ NerEntities nerEntities = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document);
+ nerEntities.merge(azureNerEntities);
+ getNerEntitiesForFile(new ClassPathResource(filePath), document, nerEntities);
+
+ }
+
+
+ private void getNerEntitiesForFile(ClassPathResource resource, Document document, NerEntities nerEntities) throws IOException {
+
+ List entityRecognitionEntities = validateAndCombine(nerEntities, document);
assertFalse(entityRecognitionEntities.isEmpty());
assertTrue(entityRecognitionEntities.stream()
.allMatch(entity -> entity.textRange().start() < entity.textRange().end()));
- ClassPathResource resource = new ClassPathResource(filePath);
try (PDDocument pdDocument = Loader.loadPDF(resource.getFile())) {
- Stream unchangedAddressParts = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document).getNerEntityList()
+ Stream unchangedAddressParts = nerEntities.getNerEntityList()
.stream()
.filter(e -> !e.type().equals("CBI_author"));
List redactionEntities = Stream.concat(entityRecognitionEntities.stream(), unchangedAddressParts)
@@ -96,7 +121,6 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest {
File outputFile = new File("/tmp/nerEntities.pdf");
pdDocument.save(outputFile);
}
-
}
@@ -150,16 +174,37 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest {
}
- private List validateAndCombine(NerEntitiesModel nerEntitiesModel, Document document) {
-
- NerEntities nerEntities = NerEntitiesAdapter.toNerEntities(nerEntitiesModel, document);
+ private List validateAndCombine(NerEntities nerEntities, Document document) {
List cbiAuthors = nerEntities.streamEntitiesOfType("CBI_author")
.toList();
Stream cbiAddress = NerEntitiesAdapter.combineNerEntitiesToCbiAddressDefaults(nerEntities)
.map(boundary -> new NerEntities.NerEntity(document.getTextBlock().subSequence(boundary).toString(), boundary, "CBI_address"));
+ Stream azureCbiAddress = NerEntitiesAdapter.combineNerEntitiesOfAllGivenTypesWithConfidence(nerEntities,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "Quantity",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .map(boundary -> new NerEntities.NerEntity(document.getTextBlock().subSequence(boundary).toString(), boundary, "CBI_address"));
- return Stream.concat(cbiAuthors.stream(), cbiAddress)
+ return Stream.concat(cbiAuthors.stream(), Stream.concat(cbiAddress, azureCbiAddress))
.toList();
}
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl
index 0ab463d6..68bb9fbb 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl
@@ -1084,6 +1084,84 @@ rule "AI.1.0: Combine and add NER Entities as CBI_address"
end
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl
index 5d9ac5c0..b26c04e7 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl
@@ -1738,6 +1738,84 @@ rule "AI.3.0: Recommend authors from AI as PII"
end
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl
index 1eff5d4a..72276637 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl
@@ -1149,6 +1149,86 @@ rule "DOC.35.0: Doses (mg/kg bodyweight)"
end
+//------------------------------------ AI rules ------------------------------------
+
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/efsa_sanitisation.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/efsa_sanitisation.drl
index 5b5c14d6..22f3dbff 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/efsa_sanitisation.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/efsa_sanitisation.drl
@@ -643,6 +643,84 @@ rule "AI.1.0: Combine and add NER Entities as CBI_address"
end
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl
index b42602ba..02166d95 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl
@@ -69,6 +69,86 @@ query "getFileAttributes"
$fileAttribute: FileAttribute()
end
+//------------------------------------ AI rules ------------------------------------
+
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl
index 6616c138..182faee1 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl
@@ -1173,6 +1173,85 @@ rule "AI.1.0: Combine and add NER Entities as CBI_address"
end
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl
index 0c9b0b67..663b9b6d 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl
@@ -108,6 +108,84 @@ rule "AI.0.0: Add all NER Entities of type CBI_author"
end
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl
index aca5480f..0f75054e 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/table_demo.drl
@@ -219,6 +219,86 @@ rule "TAB.7.0: Indicator (Species)"
end
+//------------------------------------ AI rules ------------------------------------
+
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/test_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/test_rules.drl
index 1c6dcd8f..d00f0fdc 100644
--- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/test_rules.drl
+++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/test_rules.drl
@@ -119,6 +119,86 @@ rule "TAB.6.0: Targeted cell extraction (Experimental Stop date)"
end
+//------------------------------------ AI rules ------------------------------------
+
+// Rule unit: AI.4
+rule "AI.4.0: Add all NER Entities of type Person"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Person"))
+ then
+ nerEntities.streamEntitiesOfType("Person")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_author", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.4.0", "")));
+ end
+
+
+// Rule unit: AI.5
+rule "AI.5.0: Combine and add NER Entities as CBI_address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location") || hasEntitiesOfType("Address")|| hasEntitiesOfType("Organization"))
+ then
+ entityCreationService
+ .combineNerEntitiesWithConfidence(
+ nerEntities,
+ "CBI_address",
+ EntityType.RECOMMENDATION,
+ document,
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "CITY"),
+ Set.of("Organization",
+ "Location",
+ "Address",
+ "ORG",
+ "STREET",
+ "POSTAL",
+ "COUNTRY",
+ "CARDINAL",
+ "CITY",
+ "STATE"),
+ 50,
+ 3,
+ 2,
+ 0.7)
+ .forEach(nerEntity -> nerEntity.skip("AI.5.0", ""));
+ end
+
+
+// Rule unit: AI.6
+rule "AI.6.0: Add all NER Entities of type Location"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Location"))
+ then
+ nerEntities.streamEntitiesOfType("Location")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.6.0", "")));
+ end
+
+
+// Rule unit: AI.7
+rule "AI.7.0: Add all NER Entities of type Address"
+ salience 999
+ when
+ nerEntities: NerEntities(hasEntitiesOfType("Address"))
+ then
+ nerEntities.streamEntitiesOfType("Address")
+ .filter(entity -> entity.value().length() > 3)
+ .filter(entity -> entity.value().length() < 100)
+ .forEach(nerEntity -> entityCreationService.optionalByNerEntityWithConfidence(nerEntity, 0.7, "CBI_address", EntityType.RECOMMENDATION, document)
+ .ifPresent(e -> e.skip("AI.7.0", "")));
+ end
+
+
//------------------------------------ Manual changes rules ------------------------------------
// Rule unit: MAN.0
diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/intertek.ORIGIN.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/intertek.ORIGIN.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..99ccf2c1bec94b7bbecd353546f19380c3e9a916
GIT binary patch
literal 312959
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