2013-03-21 61 views
0

我的问题:如何才能将bag-of-words模型作为要素输入到R中的svm?我该如何模拟R中的bag-of-words模型以适合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个矩阵(字符,数字)。我想在标题栏中应用“包字”。但是,如果我只是手动拆分任何条目,例如

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

我不明白你在做什么。这真的是你正在使用的数据吗?如果所有标题都以“软件工程师”结尾,那么这些词无论如何都无法用于预测。你所关心的只是前缀 - “初级”,“高级”,或者什么都不是。你能更具体地了解你想要完成的任务吗? – rmalouf 2013-03-21 18:33:32

+0

谢谢rmalouf。在这个特殊情况下,是的,只有“初级”,“校长”很重要,但是我会有更多的职位,比如“硬件工程师”,“iPhone魔术师”等等。重点不是数据,而是我想要建模标题作为一袋文字,但我不太明白这是如何工作在河。 – log0 2013-03-21 22:05:09

回答

3

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

  1. 为每个单词分配一个向量,其中1存在,0不存在。本质上,这将形成一个稀疏矩阵,再加上一个类的列。

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

这里的要点是,R似乎不是一个字符串操作的语言。你可以使用tm库来帮助你。

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

1

这是很容易做到,在R中的TM封装:

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封装的帮助。