Проверка орфографии Питера Норвига на совпадения из нескольких слов

Знаменитая проверка орфографии Питера Норвига (версия для Java 8 здесь) способна исправить отдельные слова, если в обучающих данных появляется что-то близкое к этому слову. Но как я могу адаптировать его для обработки целых фраз. Например, если у меня есть файл, в котором каждая фраза разделена новой строкой:

Plastic box
Pencils and sketch
Romeo and Juliet
.
.
.

Если я скажу алгоритм, чтобы исправить 'Platic'должно вернуться 'Plastic box', Точно так же, если я скажу это исправить 'Pencils'должно вернуться 'Pencils and sketch',

Я попытался изменить следующие строки приведенного выше кода (версия Java):

Stream.of(new String(Files.readAllBytes( dictionaryFile )).toLowerCase().replaceAll("[^a-z ]","").split(" ")).forEach( (word) ->{
            dict.compute( word, (k,v) -> v == null ? 1 : v + 1  );
        });

в

 Stream.of(new String(Files.readAllBytes( dictionaryFile )).toLowerCase().split("\n")).forEach( (word) ->{
            dict.compute( word, (k,v) -> v == null ? 1 : v + 1  );
        });

но это не сработало.

1 ответ

Если вы внимательно пройти через Norvig's spellchecker, вы найдете это как error model он использует слова в edit distance 1 и 2 от неправильно написанного слова. Итак, если вы хотите исправить Platic используя файл big.text как словарь, он может найти слово Elastic который находится на расстоянии 2 редактирования в качестве правильного слова кандидата.

Теперь, с вашим измененным кодом, фраза Plastic box даже в пределах 2 править расстояние от слова Platic и он даже не будет рассматриваться в качестве кандидата в модели ошибок, поэтому он не работает.

Например, расстояние редактирования между ними равно 5, а затем вам нужно реализовать функции edit3, edit4 а также edit5 чтобы заставить его работать, который должен учитывать миллионы слов и будет довольно неэффективным.

Вместо этого я думаю, что вы можете рассмотреть bigramlanguage model и, несмотря на возврат единственно возможного слова-кандидата для слова с ошибкой, вы можете вернуть наиболее вероятное bigram phraseв зависимости от probability of occurrence в словаре, с language model П(Plastic box) = Р (Plastic)*П(box|Plastic) и вероятность кандидатской фразы a P (Plastic box) * P (Пластик | Пластиковая коробка)withбайесformula, if you have anОшибка модели` на месте (или у вас есть данные, чтобы узнать ее).

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