Проверка орфографии для базового слова - PullRequest
0 голосов
/ 05 июля 2019

Попытка проверить правильность написания слов или ошибок с помощью WordNet. Вот реализация SpellChecker.java, которую я сделал до сих пор ...

package com.domain.wordnet;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;

import net.didion.jwnl.JWNL;
import net.didion.jwnl.JWNLException;
import net.didion.jwnl.data.IndexWord;
import net.didion.jwnl.data.IndexWordSet;
import net.didion.jwnl.data.Synset;
import net.didion.jwnl.dictionary.Dictionary;

public class SpellChecker {

    private static Dictionary dictionary = null;
    private static final String PROPS = "/opt/jwnl/jwnl14-rc2/config/file_properties.xml";

    static {
        try(InputStream is = new FileInputStream(PROPS)) {
            JWNL.initialize(is);
            dictionary = Dictionary.getInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println(isCorrect("change"));    //  true
        System.out.println(isCorrect("changes"));   //  false
        System.out.println(isCorrect("changed"));   //  true
        System.out.println(isCorrect("changing"));  //  true
        System.out.println();
        System.out.println(isCorrect("analyze"));   //  true
        System.out.println(isCorrect("analyzed"));  //  true
        System.out.println(isCorrect("analyzing")); //  false
    }

    public static boolean isCorrect(String token) {
        try {
            token = token.trim().toLowerCase();
            IndexWordSet set = dictionary.lookupAllIndexWords(token);
            if(set == null)
                return false;

            @SuppressWarnings("unchecked")
            Collection<IndexWord> collection = set.getIndexWordCollection();
            if(collection == null || collection.isEmpty())
                return false;

            for(IndexWord word : collection) {
                Synset[] senses = word.getSenses();
                if(senses != null && senses.length > 0
                        && senses[0].toString().toLowerCase().contains(token)) {
                    return true;
                }
            }

            return false;
        } catch (JWNLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

В большинстве случаев это вполне нормально, но вы можете увидеть, что потерпели неудачу с множественным числом и некоторыми ing формами. Можно ли как-нибудь избежать форм множественное число и ing , не портя правил английского языка?

Если вы видите, в браузере WordNet, changes является допустимым словом, но в API Java это недопустимо.

enter image description here

Не знаю, где мне нужно исправить! Или любой другой хороший подход для преодоления этой проблемы?

1 Ответ

1 голос
/ 05 июля 2019

Ошибка, которую вы делаете здесь, в этом цикле

for(IndexWord word : collection) {
                Synset[] senses = word.getSenses();
                if(senses != null && senses.length > 0
                        && senses[0].toString().toLowerCase().contains(token)) {
                    return true;
                }
            }

Строка Synset[] senses = word.getSenses() возвращает все значения слова, но вы проверяете только первое (0-индекс). Слово будет доступно в одном из смыслов. Как то так

for (IndexWord word : collection) {

            Synset[] senses = word.getSenses();
            for(Synset sense:senses){
                if(sense.getGloss().toLowerCase().contains(token)){return true;}
            }

        }

Кроме того, формы слов ing могут быть недоступны в качестве значений. Я не уверен, почему вы хотите искать чувства, чтобы решить, является ли оно правильным словом.

код типа if(set.getLemma() != null) return true;

должно быть достаточно, чтобы решить проверку орфографии, верно?

...