2016-06-30 125 views
1

在文本挖掘練習中,考慮使用R {tm}來考慮以下MWE: 豐田在美國有幾款SUV車型。 models<-c("highlander","land cruiser","rav4","sequoia","4runner")。一般媒體稱這些不是「豐田rav4」(語料庫已經轉變爲小寫),而是「rav4」。爲了在DocumentTermMatrix中獲得一列豐田suvs,我需要將所有這些品牌轉換爲一個通用的「toyota_suv」。我現在正在做的是重複mycorpus<-tm_map(mycorpus, gsub, pattern="rav4", replacement="toyota_suv")的長度(模型)。黑客將設置model_names<-rep("toyota_suv",length(models))並繼續生活。如何創建一個包含多對一映射的字典,以便在一個表達式中將所有models替換爲'toyota_suv'?非常感謝。R詞典:創建多對一映射

回答

4

您可以使用矢量化替代函數。 stringi包與stri_replace_all功能家族提供了這樣的功能。在這裏,我使用stri_replace_all_fixed,但需要時調整大小寫和其他選項。

library(tm) 
library(stringi) 

toyota_suvs <- c("highlander","land cruiser","rav4","sequoia","4runner") 

tm_map(toyCorp, stri_replace_all_fixed, 
    pattern = toyota_suvs, replacement = "toyota_suv", 
    vectorize_all = FALSE) 

數據:

toyExample <- c("you don't know about the rav4, John Snow", 
    "the highlander is a great car", 
    "I want a land cruiser") 

toyCorp <- Corpus(VectorSource(toyExample)) 
+0

感謝。沒有打開另一個問題,這與字典映射在時間上的比較如何? – Pradeep

+0

@Pradeep我不知道。我認爲你需要做更多的工作來提供一套示例文檔,以及你想要獲得什麼類型的輸出。如果你想自己改變輸入文檔(在語料庫創建之前),直接使用'stringi'將很難被擊敗:'stri_replace_all_fixed(toyExample,pattern = toyota_suvs,replacement =「toyota_suv」,vectorize_all = FALSE)'。將其饋送到'tm_map'會顯着減慢速度。 – Jota

+0

如果時間是一個重要的考慮因素,我會放棄'tm'包。你也許可以嘗試'quanteda',它有一個字典方法,但是,我還沒有能夠直接使用像「陸地巡洋艦」這樣的多詞。所以,需要一些額外的處理。 – Jota