使用 SVM 处理关于文本分类的特征差异 space
Dealing with differences in feature space regarding text classification using SVM
我在 R 邮件列表上问过这个问题,但我认为这里是寻找答案和提示的更好地方。
我目前正在研究 class学生论文的文本化,尝试
识别适合或不适合特定 class 的文本。我使用的文本来自
一个学期 (A) 用于培训,另一学期 (B) 用于培训
测试 classifier。我的工作流程是这样的:
- 阅读A中的所有文本,构建一个包含大约1387个术语的DTM(A)(package tm)
- 阅读 B 的所有文本,构建一个包含大约 626 个术语的 DTM(B)
- 使用 SVM(包 e1071)用 DTM(A) 训练 classifier
现在我想 class使用 classifyer 验证 DTM(B) 中的所有文本。但
当我尝试使用 predict() 时,我总是收到错误消息:Error in
eval(expr, envir, enclos):未找到对象 'XY'。据我所知,
原因是 DTM(A) 和 DTM(B) 有不同数量的
项,因此并非用于训练模型的每个项都是
在 DTM(B) 中可用。
当然,用两个不同的特征 space 进行 class 化是有问题的,但我想为此 "real-world-problem" 找到一个解决方案。这个想法是确定学生上交的文本是否适合其他文本。所以我天真的想法是用一个学期的文本 [DTM(A)] 开发一个预测模型,然后使用这个模型来评估另一个学期的新文本 [DTM(B)]。由于新文本不在原始 DTM 中,因此特征 space 不同。到目前为止,我只找到了使用从所有文本创建的 DTM 的代码,但这需要创建一个新的 DTM(A)` 并每次都重新训练 SVM。
我的问题是:should/do 我如何处理这个问题?我应该匹配条款吗
在 DTM(A) 和 DTM(B) 中使用,以获得相同的特征 space?
这可以通过减少 DTM(A) 中的项数或
向 DTM(B) 添加几个 empty/NA 列。或者有其他解决方案
我的问题?
亲切的问候
比约恩
经过更多的实验和研究,我发现了 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))]
结果是一个测试数据框,它具有用于训练的数据框的所有特征(列)。所以它基本上是 "up-filtering" 而不是 down-filtering。快速测试表明它运行良好(准确度:.91,Kappa:.88)。
在现实世界中,您的训练和测试数据是完全独立的。这意味着您事先对测试文档一无所知。考虑到这一点,解决问题的最佳方法是将数据集 B 的 TDM 基于数据集 A 中使用的词汇表(例如,只计算 A 中出现的单词)。
我在 R 邮件列表上问过这个问题,但我认为这里是寻找答案和提示的更好地方。
我目前正在研究 class学生论文的文本化,尝试 识别适合或不适合特定 class 的文本。我使用的文本来自 一个学期 (A) 用于培训,另一学期 (B) 用于培训 测试 classifier。我的工作流程是这样的:
- 阅读A中的所有文本,构建一个包含大约1387个术语的DTM(A)(package tm)
- 阅读 B 的所有文本,构建一个包含大约 626 个术语的 DTM(B)
- 使用 SVM(包 e1071)用 DTM(A) 训练 classifier
现在我想 class使用 classifyer 验证 DTM(B) 中的所有文本。但 当我尝试使用 predict() 时,我总是收到错误消息:Error in eval(expr, envir, enclos):未找到对象 'XY'。据我所知, 原因是 DTM(A) 和 DTM(B) 有不同数量的 项,因此并非用于训练模型的每个项都是 在 DTM(B) 中可用。
当然,用两个不同的特征 space 进行 class 化是有问题的,但我想为此 "real-world-problem" 找到一个解决方案。这个想法是确定学生上交的文本是否适合其他文本。所以我天真的想法是用一个学期的文本 [DTM(A)] 开发一个预测模型,然后使用这个模型来评估另一个学期的新文本 [DTM(B)]。由于新文本不在原始 DTM 中,因此特征 space 不同。到目前为止,我只找到了使用从所有文本创建的 DTM 的代码,但这需要创建一个新的 DTM(A)` 并每次都重新训练 SVM。
我的问题是:should/do 我如何处理这个问题?我应该匹配条款吗 在 DTM(A) 和 DTM(B) 中使用,以获得相同的特征 space? 这可以通过减少 DTM(A) 中的项数或 向 DTM(B) 添加几个 empty/NA 列。或者有其他解决方案 我的问题?
亲切的问候
比约恩
经过更多的实验和研究,我发现了 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))]
结果是一个测试数据框,它具有用于训练的数据框的所有特征(列)。所以它基本上是 "up-filtering" 而不是 down-filtering。快速测试表明它运行良好(准确度:.91,Kappa:.88)。
在现实世界中,您的训练和测试数据是完全独立的。这意味着您事先对测试文档一无所知。考虑到这一点,解决问题的最佳方法是将数据集 B 的 TDM 基于数据集 A 中使用的词汇表(例如,只计算 A 中出现的单词)。