Java Stanford NLP: проверка орфографии - PullRequest
4 голосов
/ 05 декабря 2009

Я пытаюсь проверить правильность написания текстовых образцов, используя Stanford 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

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

Ответы [ 2 ]

9 голосов
/ 22 декабря 2009

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

0 голосов
/ 06 декабря 2009

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

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

...