Вопрос

Я пытаюсь проверить точность написания образцов текста с помощью Стэнфордского NLP.Это просто показатель текста, а не фильтр или что-то в этом роде, так что если он немного отклонен, все в порядке, пока ошибка равномерна.

Моей первой идеей было проверить, известно ли это слово в лексиконе:

private static LexicalizedParser lp = new LexicalizedParser("englishPCFG.ser.gz");

@Analyze(weight=25, name="Spelling")
    public double spelling() {
        int result = 0;

        for (List<? extends HasWord> list : sentences) {
            for (HasWord w : list) {
                if (! lp.getLexicon().isKnown(w.word())) {
                    System.out.format("misspelled: %s\n", w.word());
                    result++;
                }
            }
        }

        return result / sentences.size();
    }

Однако это приводит к довольно большому количеству ложных срабатываний:

misspelled: Sincerity
misspelled: Sisyphus
misspelled: Sisyphus
misspelled: fidelity
misspelled: negates
misspelled: gods
misspelled: henceforth
misspelled: atom
misspelled: flake
misspelled: Sisyphus
misspelled: Camus
misspelled: foandf
misspelled: foandf
misspelled: babby
misspelled: formd
misspelled: gurl
misspelled: pregnent
misspelled: babby
misspelled: formd
misspelled: gurl
misspelled: pregnent
misspelled: Camus
misspelled: Sincerity
misspelled: Sisyphus
misspelled: Sisyphus
misspelled: fidelity
misspelled: negates
misspelled: gods
misspelled: henceforth
misspelled: atom
misspelled: flake
misspelled: Sisyphus

Есть какие-нибудь идеи о том, как сделать это лучше?

Это было полезно?

Решение

Использование метода isKnown (String) лексикона синтаксического анализатора в качестве средства проверки орфографии не является жизнеспособным вариантом использования синтаксического анализатора.Метод является правильным:"false" означает, что это слово не было замечено (с заданной заглавной буквой) примерно в 1 миллионе слов текста, на основе которого обучается синтаксический анализатор.Но 1 миллиона слов текста просто недостаточно для обучения всесторонней проверке орфографии на основе данных.Люди обычно используют по крайней мере на два порядка больше текста и вполне могут добавить немного ума в обращении с заглавными буквами.Анализатор включает в себя некоторые из этих ухищрений для обработки слов, которые были невидимы в обучающих данных, но это не отражено в том, что возвращает метод isKnown (String).

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

Похоже, что ваш ответ / ошибки разделены между именами собственными, реальными словами (которых, я полагаю, не существует в лексиконе) и истинными орфографическими ошибками.Ложный негатив на "Искренность" также предполагает, что заглавные буквы могут сбивать с толку, хотя вы надеетесь, что это будет достаточно разумно, чтобы не делать этого - в любом случае, стоит проверить.Множественное число тоже не должно быть проблемой, но ложный негатив на "богов"?Правильно ли это отождествляет "бога"?

Поскольку вы пытаетесь проверить орфографию, зачем проверять это косвенно?что lp.getLexicon().isKnown(w.word()) делает внутренне?разве это не зависит от загруженного корпуса?Почему бы просто не загрузить словарь, нормализовать регистр в большой хэш и выполнить проверку "содержит"?Поскольку вы находитесь в контексте НЛП, также должно быть достаточно легко вычеркнуть имена собственные, особенно учитывая, что вы не стремитесь к 100% точности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top