2017-02-20 98 views
0

我在R郵件列表上問了這個問題,但我認爲在這裏找到答案和提示更好。處理關於使用SVM進行文本分類的特徵空間差異

我目前正在研究學生論文的文本分類,試圖用 來識別適合某個班級的文本。我使用來自 一學期(A)的文本以及來自另一個學期(B)的 測試分類器的文本。我的工作流程是這樣的:

  • 讀出來自所有文本,建立DTM(A)與約1387項(包TM)
  • 閱讀所有B中的文本,以約626建立DTM(B)條款
  • 列車DTM(A)的分類,使用SVM(包e1071)

現在我想用classifyer所有文本分類的DTM(B)。但 當我嘗試使用predict()時,我總是得到錯誤消息: eval(expr,envir,enclos)中的錯誤:未找到對象'XY'。正如我發現的,這是因爲DTM(A)和DTM(B)具有不同數量的 項,因此不是用於訓練模型的每個術語是在DTM(B)中可用的 。

確定使用兩個不同的特徵空間進行分類是有問題的,但我想爲這個「現實世界問題」尋找解決方案。這個想法是識別一個學生打開的文本是否適合其他文本。所以我天真的想法是用一個學期[DTM(A)]開發一個帶有文本的預測模型,然後使用這個模型來評估另一個學期的新文本[DTM(B)]。由於新文本不在原始DTM中,因此特徵空間不同。到目前爲止,我只找到使用從所有文本創建的DTM的代碼,但這需要創建一個新的DTM(A)`並且每次都重新訓練SVM。

我的問題是:我該怎麼處理這個問題?我是否應該使用DTM(A)和DTM(B)中使用的術語 ,以獲得相同的特徵空間? 這可以通過減少DTM(A)中的項目數或者向DTM(B)添加多個空/ NA列來實現。或者有另一種解決方案 我的問題?

親切的問候

比約恩

+0

我想http://stackoverflow.com/questions/39721737/how-to-handle-errors-in-predict-function-of-r可以幫助你。 – abhiieor

+0

謝謝,但您鏈接到的發佈不是關於不同的特徵空間,這意味着DTM中的不同列,而是關於不同級別的分類變量。 – PsyR

+0

你可以概括。沒有機器學習方法可以處理新的預測因子;當您爲具有新級別的分類變量創建虛擬變量時,基本上會得到這些結果。因此,基本上就像我在答案中所說的那樣,你需要保留一部分變量,這些變量是訓練的一部分,因此也是模型的一部分。根據此列表過濾掉測試/預測數據,然後對受過訓練的對象進行評分。 – abhiieor

回答

0

一些實驗,經過一番研究,我碰到了RTextTools包及其功能「create_matrix()」來了。此功能創建一個新的DTM,並且您還可以將矩陣調整爲用於訓練模型的originalMatrix。這正是我正在尋找的。所以,我看着原代碼(https://github.com/timjurka/RTextTools/blob/master/RTextTools/R/create_matrix.R)以及與此想出了:

# get all the terms which are in the training df, but not in the test df 
terms <- colnames(train.df[,which(!colnames(train.df) %in% colnames(test.df))]) 
# weight is set, this is just in case that weightTfIdf was used, otherwise it should be 0 
weight <- 0.000000001 
# now create a new matrix with the missing terms 
amat <- matrix(weight, nrow = nrow(test.df), ncol = length(terms)) 
colnames(amat) <- terms 
rownames(amat) <- rownames(test.df) 

# create a new test df with the original values plus the new matrix with the missing terms 
test.df.fixed <- cbind(test.df[,which(colnames(test.df) %in% colnames(train.df))],amat) 
test.df.fixed <- test.df.fixed[, sort(colnames(test.df.fixed))] 

結果是有用於訓練的數據幀的所有功能(列)測試數據幀。所以它基本上是一個「向上過濾」而不是向下過濾。快速測試表明它工作得很好(準確度:.91,Kappa:.88)。

0

在現實世界中,您的訓練和測試數據是完全獨立的。這意味着你對測試文件一無所知。考慮到這一點,解決問題的最佳方法是將數據集B的TDM基於數據集A中使用的詞彙表(例如,只計算出現在A中的詞)。