使用tm()挖掘两个和三个单词短语的PDF

问题描述 投票:1回答:1

我正在尝试为特定两个和三个单词短语挖掘一组PDF。我知道这个问题是在各种情况下提出的,

solution部分起作用。但是,该列表不返回包含多个单词的字符串。

例如,我尝试了这些线程herehere中提供的解决方案(以及许多其他解决方案)。不幸的是,没有任何效果。

而且,qdap库将无法加载,我浪费了一个小时来尝试解决该问题,因此,即使看上去相当容易,this solution也不会起作用。

library(tm)

data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, content_transformer(tolower))

my_words <- c("contract", "prices", "contract prices", "diamond", "shamrock", "diamond shamrock")

dtm <- DocumentTermMatrix(crude, control=list(dictionary = my_words))

# create data.frame from documenttermmatrix
df1 <- data.frame(docs = dtm$dimnames$Docs, as.matrix(dtm), row.names = NULL)
head(df1)

如您所见,输出返回“ contract.prices”而不是“ contract price”,因此我正在寻找一种简单的解决方案。文件127包含短语“合同价格”,因此该表应至少记录一个实例。

我也很乐意分享我的实际数据,但是我不确定如何保存其中的一小部分(这是巨大的)。因此,现在我使用的是“粗略”数据的替代品。

r pdf text text-mining tm
1个回答
0
投票

这里是将tm软件包与RWeka一起使用来获得所需内容的方法。您需要创建一个单独的令牌生成器函数,然后将其插入DocumentTermMatrix函数。为此,RWeka与tm的搭配非常好。

如果由于Java依赖关系而不想安装RWeka,则可以使用tidytext或quanteda之类的任何其他软件包。如果由于数据量而需要速度,我建议使用Quanteda软件包(例如tm代码下方的示例)。 Quanteda并行运行,并且可以使用quanteda_options指定要使用的内核数(默认为2个内核)。

注:

[请注意,字典中的unigram和bigrams重叠。在所使用的示例中,您将看到在文本127中,“价格”(3)和“合同价格”(1)将对价格进行重复计算。

library(tm)
library(RWeka)

data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, content_transformer(tolower))

my_words <- c("contract", "prices", "contract prices", "diamond", "shamrock", "diamond shamrock")


# adjust to min = 2 and max = 3 for 2 and 3 word ngrams
RWeka_tokenizer <- function(x) {
  NGramTokenizer(x, Weka_control(min = 1, max = 2)) 
}

dtm <- DocumentTermMatrix(crude, control=list(tokenize = RWeka_tokenizer,
                                              dictionary = my_words))

# create data.frame from documenttermmatrix
df1 <- data.frame(docs = dtm$dimnames$Docs, as.matrix(dtm), row.names = NULL, check.names = FALSE)

对于速度,如果您的语料库很大,可能会更好:

library(quanteda)

corp_crude <- corpus(crude)
# adjust ngrams to 2:3 for 2 and 3 word ngrams
toks_crude <- tokens(corp_crude, ngrams = 1:2, concatenator = " ")
toks_crude <- tokens_keep(toks_crude, pattern = dictionary(list(words = my_words)), valuetype = "fixed")
dfm_crude <- dfm(toks_crude)
df1 <- convert(dfm_crude, to = "data.frame")
© www.soinside.com 2019 - 2024. All rights reserved.