2013-11-14 3 views
4

исправляющие одно слово орфографические ошибки (как без слов & реального слова ошибки) легко:Multiple слово коррекции орфографии

P(w|c) P(c) 

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

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

Кроме того, когда я вхожу app le Google исправляет его apple ...

Так что это лучший способ сделать коррекцию множественного слова орфографической, учитывая один лексему словаря?

+0

Этот вопрос не соответствует теме, потому что речь идет об информатике. – bmargulies

+0

Так где я его спрашиваю? –

+1

Я не понимаю, почему его здесь не спрашивают. В настоящее время существует 1361 вопрос о том, что SO явно помечена «компьютерная наука», многие из которых имеют похожий алгоритмический вкус. –

ответ

0

Я думаю, что вы ищете что-то вроде модуля 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 

Удачи вам! :)

+0

было бы лучше в python .. но в любом случае. для этого требуется мой собственный корпус (надеюсь) или собственный корпус PHP? –

+0

@AnshumanDwibhashi Что вы подразумеваете под * corpus *? –

+0

список слов ... и @PauloFreitas он не решает всех моих критериев. spelligncheck должен быть проверкой орфографии. –

Смежные вопросы