【问题标题】:Parsing text with Python: unstructured but similar information with different formatting使用 Python 解析文本:具有不同格式的非结构化但相似的信息
【发布时间】:2011-04-09 22:53:09
【问题描述】:

我正在尝试使用 Python 解析数千个包含公司、材料、化学特性等(具体来说是材料安全数据表)的规格表文本文件。文本文件包含松散结构格式的类似信息,因此它是人类可读的,但不够结构化,不容易解析(例如,不是 XML 或 CSV)。简而言之,它无处不在。

最初,数据是由在不同公司工作的不同人员手工输入的。另一组人将信息转录成这些文本文件(OCR 将其转换成 txt 文件)。

是否有解析库或模式来提取此类信息? (这似乎是一个“常见的”数据输入问题。)肯定会大量使用正则表达式。我对自然语言处理库没有任何经验。他们甚至适合解决这个问题吗?

我最初的想法是尝试对不同类别的文件进行分组,然后为每种格式创建一组解析函数。不幸的是,他可能只适用于问题的一小部分,并且不同的情况可能会迅速失控。

由于这个问题一般,我将提供一堆示例来说明问题。

地址信息
每个文件都包含公司信息,例如信息和地址。信息可能有也可能没有标识符,它可能在一行上,也可能不在一行上,等等。简而言之,似乎有每一种组合。

例如(带字段信息):

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

例如。 (wo/字段信息):

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
=========================================
==========

这是一个完整的例子:
希望这将澄清解析文件的问题。您会注意到换行、信息在不同行上的拆分等。并非所有都有确切的结构,有些格式会不同,信息在不同的位置。这是a paper hard copy 的链接。

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

【问题讨论】:

  • 我唯一想到的是nltk,但是一些非常狡猾的正则表达式可以工作。但我不认为有一个简单的答案。
  • 您可能还对 nltk 书籍的ch. 7 感兴趣。
  • 字段顺序是永久的吗?对于缺少字段名称的文件,您是否有记录分隔符?
  • 我也有类似的情况,请问你是怎么解决的?

标签: python parsing text-parsing


【解决方案1】:

我会编写一个包含大量状态变量的 for 循环,处理每一行,并使用状态变量来跟踪正在发生的事情。 for 循环中的条件 (if) 会提出与人类手动解析文件相同的“问题”。

"
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
"

等等。 如果您至少有一个固定的字段顺序,我无法从示例中理解, 以及每条记录的最大字段数或不同的记录分隔符。没有这些,我觉得写起来会更难。

【讨论】:

  • 感谢您的回复,我会在帖子中添加更多信息。字段顺序不是永久的,并且变化很大。有一些相似性;制造商信息几乎总是排在第一位。
  • 这就是我想解决的问题。
猜你喜欢
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多