0

我正在尝试将 JLanguageTool 与 JavaFX 和 RichtextFX 结合使用,以获得一个 GUI,它可以对 a 中的给定输入进行拼写检查Codearea并突出显示拼写错误的单词。我的问题是,即使对于带有少量拼写错误(3 个拼写错误)的小句子(6 个单词),我的程序也需要 10-12 秒才能执行(仅拼写检查部分)。我已经尝试通过停用我不需要的规则来优化我的程序。这是我的代码:

import org.languagetool.JLanguageTool;
import org.languagetool.language.GermanyGerman;
import org.languagetool.rules.Category;
import org.languagetool.rules.CategoryId;
import org.languagetool.rules.RuleMatch;

import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LanguageToolTest {

    private static JLanguageTool tool = new JLanguageTool(new GermanyGerman());

    public static void prepareRule(){
        Map <CategoryId, Category> akku = tool.getCategories();
        for (var entry : akku.entrySet()){
            if (!entry.getKey().toString().contains("EMPFOHLENE_RECHTSCHREIBUNG")
            && !entry.getKey().toString().contains("CASING")
            && !entry.getKey().toString().contains("TYPOS")
            && !entry.getKey().toString().contains("COMPOUNDING")
            && !entry.getKey().toString().contains("PUNCTUATION")
            && !entry.getKey().toString().contains("CONFUSED_WORDS")
            && !entry.getKey().toString().contains("SEMANTICS")){
                tool.disableCategory(entry.getKey());
            }
        }
    }

    public static void main(String[] args) {
        prepareRule();

        Instant start = Instant.now();
        Map<Integer, List<String>> test = new HashMap<>();
        int index = 0;
        try {
            List<RuleMatch> matches = tool.check("Heilike makrele hier ist echter Tecst");
            for (RuleMatch match : matches){
                List<String> temp = new ArrayList<>();
                index = match.getFromPos();
                int end = match.getToPos();
                String idk = "Heilike makrele hier ist echter Tecst".substring(index, end);
                temp.add(idk);
                temp.addAll(match.getSuggestedReplacements());
                test.put(match.getFromPos(), temp);
            }
            Instant stop = Instant.now();
            Duration timeElapsed = Duration.between(start, stop);
            System.out.println(test.toString());
            System.out.println("Hat " + timeElapsed.toMillis() + " Millisekunden gedauert.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

和输出:

{0=[Heilike, Heilige, Heiligen, Heidecke, Heilig, Heinicke, Heiliger, Heiliges, Heiligem, Beilage, Heiligt, Heike, Heiligte, Fällige, Herlocke, Heutige, Wellige, Heftige, Eilige, Häufige, Seidige], 32=[Tecst, Eckt, Deckt, Test, Täks, Deckst, Erst, Teast, Lässt, Des, Meist, Fest, Heißt, Jetzt, Setzt, Weist, Recht, Text, West, Wächst, Geist], 8=[makrele, Makrele, makele, mäkele, sakrale, magere, mangele, Makrelen, Nägele, Häcksel, Häckseln, angele, dackele, fackele, fächele, hagele, häckseln, häkele, lächele, magerere, magerte]}
Hat 12483 Millisekunden gedauert.

解释地图:我Key存储发现的错误的起始索引以供进一步处理,List值存储索引 0 处拼写错误的单词列表,并在以下指标上推荐替换。

在我的实际代码中,地图被返回并针对突出显示部分进行处理。

据我了解 JLanguageTool 的文档,它不是线程安全的,因此我不能对它进行多线程处理。

关于如何改进我的代码/优化某些调用以减少性能影响的任何建议?

4

0 回答 0