0

我正在尝试使用 weka 对垃圾邮件和非垃圾邮件进行分类。

将 100 条带标签的垃圾邮件消息和另外 100 条带标签的非垃圾邮件消息作为训练数据集,我将stringtowordvector其用作过滤器来训练分类器。结果crossValidateModel非常好。但是我想使用独立的测试集来评估分类器,以确保将任何其他味精从训练集中分类出来是可靠的。

我的问题:

我也必须使用stringtowordvector测试数据集来创建一个独立的 .arff 文件,该文件独立于训练 arff 文件。两个数据集中出现的同一个词分别具有 2 个不同的属性索引,在这些2 个.arff 文件。例如,单词“money”10在训练 .arff 文件中具有矩阵索引,但在测试 .arff 文件中它被索引为50th属性。

我担心已经训练好的分类器会与 2 个数据集中的所有这些词不匹配,因为它们具有不同的矩阵索引。更具体地说,{1 1,2 1,3 5}训练中的向量 .arff 代表"i want to to to to to....",但在测试 .arff 文件中,这个相同的向量代表"money does not not not not ....."。那么,这个验证怎么能可靠呢?

使用crossValidateModel时,它使用来自同一个 arff 文件的实例,因此 weka 必须将索引与单词正确匹配。我的目标是用大量标记的数据集训练它,然后用它来分类任何单个未标记的味精。每次我想对单个味精进行分类时,我都必须将此味精转换为一个 .arff 文件,该文件具有与训练 .arff 文件完全不同的属性列表和矩阵索引。(我没有使用 windows 工具,我在我的程序中使用了 weka .jar api)。有什么帮助吗?

4

1 回答 1

0

您需要从您的训练集中创建一个特征映射文件以实现您想要的。特征映射文件通常采用以下格式:

someword:1
someotherword:2
yetanotherword:3
...

这有效地将每个单词映射到某个索引。所以你要做的是遍历你的训练集中的所有文件,并将你的训练集中存在的每个单词映射到一个唯一的 id,这将代表你的 ARFF 中的单词索引。

因此,假设您的训练集包含一个带有单词的文件,"i want to to to to to make money"那么您的特征图将如下所示:

i:1
want:2
to:3
make:4
money:5

您在 ARFF 中的属性如下所示:

@ATTRIBUTE i NUMERIC
@ATTRIBUTE want NUMERIC
@ATTRIBUTE to NUMERIC
@ATTRIBUTE make NUMERIC
@ATTRIBUTE money NUMERIC

其中每个属性表示单词在电子邮件中出现的次数。

然后,如果您想为测试集制作 ARFF,您将遍历测试集中的所有文件,并且对于遇到的每个单词,请在特征图中查找。如果这个词在你的特征图中,你就知道在那个词映射到的索引处增加属性的值。如果这个词不在你的特征图中,那么你就忽略它,因为你的分类器没有接受过这个词的训练,甚至不知道这个词的存在。

这将保持你的训练集的属性和你完美对齐的任何测试集。

我建议您将特征映射文件作为HashMap<String, Integer>从单词 ( String) 到属性索引 ( Integer) 的 Java 映射读取,以便在获取测试集电子邮件的属性值时快速查找单词。

于 2017-07-20T21:26:16.300 回答