матрица терминов документа с использованием списка терминов

Я пытаюсь построить матрицу терминов документа, используя заранее определенные термины. Корпус идентифицируется в переменной cname, а файл с предварительно определенными терминами считывается в переменную terms, которая затем преобразуется в список. Когда я запускаю приведенный ниже код, я получаю пустой DTM. Код, который я использую ниже. Есть идеи о том, что я сделал не так? Спасибо!!!

Том

library(tm) 
library(Rmpfr) 
library(stm)

#Loading Documents
cname <- file.path("", "corpus", "goodsmoklss")
library(tm)
corp <- VCorpus(DirSource(cname))

#Transformations
docs<-tm_map(corp,tolower) #AllLowerCase
docs<-tm_map(corp,removeNumbers) #RemoveNumbers

#Remove Stopwords like is, was, the etc
docs<-tm_map(corp, removeWords, stopwords("english"))

#make Sure it is a PLainTextDocument
documents<-tm_map(docs,PlainTextDocument)


#read in list of preidentified terms
terms=read.delim("C:/corpus/TermList.csv", header=F, stringsAsFactor=F)
tokenizing.phrases <- c(terms)

library("RWeka")

phraseTokenizer <- function(x) {
  require(stringr)

  x <- as.character(x) # extract the plain text from TextDocument object
  x <- str_trim(x)
  if (is.na(x)) return("")

  phrase.hits <- str_detect(x, coll(tokenizing.phrases))


  if (any(phrase.hits)) {
    # only split once on the first hit, so we don't have to worry about    #multiple occurences of the same phrase
    split.phrase <- tokenizing.phrases[which(phrase.hits)[1]] 
    #warning(paste("split phrase:", split.phrase))
    temp <- unlist(str_split(x, coll(split.phrase), 2))
    out <- c(phraseTokenizer(temp[1]), split.phrase, phraseTokenizer(temp[2])) 
  } else {
    #out <- MC_tokenizer(x)
    out <- " "
  }

  # get rid of any extraneous empty strings, which can happen if a phrase occurs just before a punctuation
  out[out != ""]
}

dtm <- DocumentTermMatrix(documents, control = list(tokenize = phraseTokenizer))

person theiman    schedule 07.01.2016    source источник


Ответы (1)


Я не так хорошо знаком с TM, но в пакете quanteda вы можете просто подмножество или фильтрацию. Здесь должен применяться тот же принцип. Я думаю, вы сможете построить ЦММ, а затем просто отфильтровать их на основе вектора интересующих вас терминов. Сначала создайте ЦММ, как указано выше.

v <- ("your","terms","here")
to_filter <- colnames(dtm)

#then you can simply filter based on the vector
dtm2 <- dtm[,to_filter %in% v]

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

person lmkirvan    schedule 08.01.2016
comment
Если не возражаете, примите ответ! Спасибо. И рад помочь. Вам следует проверить пакет quanteda, если вы много занимаетесь НЛП. - person lmkirvan; 14.01.2016