使用SVM处理有关文本分类的特征空间差异

时间:2017-02-20 08:49:44

标签: r svm text-classification

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

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

  • 阅读A中的所有文本,使用约1387个术语(包tm)构建DTM(A)
  • 阅读B中的所有文本,使用约626个术语构建DTM(B)
  • 使用SVM(包e1071)
  • 训练分类器与DTM(A)

现在我想使用分类器对DTM(B)中的所有文本进行分类。但 当我尝试使用predict()时,我总是收到错误消息:错误 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列。还是有其他解决方案 我的问题?

亲切的问候

的Björn

2 个答案:

答案 0 :(得分:0)

经过一些实验和一些研究后,我遇到了RTextTools软件包及其功能" create_matrix()"。此功能可创建新的DTM,您还可以将矩阵调整为原始矩阵,该矩阵已用于训练模型。这正是我想要的。所以我查看了原始代码(https://github.com/timjurka/RTextTools/blob/master/RTextTools/R/create_matrix.R)并提出了这个问题:

add_filter( 'request', 'custom_request', 1 );
function custom_request($query) {
    global $wpdb;

    if( substr($_SERVER['SERVER_PROTOCOL'], 0, 5) == "HTTP/" )
        $current_link = "http://";
    else
        $current_link = "https://";
    $current_link .= $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

    $user_page = get_permalink( XXXX );
    $user_id = get_current_user_id();

    if($current_link == $user_page && $user_id !== 0) {
        $custom_user_page_id = get_user_meta($user_id, "user_custom_page", true);
        if(!empty($custom_user_page_id)) {

            $p_g = $_GET;
            $p_ru = $_SERVER['REQUEST_URI'];
            $p_qs = $_SERVER['QUERY_STRING'];


            $_SERVER['REQUEST_URI'] = "/?post_type=page&p=".$custom_user_page_id;
            $_SERVER['QUERY_STRING'] = "post_type=page&p=".$custom_user_page_id;
            $_GET = array(
                'post_type' => 'page',
                'p' => $custom_user_page_id
            );

            remove_filter( 'request', 'custom_request', 1 );
            global $wp;
            $wp->parse_request();
            $query = $wp->query_vars;
            add_filter( 'request', 'custom_request', 1 );

            $_SERVER['REQUEST_URI'] = $p_ru;
            $_SERVER['QUERY_STRING'] = $p_qs;
            $_GET = $p_g;
        }
    }

    return $query;
}

结果是一个测试数据框,其中包含用于训练的数据框的所有特征(列)。所以它基本上是一个"向上过滤"而不是向下过滤。快速测试显示它运作良好(准确度:.91,Kappa:.88)。

答案 1 :(得分:0)

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