2015-02-04 96 views
4

的預定義列表上的建築主題,我花了一對夫婦中的R主題模型工作日的,我想知道如果我能做到以下幾點:主題建模:根據條款

我想R根據預定義的術語表建立具有特定術語的主題。我已經與這個名單合作,以確定在文檔中的n-gram(RWeka)和計數只有那些使用下面的代碼發生在我termlist中的術語:

terms=read.delim("TermList.csv", header=F, stringsAsFactor=F) 

biTok=function(x) NGramTokenizer(x, Weka_control(min=1, max=4)) 

tdm=TermDocumentMatrix(data.corpus, control=list(tokenizer=biTok)) 

現在我想再次使用此列表來搜索主題該文件僅基於我的術語表中的條款。

例如: 在下面的句子中:「安排導致更高的團隊表現和更好的用戶滿意度」我希望在主題內有複合詞「團隊表現」和「用戶滿意度」,而不是處理「團隊」 ,「表現」,「用戶」和「滿意度」作爲單一詞彙並構建主題。這就是爲什麼我需要使用我的預定義列表。

有沒有可能在R中定義這樣的條件?

回答

2

也許像這樣?

tokenizing.phrases <- c("team performance", "user satisfaction") # plus your others you have identified 

然後加載此功能:

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 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, ignore.case(split.phrase), 2)) 
    out <- c(phraseTokenizer(temp[1]), split.phrase, phraseTokenizer(temp[2])) 
    } 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 != ""] 
} 

然後與預先定義的tokeninzing.phrases創建術語文檔矩陣:

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

然後,當您運行主題模型的功能,它應該與您已經確定爲模型的一部分的bigrams一起工作(儘管根據您已經識別的是一個更長的列表)。

+0

非常感謝lawyeR爲可重複的代碼。我嘗試使用我的文本語料庫中出現的幾個術語列表來運行代碼,並使用我的語料庫(包含數百個運行文本的元素)創建了tdm,但創建tdm時仍多次出現以下警告消息: In if(is.na(x))return(「」):條件長度> 1且只有第一個元素將被使用。我應該忽略警告消息還是「if」語句?運行主題模型(如Grün和Hornik的論文所述)尚未提供預期結果和我的列表條款。謝謝 – Dobby

+1

if語句是一個檢查,以確保您提供的作爲phraseTokenizer參數的x不爲空。檢查條款時,是否出現新定義的複合詞?噢,如果答案有幫助,請考慮提升它。謝謝 – lawyeR

+0

是的,複合術語現在出現,它的工作原理。除此之外:我用'out < - 「」'替換else語句'out < - MC_tokenizer',得到一個tdm(dtm),它將列表僅限於那些出現在我的預定義術語表中的術語。非常感謝。 – Dobby