Подтвердить что ты не робот

PHP Восстановление плохого текста

Это то, над чем я работаю, и я хотел бы получить информацию от умных людей здесь, в 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.';

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

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

Спасибо!

Мои текущие мысли:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

ОБНОВЛЕНИЕ: Извините, я просто прочитал, что они прекратили эту услугу в апреле 2011 года. Они утверждают, что теперь предлагают аналогичную услугу под названием "Spelling Suggestion YQL table".

Ответ 3

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

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

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

Разделение предложений на куски и поиск правильного "кусочка" также сложны.

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

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

Ответ 4

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

Ответ 5

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

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

$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);