【问题标题】:Dealing with differences in feature space regarding text classification using SVM使用 SVM 处理关于文本分类的特征空间差异
【发布时间】:2017-07-09 11:06:02
【问题描述】:

我在 R 邮件列表中提出了这个问题,但我认为这里是寻找答案和提示的更好地方。

我目前正在研究学生论文的文本分类,尝试 识别是否适合某个类别的文本。我使用来自的文本 一个学期 (A) 的培训和另一学期 (B) 的课文 测试分类器。我的工作流程是这样的:

  • 从 A 中读取所有文本,构建一个包含大约 1387 个术语的 DTM(A)(包 tm)
  • 从 B 中读取所有文本,构建一个包含大约 626 个术语的 DTM(B)
  • 使用 SVM(包 e1071)通过 DTM(A) 训练分类器

现在我想使用分类器对 DTM(B) 中的所有文本进行分类。但 当我尝试使用 predict() 时,我总是收到错误消息:Error in eval(expr,envir,enclos):找不到对象'XY'。据我所知, 原因是 DTM(A) 和 DTM(B) 的数量不同 术语,因此并非用于训练模型的每个术语都是 在 DTM(B) 中可用。

当然,用两个不同的特征空间进行分类是有问题的,但我想为这个“现实世界的问题”找到一个解决方案。这个想法是确定学生上交的文本是否适合其他文本。所以我天真的想法是用一个学期的文本[DTM(A)]开发一个预测模型,然后用这个模型来评估另一个学期的新文本[DTM(B)]。由于新文本不在原始 DTM 中,因此特征空间不同。到目前为止,我只找到了使用从所有文本创建的 DTM 的代码,但这需要创建一个新的 DTM(A)` 并每次都重新训练 SVM。

我的问题是:我应该/如何处理这个问题?我应该匹配条款吗 在 DTM(A) 和 DTM(B) 中使用,以获得相同的特征空间? 这可以通过减少 DTM(A) 中的术语数量或 向 DTM(B) 添加几个空/NA 列。或者有没有其他解决方案 我的问题?

亲切的问候

比约恩

【问题讨论】:

  • 谢谢,但您链接的帖子不是关于不同的特征空间,这意味着 DTM 中的不同列,而是关于不同级别的分类变量。
  • 你可以概括一下。没有机器学习方法可以处理新的预测器;本质上,当您为具有新级别的分类变量创建虚拟变量时,您会得到。所以基本上就像我在回答中所说的那样,你需要维护一个变量列表,这些变量是训练的一部分,因此也是模型的一部分。根据此列表过滤您的测试/预测数据,然后继续对受过训练的对象进行评分。
  • 您可能希望以一种聪明的方式进行训练测试划分,以便训练数据包含尽可能多的单词。

标签: r svm text-classification


【解决方案1】:

经过更多的实验和研究,我发现了 RTextTools 包及其函数“create_matrix()”。此函数创建一个新的 DTM,您还可以将矩阵调整为用于训练模型的 originalMatrix。这正是我想要的。所以我查看了原始代码(https://github.com/timjurka/RTextTools/blob/master/RTextTools/R/create_matrix.R)并想出了这个:

# get all the terms which are in the training df, but not in the test df
terms <- colnames(train.df[,which(!colnames(train.df) %in% colnames(test.df))])
# weight is set, this is just in case that weightTfIdf was used, otherwise it should be 0
weight <- 0.000000001
# now create a new matrix with the missing terms
amat <- matrix(weight, nrow = nrow(test.df), ncol = length(terms))
colnames(amat) <- terms
rownames(amat) <- rownames(test.df)

# create a new test df with the original values plus the new matrix with the missing terms
test.df.fixed <- cbind(test.df[,which(colnames(test.df) %in% colnames(train.df))],amat)
test.df.fixed <- test.df.fixed[, sort(colnames(test.df.fixed))]

结果是一个测试数据框,其中包含用于训练的数据框的所有特征(列)。所以它基本上是“上过滤”而不是下过滤。快速测试表明它运行良好(准确度:0.91,Kappa:0.88)。

【讨论】:

    【解决方案2】:

    在现实世界中,您的训练和测试数据是完全独立的。这意味着您事先对测试文档一无所知。考虑到这一点,解决问题的最佳方法是将数据集 B 的 TDM 基于数据集 A 中使用的词汇表(例如,仅计算出现在 A 中的单词)。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2013-01-18
      • 2017-09-19
      • 2016-09-02
      • 2015-11-23
      • 2016-12-21
      • 2014-02-17
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多