Проверка орфографии для основного слова

Попытка проверить орфографию, правильно ли она написана или написана с ошибкой, используя 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;
        }
    }
}

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

Как вы видите, в браузере WordNet changes является допустимым словом, но в API-интерфейсах Java оно недопустимо.

Проверка орфографии для основного слова

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

isCorrect("analying") возвращение false кажется совершенно правильным, поскольку analying, насколько мне известно, здесь не совсем правильное слово. analyzing будет.
Ben 05.07.2019 08:25

Эй, @Бен, мой плохой! Я исправил свою собственную орфографическую ошибку.. :( Но все же это неверно для анализ

Khan 05.07.2019 08:29

попробовать некоторые библиотеки nlp?

Kris 05.07.2019 08:58

@Kris Определенно, я выберу другие решения NLP, но сначала я хочу выполнить свою работу, используя только WordNet, потому что он уже используется в том же проекте.

Khan 05.07.2019 10:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
196
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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;}
            }

        }

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

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

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

Да, я просто использую реализацию, написанную этим парнем по следующей ссылке.. stackoverflow.com/a/34051675/4306260

Khan 06.07.2019 18:04

Другие вопросы по теме