You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opennlp.apache.org by jz...@apache.org on 2022/11/23 14:32:54 UTC
[opennlp] branch master updated: OPENNLP-1320: Makes lemmatize of MorfologikLemmatizer thread-safe (v2) (#436)
This is an automated email from the ASF dual-hosted git repository.
jzemerick pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/opennlp.git
The following commit(s) were added to refs/heads/master by this push:
new 6212a940 OPENNLP-1320: Makes lemmatize of MorfologikLemmatizer thread-safe (v2) (#436)
6212a940 is described below
commit 6212a940350b4f579d9d040591dac43293cb0b73
Author: Richard Zowalla <13...@users.noreply.github.com>
AuthorDate: Wed Nov 23 15:32:49 2022 +0100
OPENNLP-1320: Makes lemmatize of MorfologikLemmatizer thread-safe (v2) (#436)
* OPENNLP-1320: Makes lemmatize of MorfologikLemmatizer thread-safe
Co-authored-by: Lucas Avanço <av...@stilingue.com.br>
---
.../lemmatizer/MorfologikLemmatizer.java | 10 ++++-----
.../builder/POSDictionayBuilderTest.java | 26 +++++++++++++++-------
2 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/opennlp-morfologik-addon/src/main/java/opennlp/morfologik/lemmatizer/MorfologikLemmatizer.java b/opennlp-morfologik-addon/src/main/java/opennlp/morfologik/lemmatizer/MorfologikLemmatizer.java
index 22f42821..f9597a9c 100644
--- a/opennlp-morfologik-addon/src/main/java/opennlp/morfologik/lemmatizer/MorfologikLemmatizer.java
+++ b/opennlp-morfologik-addon/src/main/java/opennlp/morfologik/lemmatizer/MorfologikLemmatizer.java
@@ -28,27 +28,25 @@ import java.util.Set;
import morfologik.stemming.Dictionary;
import morfologik.stemming.DictionaryLookup;
-import morfologik.stemming.IStemmer;
import morfologik.stemming.WordData;
import opennlp.tools.lemmatizer.Lemmatizer;
public class MorfologikLemmatizer implements Lemmatizer {
- private IStemmer dictLookup;
+ private final Dictionary dictionary;
public MorfologikLemmatizer(Path dictionaryPath) throws IllegalArgumentException,
IOException {
this(Dictionary.read(dictionaryPath));
}
- public MorfologikLemmatizer(Dictionary dictionary) throws IllegalArgumentException,
- IOException {
- dictLookup = new DictionaryLookup(dictionary);
+ public MorfologikLemmatizer(Dictionary dictionary) throws IllegalArgumentException {
+ this.dictionary = dictionary;
}
private List<String> lemmatize(String word, String postag) {
- List<WordData> dictMap = dictLookup.lookup(word.toLowerCase());
+ List<WordData> dictMap = new DictionaryLookup(dictionary).lookup(word.toLowerCase());
Set<String> lemmas = new HashSet<>();
for (WordData wordData : dictMap) {
if (Objects.equals(postag, asString(wordData.getTag()))) {
diff --git a/opennlp-morfologik-addon/src/test/java/opennlp/morfologik/builder/POSDictionayBuilderTest.java b/opennlp-morfologik-addon/src/test/java/opennlp/morfologik/builder/POSDictionayBuilderTest.java
index 39bc2cb3..46b6da24 100644
--- a/opennlp-morfologik-addon/src/test/java/opennlp/morfologik/builder/POSDictionayBuilderTest.java
+++ b/opennlp-morfologik-addon/src/test/java/opennlp/morfologik/builder/POSDictionayBuilderTest.java
@@ -22,7 +22,9 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
-import java.util.Arrays;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
import morfologik.stemming.DictionaryMetadata;
@@ -50,16 +52,15 @@ public class POSDictionayBuilderTest {
return builder.build(tabFilePath);
}
- public static void main(String[] args) throws Exception {
-
+ @Test
+ public void testMultithread() throws Exception {
// Part 1: compile a FSA lemma dictionary
// we need the tabular dictionary. It is mandatory to have info
// file with same name, but .info extension
- Path textLemmaDictionary = Paths.get(
- "/Users/wcolen/git/opennlp/opennlp-morfologik-addon/src/test/resources/dictionaryWithLemma.txt");
// this will build a binary dictionary located in compiledLemmaDictionary
- Path compiledLemmaDictionary = new MorfologikDictionayBuilder().build(textLemmaDictionary);
+ Path compiledLemmaDictionary = new MorfologikDictionayBuilder().build(
+ Paths.get(POSDictionayBuilderTest.class.getResource("/dictionaryWithLemma.txt").getPath()));
// Part 2: load a MorfologikLemmatizer and use it
MorfologikLemmatizer lemmatizer = new MorfologikLemmatizer(compiledLemmaDictionary);
@@ -67,8 +68,17 @@ public class POSDictionayBuilderTest {
String[] toks = {"casa", "casa"};
String[] tags = {"NOUN", "V"};
- String[] lemmas = lemmatizer.lemmatize(toks, tags);
- System.out.println(Arrays.toString(lemmas)); // outputs [casa, casar]
+ Runnable runnable = () -> {
+ String[] lemmas = lemmatizer.lemmatize(toks, tags);
+ Assertions.assertEquals("casa", lemmas[0]);
+ Assertions.assertEquals("casar", lemmas[1]);
+ };
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ for (int i = 0; i < 1000; i++) {
+ executorService.execute(runnable);
+ }
+ executorService.shutdown();
+ executorService.awaitTermination(1, TimeUnit.SECONDS);
}
@Test