2016-03-04 3 views
0

Пакет tm позволяет пользователю «обрезать» слова и знаки препинания в корпусе документов: tm_map (corpusDocs, removeWords, стоп-слова («английский» "))Удаление слов из корпуса документов с учетом списка слов

Есть ли способ предоставить tm_map с учетом списка слов, который считывается из файла csv и используется вместо стоп-слов (« английский »)?

спасибо.

BSL

ответ

1

Позволяет взять файл (wordMappings)

"from"|"to" 
###Words###### 
"this"|"ThIs" 
"is"|"Is" 
"a"|"A" 
"sample"|"SamPle" 

Первый removel слов;

readFile <- function(fileName, seperator) { 
    read.csv(paste0("data\\", fileName, ".txt"), 
          sep=seperator, #"\t", 
          quote = "\"", 
          comment.char = "#", 
          blank.lines.skip = TRUE, 
          stringsAsFactors = FALSE, 
          encoding = "UTF-8") 

} 

kelimeler <- c("this is a sample") 
corpus = Corpus(VectorSource(kelimeler)) 
seperatorOfTokens <- ' ' 
words <- readFile("wordMappings", "|") 

toSpace <- content_transformer(function(x, from) gsub(sprintf("(^|%s)%s(%s%s)", seperatorOfTokens, from,'$|', seperatorOfTokens, ')'), sprintf(" %s%s", ' ', seperatorOfTokens), x)) 
for (word in words$from) { 
    corpus <- tm_map(corpus, toSpace, word) 
} 

Если вы хотите получить более гибкое решение, например, не только удаление также заменяет с тогда;

#Specific Transformations 
toMyToken <- content_transformer(function(x, from, to) 
    gsub(sprintf("(^|%s)%s(%s%s)", seperatorOfTokens, from,'$|', seperatorOfTokens, ')'), sprintf(" %s%s", to, seperatorOfTokens), x)) 

for (i in seq(1:nrow(words))) { 
    print(sprintf("%s -> %s ", words$from[i], words$to[i])) 
    corpus <- tm_map(corpus, toMyToken, words$from[i], words$to[i]) 
} 

Теперь образец пробега;

[1] "this -> ThIs " 
[1] "is -> Is " 
[1] "a -> A " 
[1] "sample -> SamPle " 
> content(corpus[[1]]) 
[1] " ThIs Is A SamPle " 
> 
0

Мое решение, которое может быть громоздким и безвкусный:

#read in items to be removed 
removalList = as.matrix(read.csv(listOfWordsAndPunc, header = FALSE)) 
# 
#create document term matrix 
termListing = colnames(corpusFileDocs_dtm) 
# 
#find intersection of terms in removalList and termListing 
commonWords = intersect(removalList, termListing) 
removalIndxs = match(commonWords, termListing) 
# 
#create m for term frequency, etc. 
m = as.matrix(atsapFileDocs_dtm) 
# 
#use removalIndxs to drop irrelevant columns from m 
allColIndxs = 1 : length(termListing) 
keepColIndxs = setdiff(allColIndxs, removalIndxs) 
m = m[ ,keepColIndxs ] 
# 
#thence to tf-idf analysis with revised m 

Любые стилистические или вычислительные предложения по улучшению благодарно искали.

BSL

Смежные вопросы