抽象类pipe,是所有pipe类的父类,这些类的作用就是将数据从一种形式转成另一种形式。在特征提取阶段,pipe类是最常用的。
pipe类操纵Instance类,Instance类是描述数据的类,也是十分重要的一个类。
每一个Instance包括四个预定义的域,分别是:"data", "target", "name", 和"source"。
"Data" 保存着每个实例的数据表示
"target" 是一个与实例相关的标签
"name" 是每个实例的短的可识别的名字,就像文件名
"source" 是可读的源文件信息,就像初始的文本
每个域都没有预定义的类型,而是随着实例的处理在改变类型。举个例子,data域刚开始可是是string类型,表示文件名,然后随着pipe的类变成CharSequence表示文件的内容,最终变成特征向量,而特征向量则保留着按照字母表顺序在文件中的词表。它随着pipe类的处理变化着,最常见的是pipe类修改data域的值。
总的来说,有两种使用Instance的方式。(1)一个实例通过Pipe类来创建,并且通过Pipe类及子类产生data/target/name/source域的值,这通常在训练时做(2)实例产生原始的值在各个域中,然后不同的使用者,即各种Pipe类调用newPipedCopy()方法产生各自的实力,这通常在测试性能是用。
如果锁着的话,实例是不可改变的。而唯一可以改变实例四个域的值的是在Pipes中。也就是说只有Pipes类才能改变实例的值。
从Instance的源代码可以看出,类中只有属性,以及get、set方法,还有Iterator,write,read,shallowCopy以及构造器等方法,并不复杂,但十分重要。
Pipe类将Instance读入,然后处理,然后输出。其中最常被修改的是data域。Pipe类常与InstanceList类协做。Instance加入到队列中,然后依次通过pipe的处理,处理完又保留在list中。
FileIterator类通过在每个目录中遍历,将每个文件创建一个实例,将数据从文件中放入Instance的data域中。将文件的目录结构存储到实例的target域中,因为要求文件的组织按照类别标签归类。FileIterator将Instance放入到InstanceList中,而后者通过Pipe来处理各个Instance并保存结果。
Pipe类通常是层次性地组成。最典型的使用是SerialPipe类。SerialPipe类按照一个预先排好顺序的表将Instance一步一步处理。通过SerialPipe处理实例就像是处理实例通过一个个子Pipe类按照顺序。
一个Pipe有两个字母表,一张是数据域中的特征表,另一张是目标域中的特征表。
通过查看pipe的源文件,发现主要是构造器,getset字母表的方法,read,write,判断方法,处理字幕表,查找父节点,子节点等方法。