R - 比较两个语料库以创建一个新语料库,其中包含语料库 #1 中出现频率较高的单词

标签 r corpus text-analysis word-cloud term-document-matrix

我有两个包含相似单词的语料库。足够相似,使用 setdiff 并不能真正帮助我的事业。因此,我转向寻找一种方法来提取语料库中更频繁出现的单词的列表或语料库(最终制作词云)(假设类似的东西有一个阈值 - 所以可能会出现 50% 的频繁出现?)# 1,与语料库 #2 相比。

这就是我现在拥有的一切:

> install.packages("tm")
> install.packages("SnowballC")
> install.packages("wordcloud")
> install.packages("RColorBrewer")
> library(tm)
> library(SnowballC)
> library(wordcloud)
> library(RColorBrewer)

> UKDraft = read.csv("UKDraftScouting.csv", stringsAsFactors=FALSE)
> corpus = Corpus(VectorSource(UKDraft$Report))
> corpus = tm_map(corpus, tolower)
> corpus = tm_map(corpus, PlainTextDocument)
> corpus = tm_map(corpus, removePunctuation)
> corpus = tm_map(corpus, removeWords, c("strengths", "weaknesses", "notes",  "kentucky", "wildcats", stopwords("english")))
> frequencies = DocumentTermMatrix(corpus)
> allReports = as.data.frame(as.matrix(frequencies))

> SECDraft = read.csv("SECMinusUKDraftScouting.csv", stringsAsFactors=FALSE)
> SECcorpus = Corpus(VectorSource(SECDraft$Report))
> SECcorpus = tm_map(SECcorpus, tolower)
> SECcorpus = tm_map(SECcorpus, PlainTextDocument)
> SECcorpus = tm_map(SECcorpus, removePunctuation)
> SECcorpus = tm_map(SECcorpus, removeWords, c("strengths", "weaknesses", "notes", stopwords("english")))
> SECfrequencies = DocumentTermMatrix(SECcorpus)
> SECallReports = as.data.frame(as.matrix(SECfrequencies))

因此,如果单词“wingspan”在 corpus#2(“SECcorpus”)中的计数频率为 100,但在 corpus#1(“corpus”)中的计数频率为 150,我们希望该单词出现在生成的语料库/列表中。

最佳答案

我可以建议一种可能更直接的方法,该方法基于我与 Paul Nulty 开发的新文本分析包。它称为 Quanteda,可在 CRAN 和 GitHub 上使用。 .

我无权访问您的文本,但这将以类似的方式用于您的示例。您创建两组文档的语料库,然后添加文档变量(使用 docvars ),然后在新文档分区变量上创建文档特征矩阵分组。其余的操作就很简单了,看下面的代码。请注意,默认情况下,dfm 对象是稀疏矩阵,但尚未实现功能子集化(下一个版本!)。

install.packages(quanteda)
library(quanteda)

# built-in character vector of 57 inaugural addreses
str(inaugTexts)

# create a corpus, with a partition variable to represent
# the two sets of texts you want to compare
inaugCorp <- corpus(inaugTexts, 
                    docvars = data.frame(docset = c(rep(1, 29), rep(2, 28))),
                    notes = "Example made for stackoverflow")
# summarize the corpus
summary(inaugCorp, 5)

# toLower, removePunct are on by default
inaugDfm <- dfm(inaugCorp, 
                groups = "docset", # by docset instead of document
                ignoredFeatures = c("strengths", "weaknesses", "notes", stopwords("english"))),
                matrixType = "dense")

# now compare frequencies and trim based on ratio threshold
ratioThreshold <- 1.5
featureRatio <- inaugDfm[2, ] / inaugDfm[1, ]
# to select where set 2 feature frequency is 1.5x set 1 feature frequency
inaugDfmReduced <- inaugDfm[2, featureRatio >= ratioThreshold]

# plot the wordcloud
plot(inaugDfmReduced)

我建议您将一些选项传递给 wordcloud() (plot.dfm() 使用的内容),也许是为了限制要绘制的最小特征数量.

非常乐意帮助您解决有关使用 quanteda 软件包的任何疑问。

这里直接解决您的问题。我没有你的文件,所以无法验证它是否有效。此外,如果您的 R 技能有限,您可能会发现这很难理解;如果您还没有查看过 quanteda 的任何(遗憾的是目前有限)文档,则同上。

我认为您需要的(根据您的评论/查询)如下:

# read in each corpus separately, directly into quanteda
mycorpus1 <- corpus(textfile("UKDraftScouting.csv", textField = "Report"))
mycorpus2 <- corpus(textfile("SECMinusUKDraftScouting.csv", textField = "Report"))
# assign docset variables to each corpus as appropriate 
docvars(mycorpus1, "docset") <- 1 
docvars(mycorpus2, "docset") <- 2
myCombinedCorpus <- mycorpus1 + mycorpus2

然后继续执行上面的 dfm 步骤,用 myCombinedCorpus 替换 inaugTexts

关于R - 比较两个语料库以创建一个新语料库,其中包含语料库 #1 中出现频率较高的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30537853/

相关文章:

r - length可以识别条件吗?

nlp - 虚假评论数据集

r - 语料库参数上的 DocumentTermMatrix 错误

c - 统计文本分析、语言建模和信息检索程序 - Rainbow

r - Quanteda 包,朴素贝叶斯 : How can I predict on different-featured test data?

r - 从大数据坐标集中获取时区的最快方法(一百万个坐标或更多)

r - 将字符串中的逗号分隔数字转换为数值向量

R 的 tm 字数统计包

algorithm - 向用户建议标签列表的算法

r - 以自定义分布为条件模拟向量