使用 R 和 SVM 进行文本分类。矩阵特征

Text classification with R and SVM. Matrix features

我正在研究文本分类和 SVM。

我的理解是,通常为训练矩阵提取特征的方法本质上是使用“词袋”,我们最终得到的矩阵的列数与文档中不同词的列数一样多并且这些列的值是每个文档每个单词的出现次数(当然每个文档由一行表示)。

为了一切正常,我可以训练我的算法等等,但有时我会收到类似

的错误

Error during wrapup: test data does not match model !

通过深入挖掘,我在这个问题 Error in predict.svm: test data does not match model 中找到了答案,它本质上是说 如果你的模型具有特征 A、B 和 C,那么你的新数据将被分类应包含列 A、B 和 C。当然 对于文本这有点棘手,我要分类的新文档可能包含训练集分类器从未见过的词。

更具体地说,我正在使用内部使用 SparseM 和 tm 库的 RTextTools 库,用于训练 svm 的对象的类型为“matrix.csr”。

不管图书馆的具体情况,我的问题是,在文档分类中是否有任何技术可以确保训练文档和新文档具有不同的词这一事实不会阻止新数据被分类?

UPDATE @lejlot 建议的解决方案在 RTextTools 中实现起来非常简单,只需在使用时使用 originalMatrix 可选参数即可create_matrix 函数。本质上,originalMatrix 应该是使用 create_matrix 函数训练数据时创建的同一个矩阵。因此,在训练完数据并拥有模型后,还要保留原始文档矩阵,在使用新示例时,请确保在为预测集创建新矩阵时使用此类对象。

Regardless of the specifics of the library my question is, is there any technique in document classification to ensure that the fact that training documents and new documents have different words will not prevent new data from being classified?

是的,而且很琐碎。在应用任何训练或分类之前,您创建一个预处理对象,它应该将文本映射到您的矢量表示。特别是 - 它 存储用于训练的整个词汇表 。稍后您在测试文档上重复使用相同的预处理对象,您只需忽略之前存储的词汇表之外的词(OOV 词,因为它们在文献中经常被引用)。

显然还有很多其他 "heuristic" 方法,您不是丢弃而是尝试将它们映射到现有单词(尽管理论上不太合理)。相反 - 你应该创建中间表示,这将是你的新 "preprocessing" 对象,它可以处理 OOV 词(通过一些 levenstein 距离映射等)。