如何解析松散结构化的文档

时间:2012-08-04 18:29:19

标签: python text-analysis

我正在分析数据源,其数据有点像这样

RAM 4 GB DDR3
RAM 16GB DIMM
memory 4GB DDR3 MHz         // no value for MHz 
memory 4GB DDR3 1333 MHz    // no the order of MHz is not fixed
ram 6GB, 1333 MHz, DDR3     // comma used as delimiter

Processor Intel Core i7-3612QM
Processor Intel Core i7 2630QM
processor i3-380,2.53 GHz          //380 used for model number instead of 380M and model number separated by '-' and clock speed separated by ','
Processor Core i3-380 2.53 GHz 
Processor Intel Ci3 - 2330 (2nd Gen), 2.53 GHz   // multiple symbols used as delimiters(',','-')

Hard drive 500GB 5400RPM
Hard Disk Drive 1.5 TB
Hard Disk 256 GB

现在我需要分析ram 6GB, 1333 MHz, DDR3中每个规范的含义我需要弄清楚6GB是容量,1333 MHz是频率,DDR3是ram的类型。但是你可以看到的问题是这些是非常不规则的(一些条目有一些字段而没有其他字符,有时空格用作分隔符,有时是, s,有时是- s。我的第一反应是使用正则表达式,但我很快意识到它是愚蠢的。然后我认为我可以split在分隔符(,上面的情况下),但即使分隔符也不固定。此方法对此类条目也无用memory 4 GB 1333 MHz DDR3使用空格作为此条目的分隔符会使其看起来像4 GB 1333 MHz不同但实际上4 GB1333 MHz是不同的。 另外,我如何以编程方式确定Intel Core i3Core i3i3-380Ci3是否意味着英特尔酷睿i3?我知道我必须告诉图书馆,Intel Core i3Core i3Ci3意味着同样的事情。但后来在分析文本时应该能够弄明白。 上面提到的条目列表显示了条目的变量。是否有一些python库(或任何其他语言)可以帮助我处理这些任务?

2 个答案:

答案 0 :(得分:3)

如果你能够构建一组直接对应于每种类型的条目的类,那么这可能是要走的路。例如,RAM的类可能是:

class Memory:
    def __init__(self, s):
        if not 'RAM' in s and not 'memory' in s:
            raise ValueError("Not a string that describes RAM.")

        self.capacity = int(re.match(r'(\d+) ?GB', s)[1])

然后尝试每个课程直到一个人适合。

答案 1 :(得分:2)

首先,您确定没有其他系统方法来获取设备信息吗?大多数系统实用程序提供了导出信息的标准方法。

如果您绝对必须解析此结构,则必须使用regex正则表达式来处理此类结构松散的文档。

虽然本文档一般没有统一的结构,但本文档中的每一行都有自己的标准化结构。

逻辑:

1)一次解析一行文件。 2)读取第一个令牌并使用该方法解析该行的其余部分。

例如:如果您遇到令牌“RAM”,您知道它后面跟着一个数字大小,单位,然后是类型。

快乐的编码!