2013-03-21 53 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封裝的幫助。