使用短语而不是单个单词在R中进行主题建模

时间:2015-02-02 01:59:10

标签: r text-mining corpus

我尝试做一些主题建模但想要使用存在而不是单个单词的短语 即。

library(topicmodels)
library(tm)
my.docs = c('the sky is blue, hot sun', 'flowers,hot sun', 'black cats, bees, rats and mice')
my.corpus = Corpus(VectorSource(my.docs))
my.dtm = DocumentTermMatrix(my.corpus)
inspect(my.dtm)

当我检查我的dtm时,它将所有单词分开,但是我想要所有的短语,即每个应该有一个列: 天是蓝的 烈日 花卉 黑猫 蜜蜂 大鼠和小鼠

如何使文档术语矩阵识别短语和单词?它们是逗号分隔的

解决方案需要高效,因为我想在大量数据上运行它

2 个答案:

答案 0 :(得分:5)

您可以尝试使用自定义标记生成器的方法。您将所需的多字词定义为短语(我不知道执行该步骤的算法代码):

tokenizing.phrases <- c("sky is blue", "hot sun", "black cats")

请注意,没有完成任何干扰,所以如果你想要“黑猫”和“黑猫”,那么你需要输入两种变体。案例被忽略。

然后你需要创建一个函数:

    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 you don't have 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])) 
      } else {
        out <- MC_tokenizer(x)
      }


 out[out != ""]
}

然后您可以正常进行创建术语文档矩阵,但这次您可以通过控制参数在语料库中包含标记化短语。

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

答案 1 :(得分:0)

或许看一下这个相对较新的关于该主题的出版物:

http://web.engr.illinois.edu/~hanj/pdf/kdd13_cwang.pdf

他们提供了一种识别短语和将文档分区/标记为这些短语的算法。