如何使用 Mallet 进行序列标记任务?

How do I use Mallet for my sequence labeling task?

我正在尝试将 mallet 包合并到我的 java 代码中以用于我的序列标记任务。但是,我不太确定我应该如何仅根据 mallet 网站上的数据导入指南进行操作。谁能帮我解决这个问题?

我的第一个问题是关于序列数据的导入。我在网站上看到的唯一数据格式是InstanceList,但是,我们应该如何用数据结构来描述序列。例如,如果我们有多个序列(A、B、C 是标签): S1: A B B B B A B B; S2:B A B B B B C; S3:C B A B B B。 我应该如何将它们放入训练数据中? S1 的 InstanceList,S2 的 InstanceList 和 S3 的 InstanceList?然后如何将它们一起作为训练数据?

我的第二个问题是关于如何将特性设置到实例中。我已经有了特征权重和标签,那么有没有一种简单的方法可以让我设置实例?比如我在序列中有一个item的features [0.1, 0.2, 0.5, 0.4, 0.1],标签为B,如何在不经过multiple pipeline process的情况下将features设置到Instance结构中?

此外,我打算将CRF模型用于我的序列标记任务。除了标签,我还想知道整个序列的概率。我有可能得到这些信息吗?我在网站上看到了这样的东西:

    double logScore = new SumLatticeDefault(crf,inputSeq,outputSeq).getTotalWeight();
    double logZ = new SumLatticeDefault(crf,inputSeq).getTotalWeight();
    double prob = Math.exp(logScore - logZ);

这是我想要的吗?如果是,这里的 inputSeq 和 outputSeq 是什么?

序列标记任务的标准输入格式是每行一个标记,序列之间用空行分隔

feature1 feature2 feature3 ... A
feature2 feature4 feature6 ... B

feature1 feature3 feature8 ... C
feature2 feature3 feature4 ... C

在大多数情况下,CRF 特征被假定为二元的。如果您有已知值的特征,您可能需要编写一些额外的代码。 class SvmLight2FeatureVectorAndLabel 可能有用。

inputSeq 变量应为 FeatureVectorSequenceoutputSeq 变量应为 LabelSequence。这些分别是 Instance 的数据和目标字段。