2015-07-15 4 views
2

У меня есть проект, требующий от меня поискать годовые отчеты различных компаний и находить в них ключевые фразы. Я преобразовал отчеты в текстовые файлы, создал и очистил корпус. Затем я создал матрицу документов. Функция tm_term_score работает только для отдельных слов, а не для фраз. Можно ли искать корпус для ключевых фраз (не обязательно наиболее часто)?поиск ключевых фраз с использованием пакета tm в r

Например -

Я хочу видеть, сколько раз фраза «цепочки поставок финансов» в каждом документе в корпусе. Однако, когда я запускаю код с помощью tm_term_score - он возвращает, что никакие документы не имели фразу .. Когда они на самом деле это сделали.

Мой прогресс выглядит следующим образом

library(tm) 
library(stringr) 

setwd(‘C:/Users/Desktop/Annual Reports’) 

dest<-“C:/Users/Desktop/Annual Reports” 

a<-Corpus(DirSource(“C:/Users/Desktop/Annual Reports”), readerControl ≈ list (language ≈“lat”)) 

a<-tm_map(a, removeNumbers) 
a<-tm_map(a, removeWords, stopwords(“english”)) 
a<-tm_map(a, removePunctuation) 
a<-tm_map(a, stripWhitespace) 

tokenizing.phrases<-c(“supply growth”,“import revenues”, “financing projects”) 

Я очень слаб и новым для г и не decifier как искать свой корпус для этих ключевых фраз.

ответ

2

Возможно, что-то вроде следующего вам поможет.

Во-первых, создать объект с ключевых фраз, таких как

tokenizing.phrases <- c("general counsel", "chief legal officer", "inside counsel", "in-house counsel", 
         "law department", "law dept", "legal department", "legal function", 
         "law firm", "law firms", "external counsel", "outside counsel", 
         "law suit", "law suits", # can be hyphenated, eg. 
         "accounts payable", "matter management") 

Затем используйте эту функцию (возможно, с ухищрений для ваших нужд).

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

    x <- as.character(x) # extract the plain text from the tm TextDocument object 
    x <- str_trim(x) 
    if (is.na(x)) return("") 
    #warning(paste("doing:", x)) 
    phrase.hits <- str_detect(x, ignore.case(tokenizing.phrases)) 

    if (any(phrase.hits)) { 
    # only split once on the first hit, so not to worry about multiple occurrences of the same phrase 
    split.phrase <- tokenizing.phrases[which(phrase.hits)[1]] 
    # warning(paste("split phrase:", split.phrase)) 
    temp <- unlist(str_split(x, ignore.case(split.phrase), 2)) 
    out <- c(phraseTokenizer(temp[1]), split.phrase, phraseTokenizer(temp[2])) # this is recursive, since f() calls itself 
    } else { 
    out <- MC_tokenizer(x) 
    } 

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

Затем создайте свою матрицу документов терминов с фразами, включенными в нее.

tdm <- TermDocumentMatrix(corpus, control = list(tokenize = phraseTokenizer)) 
+0

Благодарим за отзыв lawyeR. Я все еще изо всех сил пытаюсь выработать ваш ответ. Я редактировал свой вопрос, включая некоторые из ваших предложений, которые я понимаю. Извини за это! Я очень новый, и я ценю вашу помощь. –

+0

Hi lawyeR! Когда я ввожу введенный код, я получаю следующие сообщения об ошибках и предупреждениях. Ошибка в str_detect (x, ignore_case = TRUE (tokenising.phrases)): неиспользуемый аргумент (ignore_case = TRUE (tokenising.phrases) дополнительно: Предупреждающее сообщение: In if (is.na (a)) return (" "): условие имеет длину> 1, и будет использоваться только первый элемент. Как я могу решить эту проблему? Я ценю вашу помощь! –