使用 tm() 挖掘 PDF 中的两个和三个单词短语
Using tm() to mine PDFs for two and three word phrases
我正在尝试为特定 两个和三个单词短语挖掘一组 PDF。
我知道这个问题在各种情况下都被问过
这个 部分有效。但是,该列表不包含 return 个包含多个单词的字符串。
例如,我尝试了这些线程 , here 中提供的解决方案(以及许多其他线程)。不幸的是没有任何效果。
此外,qdap 库不会加载,我浪费了一个小时试图解决该问题,所以 也不会工作,尽管它看起来相当容易。
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)
如您所见,输出 returns "contract.prices" 而不是 "contract prices" 所以我正在寻找一个简单的解决方案。文件 127 包含短语 'contract prices',因此 table 应该至少记录一个这样的实例。
我也很乐意分享我的实际数据,但我不确定如何保存其中的一小部分(它是巨大的)。
所以现在我正在使用 'crude' 数据的替代品。
这是一种将 tm 包与 RWeka 结合使用来获得所需内容的方法。您需要创建一个单独的分词器函数,并将其插入到 DocumentTermMatrix
函数中。为此,RWeka 与 tm
配合得很好。
如果您由于 java 依赖关系不想安装 RWeka,您可以使用任何其他软件包,如 tidytext 或 quanteda。如果由于数据大小而需要速度,我建议使用 quanteda 包(tm 代码下方的示例)。 Quanteda 并行运行,您可以使用 quanteda_options
指定要使用的内核数(默认为 2 个内核)。
注:
请注意,您字典中的一元字母和二元字母重叠。在使用的示例中,您将看到文本 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)
对于速度,如果你有一个大语料库 quanteda 可能会更好:
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")
如果您首先将多词模式包装在 phrase()
函数中,则可以在 quanteda 中使用一系列标记。
library("quanteda")
#> Package version: 1.5.1
data("crude", package = "tm")
data_corpus_crude <- corpus(crude)
my_words <- c("diamond", "contract prices", "diamond shamrock")
例如,您可以使用 kwic()
提取这些内容。
kwic(data_corpus_crude, pattern = phrase(my_words))
#>
#> [127, 1:1] | Diamond |
#> [127, 1:2] | Diamond Shamrock |
#> [127, 12:13] today it had cut its | contract prices |
#> [127, 71:71] a company spokeswoman said. | Diamond |
#>
#> Shamrock Corp said that effective
#> Corp said that effective today
#> for crude oil by 1.50
#> is the latest in a
或者,要使它们永久成为 "compounded" 代币,请使用 tokens_compound()
(此处以简单示例显示)。
tokens("The diamond mining company is called Diamond Shamrock.") %>%
tokens_compound(pattern = phrase(my_words))
#> tokens from 1 document.
#> text1 :
#> [1] "The" "diamond" "mining"
#> [4] "company" "is" "called"
#> [7] "Diamond_Shamrock" "."
我正在尝试为特定 两个和三个单词短语挖掘一组 PDF。 我知道这个问题在各种情况下都被问过
这个
例如,我尝试了这些线程
此外,qdap 库不会加载,我浪费了一个小时试图解决该问题,所以
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)
如您所见,输出 returns "contract.prices" 而不是 "contract prices" 所以我正在寻找一个简单的解决方案。文件 127 包含短语 'contract prices',因此 table 应该至少记录一个这样的实例。
我也很乐意分享我的实际数据,但我不确定如何保存其中的一小部分(它是巨大的)。 所以现在我正在使用 'crude' 数据的替代品。
这是一种将 tm 包与 RWeka 结合使用来获得所需内容的方法。您需要创建一个单独的分词器函数,并将其插入到 DocumentTermMatrix
函数中。为此,RWeka 与 tm
配合得很好。
如果您由于 java 依赖关系不想安装 RWeka,您可以使用任何其他软件包,如 tidytext 或 quanteda。如果由于数据大小而需要速度,我建议使用 quanteda 包(tm 代码下方的示例)。 Quanteda 并行运行,您可以使用 quanteda_options
指定要使用的内核数(默认为 2 个内核)。
注:
请注意,您字典中的一元字母和二元字母重叠。在使用的示例中,您将看到文本 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)
对于速度,如果你有一个大语料库 quanteda 可能会更好:
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")
如果您首先将多词模式包装在 phrase()
函数中,则可以在 quanteda 中使用一系列标记。
library("quanteda")
#> Package version: 1.5.1
data("crude", package = "tm")
data_corpus_crude <- corpus(crude)
my_words <- c("diamond", "contract prices", "diamond shamrock")
例如,您可以使用 kwic()
提取这些内容。
kwic(data_corpus_crude, pattern = phrase(my_words))
#>
#> [127, 1:1] | Diamond |
#> [127, 1:2] | Diamond Shamrock |
#> [127, 12:13] today it had cut its | contract prices |
#> [127, 71:71] a company spokeswoman said. | Diamond |
#>
#> Shamrock Corp said that effective
#> Corp said that effective today
#> for crude oil by 1.50
#> is the latest in a
或者,要使它们永久成为 "compounded" 代币,请使用 tokens_compound()
(此处以简单示例显示)。
tokens("The diamond mining company is called Diamond Shamrock.") %>%
tokens_compound(pattern = phrase(my_words))
#> tokens from 1 document.
#> text1 :
#> [1] "The" "diamond" "mining"
#> [4] "company" "is" "called"
#> [7] "Diamond_Shamrock" "."