如何模拟R中的词袋模型以适应SVM

时间:2013-03-21 12:40:29

标签: r machine-learning

我的问题:如何将词袋模型作为特征应用于R中的svm?

我已经生成了一些低数据:

Title Salary
"Software Engineer" 100000
"Software Engineer" 120000
"Junior Software Engineer" 60000
"Junior Software Engineer" 70000
"Senior Software Engineer" 130000

使用read.table,我可以获得2 * n(字符,数字)的矩阵。我想在Title列中应用“bag of words”。但是,如果我只是手动拆分任何条目,例如

jobs['Title'][1,] <- strsplit(jobs['Title'][1,], ' ')

这给出了:

Title Salary
"Software" 100000
"Software Engineer" 120000
"Junior Software Engineer" 60000
"Junior Software Engineer" 70000
"Senior Software Engineer" 130000

而不是我的期望:

Title Salary
["Software", "Engineer"] 100000
"Software Engineer" 120000
"Junior Software Engineer" 60000
"Junior Software Engineer" 70000
"Senior Software Engineer" 130000

我调用SVM的代码如下所示:

jobs <- read.table("jobs.data", header = TRUE, as.is = TRUE)
index <- 1:nrow(jobs)
testindex <- sample(index, trunc(length(index)/3))
testset <- jobs[testindex,]
trainset <- jobs[-testindex,]
svm.model <- svm(Salary ~ ., data = trainset, cost = 10, gamma = 1)
svm.pred <- predict(svm.model, testset)

我认为我弄错了,但我找不到办法,有人可以分享我应该怎么做吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

令人担忧的是机器学习问题中的一个基本问题被低估了。那么让我回答一下我自己的问题。

  1. 每个单词都分配了一个向量,其中1表示存在,0表示不存在。从本质上讲,这将形成一个稀疏矩阵,加上该类的一列。

  2. 使用Python,使用词典代替一袋词。在Python中进行字符串操作要容易得多。将数据输入NLTK或PyOrange。

  3. 这里的要点是R似乎不是字符串操作的语言。您可以使用tm库来帮助您。

    我希望能帮助任何面临类似问题的人。

答案 1 :(得分:1)

使用tm包在R中很容易做到这一点:

require(Matrix)
require(e1071) 
require(tm)
options(stringsAsFactors = F)

jobs <- data.frame(Title = c("Software Engineer", "Software Engineer", 
                             "Junior Software Engineer", "Junior Software Engineer", 
                             "Senior Software Engineer", "Hardware Engineer"),
                   Salary = c(100000, 120000,
                              60000, 70000,
                              130000, 110000))

# Create the corpus
MyCorpus <- VCorpus(VectorSource(jobs$Title),  readerControl = list(language = "en"))
content(MyCorpus[[1]])

# Some preprocessing
MyCorpus <- tm_map(MyCorpus, content_transformer(tolower))
content(MyCorpus[[1]])

# Create the Document-Term matrix
DTM <- DocumentTermMatrix(MyCorpus, 
                          control = list(bounds = list(global = c(0, Inf)))) 
dim(DTM)
inspect(DTM)

# Create a sparse matrix to put into SVM
sparse_DTM <- sparseMatrix(i = DTM$i, j = DTM$j, x = DTM$v,
                               dims = dim(DTM),
                               dimnames = list(rownames(DTM), colnames(DTM)))

# SVM
svm.model <- svm(sparse_DTM, jobs$Salary, cost = 10, gamma = 1)

我让你处理火车/测试集,并进一步深入tm包帮助。