如何使用 R 在语料库中搜索特定的 n-gram
How to search for specific n-grams in a corpus using R
我正在语料库中寻找特定的 n-gram。假设我想在文档集合中找到 'asset management' 和 'historical yield'。
这是我加载语料库的方式
my_corpus <- VCorpus(DirSource(directory, pattern = ".pdf"),
readerControl = list(reader = readPDF)
我清理了语料库并使用文档术语矩阵进行了一些基本计算。现在我想寻找特定的表达式并将它们放入数据框中。这是我使用的(感谢 phiver):
ngrams <- c('asset management', 'historical yield')
dtm_ngrams <- DocumentTermMatrix(my_corpus, control = list(dictionary = ngrams))
df_ngrams <- data.frame(Docs = dtm$dimnames$Docs, as.matrix(dtm_ngrams), row.names = NULL )
此代码运行,但两个 n-gram 的结果均为 0。所以,我猜问题是库没有正确定义,因为 R 没有在单词之间选择 space 。到目前为止,我试图在单词之间放置 '' 或 [:space:] 和其他一些解决方案。
未经任何进一步操作的文档术语矩阵仅包含单个单词(以及 nchar 3 或更多的单词)。如果你想有二元组,你需要创建一个二元组(或单元和二元组)的术语矩阵。
根据您的示例并仅使用 tm 和在您调用 tm 时加载的 NLP,我们可以制作一个双字母词标记生成器。或者 multi-gram,见代码注释。
再次使用内置的原始数据集。
library(tm)
data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, content_transformer(tolower))
# This tokenizer is built on NLP and creates bigrams.
# If you want multi-grams specify 1:2 for uni- and bi-gram,
# 2:3 for bi- and trigram, 1:3 for uni-, bi- and tri-grams.
# etc. etc. ...(ngrams(words(x), 1:3)...
bigram_tokenizer <- function(x) {
unlist(lapply(ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE)
}
my_words <- c("crude oil", "west texas")
dtm <- DocumentTermMatrix(crude, control=list(tokenizer = bigram_tokenizer, dictionary = my_words))
inspect(dtm)
<<DocumentTermMatrix (documents: 20, terms: 2)>>
Non-/sparse entries: 11/29
Sparsity : 72%
Maximal term length: 10
Weighting : term frequency (tf)
Sample :
Terms
Docs crude oil west texas
127 2 1
144 0 0
191 2 0
194 1 2
211 0 0
273 2 0
349 1 0
353 1 0
543 1 1
708 1 0
在此之后,您可以按照
中所述再次将 dtm 放入 data.frame
我正在语料库中寻找特定的 n-gram。假设我想在文档集合中找到 'asset management' 和 'historical yield'。
这是我加载语料库的方式
my_corpus <- VCorpus(DirSource(directory, pattern = ".pdf"),
readerControl = list(reader = readPDF)
我清理了语料库并使用文档术语矩阵进行了一些基本计算。现在我想寻找特定的表达式并将它们放入数据框中。这是我使用的(感谢 phiver):
ngrams <- c('asset management', 'historical yield')
dtm_ngrams <- DocumentTermMatrix(my_corpus, control = list(dictionary = ngrams))
df_ngrams <- data.frame(Docs = dtm$dimnames$Docs, as.matrix(dtm_ngrams), row.names = NULL )
此代码运行,但两个 n-gram 的结果均为 0。所以,我猜问题是库没有正确定义,因为 R 没有在单词之间选择 space 。到目前为止,我试图在单词之间放置 '' 或 [:space:] 和其他一些解决方案。
未经任何进一步操作的文档术语矩阵仅包含单个单词(以及 nchar 3 或更多的单词)。如果你想有二元组,你需要创建一个二元组(或单元和二元组)的术语矩阵。
根据您的示例并仅使用 tm 和在您调用 tm 时加载的 NLP,我们可以制作一个双字母词标记生成器。或者 multi-gram,见代码注释。
再次使用内置的原始数据集。
library(tm)
data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, content_transformer(tolower))
# This tokenizer is built on NLP and creates bigrams.
# If you want multi-grams specify 1:2 for uni- and bi-gram,
# 2:3 for bi- and trigram, 1:3 for uni-, bi- and tri-grams.
# etc. etc. ...(ngrams(words(x), 1:3)...
bigram_tokenizer <- function(x) {
unlist(lapply(ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE)
}
my_words <- c("crude oil", "west texas")
dtm <- DocumentTermMatrix(crude, control=list(tokenizer = bigram_tokenizer, dictionary = my_words))
inspect(dtm)
<<DocumentTermMatrix (documents: 20, terms: 2)>>
Non-/sparse entries: 11/29
Sparsity : 72%
Maximal term length: 10
Weighting : term frequency (tf)
Sample :
Terms
Docs crude oil west texas
127 2 1
144 0 0
191 2 0
194 1 2
211 0 0
273 2 0
349 1 0
353 1 0
543 1 1
708 1 0
在此之后,您可以按照