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