CRFSuite/Wapiti:如何为运行培训创建中间数据?

数据挖掘 nlp 贴标签
2022-02-18 23:16:04

上周要求并被建议使用两种软件(用于训练模型以对字符串的块进行分类)之后,我现在正在努力使用其中任何一种。

似乎在机器学习中(或者至少使用 CRF?),您不能只直接在训练数据上进行训练,而是必须先经过一个中间步骤。¹

来自 CRFsuite 教程:

下一步是对训练和测试数据进行预处理,以提取表示数据中单词(项目)特征的属性。CRFsuite 在内部从数据集中的属性生成特征。一般来说,这是机器学习方法中最重要的过程,因为特征设计极大地影响了标注的准确性。

Wapiti 不需要创建这样的属性文件,我认为因为它具有“模式”,而不是看起来比 CRFsuite 的中间格式文件更复杂。

举个例子:给定大量(数万个)字符串,例如这三个:

  • Michael went to his room.

  • Did you know Jessica's mom used to be with the military?

  • Amanda! Come back inside! We'll have dinner soon!

从中手动创建了少量(几千)标记的训练和测试数据,例如这个块(对于上面的第一个示例):

T Michael
K went
K to
K his
K room
S .

K Did
K you
K know
T Jessica's
K mom
K used
K to
K be
K with
K the
K military
S ?

T Amanda
S !
K Come
K back
K inside
S !
K We'll
K have
K dinner
K soon
S .

T对于名称,K对于非名称,S对于标点符号,N对于数字。)

我如何确定“属性”应该是什么,以便能够创建与 CRFsuite 教程chunking.py中使用的脚本等效的脚本


¹:关于那个中间步骤,Naoaki Okazaki 使用的术语我不清楚。“特征”和“属性”可以互换使用,似乎是指数据中包含的不可见的东西。“标签”可能是放置标记的类别,然后还有“观察”。

1个回答

确实,这是一个复杂的过程,但为了充分利用模型,理解它是值得的。

“特征”和“属性”(可能是观察,但我不是 100% 确定)是一回事。这些特征是模型直接使用的特征(与原始输入数据相反)。对于每个输入单词,根据配置文件中定义的自定义“模式”的输入数据生成一个二进制特征向量。请注意,我使用“数据”这个词,因为输入数据不必只是文本,它可以选择包含附加信息作为列,例如 POS 标签(由 POS 标记器获得)和句法依赖项(由依赖解析器获得)。

这种信息通常对模型非常有用:如果模型只能使用文本,那么默认的二进制特征是由单词的基本 one-hot-encoding 构成的。这意味着模型只能使用基于word == x或的条件word != x看看为什么这还不够:单词“12345”与“12346”不同,就像单词“;”一样。与“paleontology”不同,即在此示例中,模型无法捕捉到“12345”和“12346”都是数字的事实。

此外,这些模式允许模型使用其他“邻居特征”,这就是符号有点复杂的原因。这个想法是,标签可能不仅取决于当前单词的特征,还取决于前一个单词或前一个单词的特征。换句话说,这允许模型考虑序列中的上下文。

最后,通常也可以定义标签之间的依赖关系。例如,可能有一些标签序列不可能发生,这些信息可以帮助模型通过考虑序列中的前一个/下一个标签来确定当前单词的正确标签。

好的,这是一个非常简短的总结,现在如何决定使用哪些模式?好吧,最常见的选择是尝试一些配置,然后手动测试和调整它们。也可以使此过程自动化,但恕我直言,这几乎不值得付出努力。