R 中的主题建模:基于预定义的术语列表构建主题
Topic modeling in R: Building topics based on a predefined list of terms
我花了几天时间研究 R 中的主题模型,我想知道我是否可以执行以下操作:
我希望 R 能够基于包含特定术语的预定义术语列表构建主题。我已经使用此列表识别文档中的 ngrams (RWeka),并使用以下代码仅计算出现在我的术语列表中的那些术语:
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))
现在我想再次使用这个列表,仅根据我的术语列表中的术语在文档中搜索主题。
示例:
在以下句子中:"The arrangements results in higher team performance and better user satisfaction" 我想在主题中包含复合术语 "team performance" 和 "user satisfaction",而不是处理 "team"、"performance"、"user" 和 "satisfaction" 作为单个术语并在它们之上构建主题。这就是我需要使用预定义列表的原因。
有没有可能在 R 中定义这样的条件?
也许是这样的?
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))
当您 运行 您的主题模型函数时,它应该与您识别为模型一部分的二元组一起工作(尽管根据您识别的内容列表更长)。
我花了几天时间研究 R 中的主题模型,我想知道我是否可以执行以下操作:
我希望 R 能够基于包含特定术语的预定义术语列表构建主题。我已经使用此列表识别文档中的 ngrams (RWeka),并使用以下代码仅计算出现在我的术语列表中的那些术语:
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))
现在我想再次使用这个列表,仅根据我的术语列表中的术语在文档中搜索主题。
示例: 在以下句子中:"The arrangements results in higher team performance and better user satisfaction" 我想在主题中包含复合术语 "team performance" 和 "user satisfaction",而不是处理 "team"、"performance"、"user" 和 "satisfaction" 作为单个术语并在它们之上构建主题。这就是我需要使用预定义列表的原因。
有没有可能在 R 中定义这样的条件?
也许是这样的?
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))
当您 运行 您的主题模型函数时,它应该与您识别为模型一部分的二元组一起工作(尽管根据您识别的内容列表更长)。