Исправление написания нескольких слов

Исправить орфографические ошибки в одном слове (как несловесные, так и настоящие) очень просто:

P(w|c) P(c)

Где w - неправильно написанное слово, а c - это кандидат, которого мы пытаемся сопоставить, так что кандидат представляет собой токен из одного слова.

Но в Google, когда вы вводите что-то вроде spelligncheck, он исправляет слово на два разных слова. Теперь P(w|c) здесь легко, если я использую расстояние Левенштейна. Но это означает, что у меня больше не может быть кандидатов на одно слово (точнее, на один токен). Так что это увеличит размер моего словаря в геометрической прогрессии.

Более того, когда я ввожу app le, Google исправляет это на _7 _...

Итак, как лучше всего исправить орфографию нескольких слов, учитывая словарь, состоящий из одного токена?


person Anshu Dwibhashi    schedule 14.11.2013    source источник
comment
Этот вопрос кажется не по теме, потому что он касается информатики.   -  person bmargulies    schedule 14.11.2013
comment
так где мне это спросить?   -  person Anshu Dwibhashi    schedule 14.11.2013
comment
Я не понимаю, почему об этом нельзя здесь спросить. Прямо сейчас существует 1361 вопрос о SO, явно помеченный как computer-science, многие из которых имеют похожий алгоритм.   -  person Chthonic Project    schedule 14.11.2013
comment
Кроме того, @AnshumanDwibhashi: чтобы ответить на ваш вопрос, думайте в терминах моделей языка символов, а не моделей языка слов. То, что в последнем случае выглядит как два слова (слово LM), представляет собой просто последовательность символов с дополнительным пробелом в символе LM. Итак, вместо того, чтобы думать в терминах P (w | c), думайте в терминах P (c_1 c_2 ... c_k | c).   -  person Chthonic Project    schedule 14.11.2013
comment
@ChthonicProject хорошо, теперь я понимаю. Так что, если я думаю о языковых моделях символов, я могу выполнять проверку орфографии в нескольких словах. Как добиться многословной семантики (сходства слов)?   -  person Anshu Dwibhashi    schedule 14.11.2013
comment
Семантика намного сложнее. Сходство нескольких слов по сути сводится к умению справиться с перефразированием ... это безумно сложная проблема. Есть несколько хороших исследовательских работ (просто поищите перефразирование в антологии ACL), но помимо этих статей вы будет на неизведанной территории!   -  person Chthonic Project    schedule 14.11.2013


Ответы (1)


Я думаю, вы ищете что-то вроде модуля pspell.

Я подготовил эту демонстрацию, чтобы показать вам, как почти достичь того, чего вы хотите - очевидно, что ее можно улучшить намного больше:

<?php

class SpellChecker
{
    public function __construct($lang)
    {
        $this->pspell = pspell_new($lang);
    }

    public function check($word)
    {
        return pspell_check($this->pspell, $word);
    }

    public function closest_suggestion($word)
    {
        $suggestions = pspell_suggest($this->pspell, $word);
        $similar_sounding_words = array_filter($suggestions,
            function ($current_word) use ($word) {
                return (metaphone($current_word) == metaphone($word));
            });

        // No similar sounding words, just return the first suggestion...
        if (count($similar_sounding_words) == 0) {
            return $suggestions[0];
        }

        // Return the closest match against similar sounding words...
        return array_reduce($similar_sounding_words,
            function ($prev, $next) use ($word) {
                return (is_array($prev))
                    ? $next
                    : ((levenshtein($prev, $word) < levenshtein($next, $word))
                          ? $prev
                          : $next);
            });
    }
}

$spellchecker = new SpellChecker('en');

foreach (array('spelligncheck', 'app le') as $word) {
    if (!$spellchecker->check($word)) {
        print "Closest match for \"$word\": {$spellchecker->closest_suggestion($word)}\n";
    }
}

Попробовал здесь и получил такой результат:

Closest match for "spelligncheck": spellchecker
Closest match for "app le": apple

Удачи! :)

person Paulo Freitas    schedule 14.11.2013
comment
лучше бы на питоне .. но все равно. для этого нужен мой собственный корпус (надеюсь) или собственный корпус PHP? - person Anshu Dwibhashi; 14.11.2013
comment
список слов ... и @PauloFreitas не соответствует всем моим критериям. проверка орфографии должна быть проверкой орфографии. - person Anshu Dwibhashi; 14.11.2013
comment
@AnshumanDwibhashi Он использует общесистемный словарь pspell по умолчанию и позволяет комбинировать его со своим собственным словарем с помощью функции pspell_config_personal() . Вы даже можете добавлять слова в свой личный словарь во время выполнения, используя pspell_add_to_personal(), и позволять вам в дальнейшем сохранять их в своем настраиваемый словарь с pspell_save_wordlist(). :) - person Paulo Freitas; 14.11.2013