我的问题:如何将词袋模型作为特征应用于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)
我认为我弄错了,但我找不到办法,有人可以分享我应该怎么做吗?
谢谢。
答案 0 :(得分:3)
令人担忧的是机器学习问题中的一个基本问题被低估了。那么让我回答一下我自己的问题。
每个单词都分配了一个向量,其中1表示存在,0表示不存在。从本质上讲,这将形成一个稀疏矩阵,加上该类的一列。
使用Python,使用词典代替一袋词。在Python中进行字符串操作要容易得多。将数据输入NLTK或PyOrange。
这里的要点是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包帮助。