【问题标题】:svm implementation using RTextTools使用 RTextTools 实现 svm
【发布时间】:2016-03-29 20:32:38
【问题描述】:

这是我第一次使用 RTextTools。我必须对一组文本文档实施 SVM 分类。我正在关注本教程。

http://journal.r-project.org/archive/2013-1/collingwood-jurka-boydstun-etal.pdf

我正在逐步向您提供我的代码。

首先我读取了我的数据并给出了一个索引文件。索引文件包含所有要分类的文本文档的列表以及它们各自的标签。例如,如果存在属于 X 类型的文件 abc.txt,则索引文件会将其存储为 abc.txt,X 等。

    data = read_data('C:/Users/dell/Dropbox/Bundeli/corpus/wob/sklearn/folder', type=c('folder'), index = 'C:/Users/dell/Dropbox/Bundeli/corpus/wob/sklearn/index.txt')

其次,我创建了一个文档术语矩阵。

    doc_matrix <- create_matrix(data, language="english", removeNumbers=TRUE, stemWords=TRUE, removeSparseTerms=.8)

第三,我创建一个容器来容纳

    container <- create_container(doc_matrix, data$genre, trainSize=1:93, testSize=94:116, virgin=FALSE)

这里,data$genre 是一个标签,其中每个文档都有它的流派标签,它们按照精确的顺序给出,像索引一样对齐。

但是现在,当我尝试使用以下代码在容器上训练 SVM 时,

    SVM <- train_model(container, "SVM")

它给了我这个错误。:-

    Error in svm.default(x = container@training_matrix, y = container@training_codes,  :   x and y don't match. 

当我看到“容器”的结构时,它显示我的训练代码是空的。像这样。

    Slot "training_codes":
    factor(0)
    Levels: 

    Slot "testing_codes":
    factor(0)
    Levels: 

如果您愿意,我可以向您展示对象“容器”的完整结构,但这不应该发生。有人可以请,请帮忙吗?我一直在拼命地寻找答案。会不会是read_data的索引文件有问题,还是data$genre变量有问题?这些是新事物,我可能弄错了。我将不胜感激。

***已解决****

按照@Theja 的建议,检查了str(data)。然后改成如下:

doc_matrix <- create_matrix(data, language="english", removeNumbers=TRUE, stemWords=TRUE, removeSparseTerms=.8)

这也被改变了:

container <- create_container(doc_matrix, data$genre, trainSize=1:93, testSize=94:116, virgin=FALSE)

【问题讨论】:

    标签: r svm


    【解决方案1】:

    您在检查容器结构以调试问题方面走在正确的轨道上。

    也许在创建矩阵步骤中使用 data$text 或类似的东西,因为数据似乎是一个列表,其中流派作为其元素之一(如在创建容器步骤中所见)。

    使用str(data) 检查数据结构并将正确的参数传递给create_matrix()

    【讨论】:

    • 谢谢@Theja。分析结构确实很有帮助。
    • 然而,实际的 SVM 实现会出现另一个问题。它只将整个数据分类为 2 个标签,而不是指定的 3 个标签。我检查了“数据”中每个 $ 变量的结构。一切似乎都井然有序。数据被正确读取,标签也被指定。有人有解决办法吗?
    【解决方案2】:

    即使我遇到了完全相同的问题并像这样解决了它。基本上问题出在

    doc_matrix <- create_matrix(data, language="english", removeNumbers=TRUE, stemWords=TRUE, removeSparseTerms=.8)
    

    这里的数据格式需要一个由向量​​构建的数据框。

    m <- data.frame(v1,v2)
    doc_matrix <- create_matrix(m$v1, language="english", removeNumbers=TRUE,
                               stemWords=TRUE, removeSparseTerms=.998)
    container <- create_container(doc_matrix, m$v2, trainSize=1:2500,
                                 testSize=2501:2676, virgin=FALSE)
    
    SVM <- train_model(container,"SVM")
    SVM_CLASSIFY <- classify_model(container, SVM)
    

    因此,如果您使用它并从向量构建您的 doc_matrix,它将解决问题!

    【讨论】:

    【解决方案3】:

    我今天遇到了同样的问题。就我而言,这是因为标签的长度与文档的长度不匹配。每个文档都需要分配一个类/标签。

    在你的情况下,你应该将你的文本数据和相应的标签作为两个单独的列,比如说

    trainData$data ## contains your text 
    trainData$label ## has your genre
    

    确保, 长度(训练数据$数据)== 长度(训练数据$标签)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 2020-09-26
      • 1970-01-01
      • 2015-12-07
      • 2012-01-31
      • 2023-03-27
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多