PHP восстанавливает плохой текст - PullRequest
12 голосов
/ 15 декабря 2011

Это то, над чем я работаю, и я хотел бы получить информацию от умных людей из StackOverflow.

Я пытаюсь восстановить функцию, основанную на комбинировании разных плохих версий одной и той же текстовой страницы. По сути, это можно использовать для объединения разных результатов распознавания в один с большей точностью, чем любой из них в отдельности.

Я начинаю со словаря из 600 000 английских слов, это почти все, включая юридические и медицинские термины и общие названия. У меня это уже есть.

Тогда у меня есть 4 варианта образца текста.

Примерно так:

$text[0] = 'Fir5t text sample is thisline';
$text[1] = 'Fir5t text Smplee is this line.';
$text[2] = 'First te*t sample i this l1ne.';
$text[3] = 'F i r st text s ample is this line.';

Я пытался объединить вышеприведенное, чтобы получить вывод, который выглядит следующим образом:

$text = 'First text sample is this line.';

Не говорите мне, что это невозможно, потому что это, конечно, нет, просто очень сложно.

Я был бы очень признателен за любые идеи по этому поводу.

Спасибо!

Мои нынешние мысли:

Просто проверка слов по словарю не сработает, поскольку некоторые пробелы находятся в неправильном месте, а иногда слово не будет в словаре.

Основная проблема заключается в восстановлении нарушенных интервалов, после того, как это исправлено, тогда можно выбрать наиболее часто встречающееся словарное слово, если оно существует, или же наиболее часто встречающееся не словарное слово.

Ответы [ 5 ]

8 голосов
/ 18 декабря 2011

Вы пытались использовать самый длинный алгоритм общей подпоследовательности? Они обычно видны в инструментах сравнения текста «diff», используемых в приложениях контроля версий и некоторых текстовых редакторах. Алгоритм сравнения помогает идентифицировать измененные и неизмененные символы в двух образцах текста. http://en.wikipedia.org/wiki/Diff

Несколько лет назад я работал над приложением OCR, похожим на ваше. Вместо того, чтобы применять несколько механизмов распознавания к одному изображению, я использовал один механизм распознавания для анализа нескольких версий одного и того же изображения. Каждое из обработанных изображений было результатом применения различной техники шумоподавления к исходному изображению: одна техника работала лучше для низкого контраста, другая техника работала лучше, когда символы были плохо сформированы. Схема «голосования», в которой сравнивались результаты распознавания текста на каждом изображении, улучшила скорость чтения для произвольных строк текста, таких как «BQCM10032». Другие схемы голосования описаны в научной литературе для OCR.

В некоторых случаях вам может потребоваться подобрать слово, для которого ни одна комбинация результатов распознавания не даст всех букв. Например, средняя буква может отсутствовать, как в «wrd» или «c tch» (вероятно, «word» и «catch»). В этом случае он может помочь получить доступ к вашему словарю с помощью любого из трех ключей: начальных букв, средних букв и конечных букв (или буквенных комбинаций). Каждый ключ связан со списком слов, отсортированных по частоте встречаемости в языке. (Я использовал этот вид многоключевого поиска, чтобы улучшить скорость приложения генерации кроссвордов; вполне возможно, что есть и лучшие методы, но этот легко реализовать.)

Чтобы сэкономить память, вы можете применить многоключевой метод только к первым нескольким тысячам общих слов в языке, а затем использовать только один метод поиска для менее распространенных слов.

Есть несколько онлайн-списков частоты слов. http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists

Если вы хотите получить фантазию, вы также можете рассчитывать на предыдущую частоту встречаемости в тексте. Например, если «Byrd» появляется несколько раз, то это может быть лучшим выбором, если механизм (ы) OCR сообщает о «птице» или «барде» с низким показателем достоверности. Вы можете загрузить медицинский словарь в память только в том случае, если на той же странице имеется статистически маловероятное появление медицинских терминов - в противном случае пропустите медицинские термины из своего рабочего словаря или, по крайней мере, назначьте им разумную вероятность. «Протезирование» - обычное слово; «простатит» реже.

Если у вас есть опыт работы с методами обработки изображений, такими как шумоподавление и морфологические операции, вы также можете попробовать предварительно обработать изображение перед его передачей в механизм (ы) OCR. Обработка изображений может также применяться для выбора областей после того, как ваше программное обеспечение идентифицирует слова или регионы, в которых механизм распознавания текста работает плохо.

Некоторые замены букв / букв и букв / цифр встречаются часто. Цифру 0 (ноль) можно спутать с буквой O, C для O, 8 для B, E для F, P для R и так далее. Если слово найдено с низкой степенью достоверности или если есть два общих слова, которые могут соответствовать не полностью прочитанному слову, то могут помочь специальные правила соответствия формы. Например, «bcth» может соответствовать либо «both», либо «bath», но для многих шрифтов (и контекстов) «both» является более вероятным совпадением, поскольку «o» больше похож на «c» по форме. В длинной цепочке слов, таких как параграф из романа или статьи в журнале, «ванна» лучше подходит, чем «b8th».

Наконец, вы, вероятно, могли бы написать плагин или скрипт для передачи результатов в механизм проверки орфографии, который проверяет соответствие существительных и других грамматических проверок. Это может поймать несколько дополнительных ошибок. Возможно, вы могли бы попробовать VBA для Word или любую другую комбинацию скриптов / приложений, популярную в наши дни.

1 голос
/ 15 декабря 2011

Если вам нужно получить правильную строку только путем сравнения других. Тогда что-то подобное может помочь.

Он еще не закончен, но уже дает некоторые результаты.

$text[0] = 'Fir5t text sample is thisline';
$text[1] = 'Fir5t text Smplee is this line.';
$text[2] = 'First te*t sample i this l1ne.';
$text[3] = 'F i r st text s ample is this line.';

function getRight($arr){
    $_final='';
    $count=count($arr);

    // Remove multi spaces AND get string lengths
    for($i=0;$i<$count;$i++){
        $arr[$i]=preg_replace('/\s\s+/', ' ',$arr[$i]);
        $len[$i]=strlen($arr[$i]);
    }

    // Max length
    $_max=max($len);

    for($i=0;$i<$_max;$i++){
        $_el=array();
        for($j=0;$j<$count;$j++){
            // Cheking letter counts
            $_letter=$arr[$j][$i];
            if(isset($_el[$_letter]))$_el[$_letter]++;
            else$_el[$_letter]=1;
        }
        //Most probably count
        list($mostProbably) = array_keys($_el, max($_el));

        $_final.=$mostProbably;

        // If probbaly example is not space
        if($_el!=' '){
            // THERE NEED TO BE CODE FOR REMOVING SPACE FROM LINES WHERE $text[$i] is space
        }
    }

    return $_final;
}


echo getRight($text);
1 голос
/ 15 декабря 2011

Это действительно довольно сложная проблема.

Когда я задаюсь вопросом, как пишется слово, прямой способ - открыть словарь.Но что, если это маленькое сложное предложение, которое я пытаюсь правильно написать?Один из моих личных приемов, который работает большую часть времени, - это позвонить в Google.Я помещаю свое предложение между цитатами в Google и подсчитываю результаты.Вот пример: ввод "очень умный" в Google дает 13'600k страницы.Ввод "ты очень умный" дает 20 000 страниц.Тогда, скорее всего, правильное написание - «ты очень умный».И ... это действительно так;)

Основываясь на этой концепции, я думаю, у вас есть образцы, которые, по большей части, правильно написаны с ошибками (ну, может быть, нет, если вы разрабатываете для игрового сайта для подростков).).Можете ли вы попытаться разделить сэмплы на части, не подходя к словам и сопоставляя их по частоте?Наиболее частая часть, скорее всего, правильно написана.До этого вы уже можете выполнить проверку орфографии в словаре с вашими 600'000 терминами, чтобы увеличить вероятность того, что небольшие орфографические ошибки уже будут исправлены.Это должно увеличить частоту правильных частей.

Делить предложения на части и находить правильный «размер по частям» также сложно.

Что меня тоже немного беспокоит: как выизвлечь образцы и сопоставить их вместе, чтобы знать, что правильно написанное предложение одинаково (или очень близко?).Ваш вопрос, кажется, предполагает, что у вас есть это, что также кажется мне чем-то очень сложным.

Что же, предшествующее - это просто общий совет, основанный на моем личном и человеческом опыте.Донно, если это может помочь.Это, очевидно, не реальный ответ и не должен быть один.

1 голос
/ 15 декабря 2011

Вы можете попробовать использовать Google N-грамм для достижения этой цели.

1 голос
/ 15 декабря 2011

Самостоятельное решение таких сложных алгоритмов, вероятно, займет больше времени и будет более подвержено ошибкам, чем использование стороннего инструмента - если вам действительно не нужно программировать это самостоятельно, вы можете проверить API правописания Yahoo .Я полагаю, что они разрешают 5000 запросов на IP в день.

Другие могут предлагать нечто подобное (я думаю, что есть и API-интерфейс bing).

ОБНОВЛЕНИЕ: Извините,Я только что прочитал, что они остановили эту службу в апреле 2011 года. Они утверждают, что предлагают аналогичную службу под названием «Таблица предложений по орфографии» сейчас.

...