Разбор текста с помощью Python: неструктурированная, но похожая информация с различным форматированием - PullRequest
4 голосов
/ 10 апреля 2011

Я пытаюсь проанализировать тысячи текстовых файлов спецификаций, содержащих данные о компании, материале, химических свойствах и т. Д. (Паспорта безопасности материалов, если быть точным) с Python.Текстовые файлы содержат аналогичную информацию в слабо структурированном формате, так что она удобочитаема для человека, но достаточно неструктурирована, чтобы ее было сложно проанализировать (например, не XML или CSV).Короче говоря, это просто повсюду.

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

Есть ли библиотека синтаксического анализа или шаблоны для извлечения битов информации этого типа?(Кажется, это «общая» проблема ввода данных.) Конечно, регулярные выражения будут использоваться очень часто.У меня нет опыта работы с библиотеками обработки естественного языка.Будут ли они даже подходить для этой проблемы?

Моя первоначальная мысль - попытаться сгруппировать файлы по разным категориям, а затем создать набор функций синтаксического анализа для каждого формата.К сожалению, он может работать только для небольшой части проблемы, и различные случаи могут быстро выйти из-под контроля.

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

ИНФОРМАЦИЯ ОБ АДРЕСАХ
Каждый файл содержит информацию о компании, такую ​​как информация и адрес.Информация может иметь или не иметь идентификатор, она может или не может быть в одной строке и т. Д. Короче говоря, кажется, что каждая комбинация.

Пример (без информации о поле):

MANUFACTURER: Foo Bar Inc.  
ADDRESS: 123 Foo St.  
Bar, CA 90012

Пример.(информация о работе / поле):

Foo Bar Inc.  
123 Foo St.  
Bar, CA 90012

Пример.(Иногда дополнительные строки между информацией):

FOO BAR INC.

123 FOO ST.

BAR, CA 90012

Пример.(несовместимые имена полей):

MANUFACTURER'S NAME: FOO BAR INC.  
CREATIVE DIVISION  
ADDRESS: 123 FOO ST.  
CITY, STATE & ZIP: BAR, CALIFORNIA 90012  
PHONE NUMBER: 310-111-2222

ИНФОРМАЦИЯ О РАЗДЕЛЕ
Спецификации также имеют аналогичные разделы, но представляют собой несовместимые порядки, заголовки, числовые типы и разделители.

Пример:

========================================
SECTION 1 -- MATERIALS
========================================

Пример:

Section I. Materials
------------------------------------------

Пример:

----- Section 3       Materials

Иногда ширина файлов изменялась, поэтому следующие разрывы строк:

Пример:

===================================================
1.    Materials
===================================================

Становится:

=========================================
==========
1.    Materials
=========================================
==========

Вот полный пример:
Надеюсь, это прояснит проблемы с анализом файла.Вы заметите перенос строк, разбивку информации по разным строкам и т. Д. Не все имеют точную структуру, некоторые будут отформатированы по-разному, с информацией в разных местах.Вот ссылка на бумажную копию .

MATERIAL SAFETY DATA SHEET

=================================================================
=========
SECTION I-PRODUCT AND PREPARATION INFORMATION
=================================================================
=========

MANUFACTURER:         Some Company Inc     EMERGENCY AND
INFORMATION
TELEPHONE
(111)222-3333
ADDRESS:              Some Road
City, ST
12346

IDENTITY (AS USED ON
LABEL AND LIST):      Some Identity

PREPARATION DATE:     Some Date

=================================================================
=========
SECTION II-HAZARDOUS INGREDIENTS/IDENTITY INFORMATION
=================================================================
=========

OSHA
ACGIH
HAZARDOUS COMPONENTS             CAS#       PEL   TWA        TLV
%
(SPECIFIC CHEMICAL IDENTITY;
COMMON NAME(S)
-----------------------------------------------------------------
---------

Some Chemical             111-22-3   15    10         10
12.34


=================================================================
=========
SECTION III-PHYSICAL/CHEMICAL CHARACTERISTICS
=================================================================
=========

Boiling Point:              N/A  Specific Gravity (H20=1):   N/A
Vapor Pressure (mm Hg):     N/A  Melting Point:              N/A
Vapor Density (AIR=1)       N/A  Evaporation Rate
(Butyl Acetate=1)           N/A
Solubility in Water:        None

Appearance:  Solid, various colors, may have slight
odor.

N/A = Not applicable

=================================================================
=========
SECTION IV-FIRE AND EXPLOSION HAZARD DATA
=================================================================
=========

FLASH POINT (METHOD USED):  None
FLAMMABLE LIMITS:  None          LEL:  N/A        UEL:  N/A
EXTINGUISHING MEDIA:  None
SPECIAL FIRE FIGHTING PROCEDURES:  None required.
UNUSUAL FIRE AND EXPLOSION HAZARDS:  None.

=================================================================
=========
SECTION V-REACTIVITY DATA
=================================================================
=========

STABILITY:  Stable
CONDITIONS TO AVOID:  None
INCOMPATIBILITY (MATERIALS TO AVOID):  None
HAZARDOUS POLYMERIZATION:  Will not occur

=================================================================
=========
SECTION VI-HEALTH HAZARD DATA
=================================================================
=========

ROUTES OF ENTRY:

INHALATION:  Yes
SKIN:  Possibly
INGESTION:  Possibly
EYES:  Possibly

HEALTH HAZARDS (ACUTE AND CHRONIC):  Pneumoconiosis, silicosis,
emphysema,
nose and throat irritation, eye irritation, skin irritation in
some.

CARCINOGENICITY:  No applicable information found.

SIGNS AND SYMPTOMS OF EXPOSURE:  Coughing, sneezing; irritation
of the
mucous membranes; eye irritation; skin irritation or rash, dry
throat.

MEDICAL CONDITIONS GENERALLY AGGRAVATED BY EXPOSURE:  Nasal,
bronchial or
pulmonary conditions which tend to restrict breathing, skin
abrasions.

EMERGENCY AND FIRST AID PROCEDURES:  Remove to fresh air,
irrigate eyes,
wash with soap and water, contact physician if necessary.

=================================================================
=========
SECTION VII-PRECAUTIONS FOR SAFE HANDLING AND USE
=================================================================
=========

STEPS TO BE TAKEN IN CASE MATERIAL IS RELEASED OR SPILLED:
Normal clean-up
procedures.

WASTE DISPOSAL METHOD:  Standard landfill methods consistent with
applicable state and federal regulations.

PRECAUTIONS TO BE TAKEN IN HANDLING AND STORING:  Use caution not
to drop,
crush, break or chip.

OTHER PRECAUTIONS:  Do not use at speeds greater than the
not-to-exceed
speed printed on the hub assembly.

=================================================================
=========
SECTION VIII-CONTROL MEASURES
=================================================================
=========

RESPIRATORY PROTECTION (SPECIFY TYPE):  OSHA or NIOSH approved
respirators
may be required.

VENTILATION:  Local exhaust recommended.  Special:  N/A.
Mechanical:  Useful.  Other:  N/A.

PROTECTIVE GLOVES:  May be useful.

EYE PROTECTION:  Recommended.

OTHER PROTECTIVE CLOTHING OR EQUIPMENT:  Not required.

WORK/HYGIENIC PRACTICES:  Keep clothing and area clean.  Wash to
remove

1 Ответ

2 голосов
/ 10 апреля 2011

Я бы написал цикл for с множеством переменных состояния, обрабатывал каждую строку и использовал бы переменные состояния, чтобы отслеживать, что происходит. Условные обозначения (if) внутри цикла for задали бы те же «вопросы», которые пришлось бы задавать человеку, если бы он вручную анализировал файл.

"
for line in file:
    Is there a colon in line?
        field_name = normalize(informaton before the colon)
        data = information after the colon
    else: 
        field_name = next_field_in_list(previous_field)
        data = line
"

И так далее. Я не могу понять из примеров, если у вас есть хотя бы фиксированный порядок полей, и либо максимальное количество полей в записи, либо отдельный разделитель записей. Думаю, без них было бы сложнее написать.

...