Извлечение данных из полуформализованного текста
От: MikhailVi  
Дата: 25.12.09 14:02
Оценка:
Коллеги, приветствую.

Начинаю автоматизировать кое-что в гос структуре.
Среди прочего, часто появляется задача, которой стараюсь избегать.

Дано:
1. Извне периодически поступают документы в формате Word/Excel/Html... (обобщим — текстовые).
2. Документы пишутся людьми, на которых повлиять нельзя.
3. Формат текста в документах (расположение ячеек, абзацев, полей, форматы чисел, дат, валют и т.п.) определяется авторами документов.
По наблюдению, формат повторяется из раза в раз, но в действительности он не является строго заданным, шаблонным и иногда может варьироваться по желанию авторов документов.
4. Есть автоматизированная информационная система, в которую вручную заносятся в формализованном виде определенные данные, извлекаемые из поступающих текстовых документов.

Задача:
Автоматизировать извлечение данных из поступающих документов и занесение их в базу данных системы.

Вопрос:
Какие архитектурные подходы и идеи Вы можете предложить для реализации программной системы, решающей (частично решающей) описанную задачу?
Наверняка многим из Вас приходилось сталкиваться с подобными проблемами. Что делалось и чем это закончилось у Вас?
неформализованные документы формализованный документооборот извлечение данных
Re: Извлечение данных из полуформализованного текста
От: Alexandr Sulimov Украина www.ase.com.ua
Дата: 25.12.09 14:15
Оценка:
Здравствуйте, MikhailVi, Вы писали:

Я вижу так.
С одной стороны документ изначальный, из него нужны "№, дата, автор, текст, ....".
С другой стороны по полям "№, дата, автор, текст, ..." переходим автоматически,
пользователь только нажимает мышкой на текст изначального документа.
Тест выделяется сразу слово/строка/абзац/... если выделено что нужно (ввод, кнопка мышки) данные переносятся в поле и переход на следующее.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re: Извлечение данных из полуформализованного текста
От: Other Sam Россия  
Дата: 25.12.09 20:07
Оценка: 5 (2)
> Коллеги, приветствую.
>
> Начинаю автоматизировать кое-что в гос структуре.
> Среди прочего, часто появляется задача, которой стараюсь избегать.
>
> Дано:
> 1. Извне периодически поступают документы в формате Word/Excel/Html...
> (обобщим — текстовые).
> 2. Документы пишутся людьми, на которых повлиять нельзя.
> 3. Формат текста в документах (расположение ячеек, абзацев, полей,
> форматы чисел, дат, валют и т.п.) определяется авторами документов.
> По наблюдению, формат повторяется из раза в раз, но в действительности
> он не является строго заданным, шаблонным и иногда может варьироваться
> по желанию авторов документов.
> 4. Есть автоматизированная информационная система, в которую вручную
> заносятся в формализованном виде определенные данные, извлекаемые из
> поступающих текстовых документов.
>
> Задача:
> Автоматизировать извлечение данных из поступающих документов и занесение
> их в базу данных системы.
>
> Вопрос:
> Какие архитектурные подходы и идеи Вы можете предложить для реализации
> программной системы, решающей (частично решающей) описанную задачу?
> Наверняка многим из Вас приходилось сталкиваться с подобными проблемами.
> Что делалось и чем это закончилось у Вас?
> Извлечение данных из полуформализованного текста

Давненько у меня была слегка похожая задача. Была куча чего-то (по
большей части иксель), а из этого чего-то нужно сделать "предложения"
(что-то вроде прайс-листа). На предложения нужно либо завести
поставщика, либо выбрать из уже имеющихся. И все это в вебе.

На удивление жизнеспособной идеей оказалась такая.

Страница 1: Поле textarea в которое нужно скопировать текст из икселя
через буфер обмена. Тогда сами по себе получаются разделители (конец
строки разделитель записей, табулятор — разделитель столбцов).
Кнопка сабмит (переход на страницу 2)

Страница 2: Html-таблица со всеми данными. В заголовке таблицы над
каждым столбцом находится DropDownBox (<select>) в котором перечислены
все столбцы относяциеся к товарной позиции и к поставщику. Что-то вроде
наименование, цена, вес, производитель, фио, фамилия, имя, телефон, адрес...
Пользователь должен над каждым столбцом выбрать назначение столбца.
Сабмит — переход на страницу 3 (некоторые столбцы обязательны, и на
странице 2 они обязательно должны быть указаны, иначе переход не
производится). Можно выбирать одно и то же наименование для нескольких
столбцов, тогда данные из этих столбцов объединяются (чаще всего
комментарии и телефоны)

Страница 3: Сообщение сколько записей, сколько поставщиков, сколько
записей без поставщиков. Список поставщиков, так, как они опознались из
исходных данных и дополнительно поля для ввода всех атрибутов
поставщика. Напротив каждого отображается выбранный из уже
зарегистрированных поставщик, либо пусто (типа это новый поставщик).
Также напротив каждого поставщика ajax формочка для поиска и выбора
поставщика (если алгоритм сам не сможет найти, пользователь ищет и
выбирает). Одна запись (если есть записи без поставщика) типа дефолтный
поставщик. У этой записи тоже есть поля для ввода всех атрибутов. Также
как и для всех остальных поставщиков, можно найти в базе уже
зарегистрированного и выбрать его.
По сабмиту производится запись данных в базу. При этом, заносятся новые
поставщики (если нужно), а каждая товарная запись проверяется по базе и
либо добавляется либо обновляется (например при изменении цены).

Страница 4: Такая же textarea как на странице 1, но в ней все строки,
которые не прошли (например в столбце цена написано "договорная", а в
базе там ожидается decimal). Пользователь может ручками поправить и
перейти на страницу 2 (повторный ввод). все как раньше (только на второй
странице столбцы уже выбранные, как в первый раз).
Также на странице 4 (выше textarea) краткий отчет:
Обработано: 500 строк
Поставщиков: 2
Добавленно товаров: 240
Обновлено товаров: 260
Добавлено поставщиков: 1
Необработанных строк: 3
(это примерно, я уже не помню что там было конкретно).

Этот подход разрабатывался по идеям заказчика и вместе с ним. Реализация
была кошмарная (на обновление 500 строк производилось 1500 SQL
запросов). Работало медленно, за раз прожевывало не более 6 тысяч строк
(на эти 6000 строк могло уйти 3-4 минуты).
Когда сделали, заказчик посадил девочку-секретаря и она за полтора
месяца забила несколько сотен тысяч предложений в эту систему. Из всяких
разношерстных прайслистов, из веба, из вордовских документов. Было еще
довольно много бумажных факсов, которые она распознала файн-ридером и
тоже занесла в базу!
После чего уже менеджеры-продавцы сами регулярно пополняли систему.
Оказалось менеджеру легче один раз засунуть прайс-лист в систему и
пользоваться его данными там (никого не пришлось заставлять). Благодаря
проверке записей при вставке менеджеры, если не знали занесен ли
некоторый прайс лист в базу, не парились, а тупо заносили его по-новой,
дубликатов-то не возникало.

Короче с точки зрения всяких идеалогий построения приложений/интерфейсов
это был полный кошмар, но как оказалось для этого заказчика этот подход
оказался намного лучше всех остальных по юзабилити.
Posted via RSDN NNTP Server 2.1 beta
Re: Извлечение данных из полуформализованного текста
От: Аноним  
Дата: 29.12.09 21:23
Оценка:
Здравствуйте, MikhailVi, Вы писали:

MV>Коллеги, приветствую.


MV>Начинаю автоматизировать кое-что в гос структуре.

MV>Среди прочего, часто появляется задача, которой стараюсь избегать.
...
MV>Какие архитектурные подходы и идеи Вы можете предложить для реализации программной системы, решающей (частично решающей) описанную задачу?
MV>Наверняка многим из Вас приходилось сталкиваться с подобными проблемами. Что делалось и чем это закончилось у Вас?

Ну, нужно понимать, что в общем виде задача решения не имеет. Тогда всё становится проще.

Это означает что нужно задача изначально разбивается на две принципиально разные:
— создание автоматических парсеров для наиболее распространенных случаев с последующим их совершенстованием
— создание для операторов рабочего места, максимально облегчающего ручное распознавание информации

Задачи, как нетрудно видеть, ничего почти общего не имеют, следовательно — отлично бьются между исполнителями

первая задача, в свою очередь, разбивается на создание пар — признак определенного класса формата (скажем — источник) и собственно набор возможных парсеров для этого семейства

Дальше гоняете свои парсеры по тестовому набору документов, строчите массу кода вида "ищем число в ячейке, находящейся справа или снизу от ячейки с текстом 'Итого:', если находим то..." и добиваетесь заданного заказчиком процента автоматического распознавания.

В процессе приходится писать всевозможные helper-ы, типа "распознавание даты даже в случае, если название месяца написано с ошибкой" и много регулярных выражений.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.