r - 使用 tm() 挖掘 PDF 中的两个和三个单词短语
问题描述
我正在尝试为特定的两个和三个单词短语挖掘一组 PDF。我知道这个问题是在各种情况下被问到的,并且
该解决方案部分有效。但是,该列表不会返回包含多个单词的字符串。
例如,我已经尝试过这些线程中提供的解决方案here,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)
如您所见,输出返回“contract.prices”而不是“contract price”,所以我正在寻找一个简单的解决方案。文件 127 包含短语“合同价格”,因此该表应至少记录一个实例。
我也很乐意分享我的实际数据,但我不确定如何保存其中的一小部分(它是巨大的)。所以现在我正在使用“原始”数据的替代品。
解决方案
这是一种使用 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")
推荐阅读
- javascript - 数据库更新后动态检查javascript值
- r - R中按月计算的总和
- java - Ansible 检查 Java 并安装(如果尚未在 RHEL 机器上)
- javascript - 有没有办法使用 Jasmine 在 NodeJs 上对 es6 模块进行单元测试?
- python - 注释图中的交叉点坐标(python)
- python - 我的函数没有迭代循环,我找不到问题
- c# - 尝试从 UNC 共享读取文件 - “登录失败:未授予用户在此计算机上请求的登录类型。”
- python - 为python对象分配不同的值
- java - Spring-Boot:附加层寻址配置项
- vue.js - vue.js 根据单选按钮选择显示/隐藏输入字段