从发布的回答:通过@MrFlick
保留文件ID与R语料库我试图略微修改一个很好的例子。
问题:如何修改 content_transformer
功能以仅保留完全字词?您可以在检查输出中看到精彩被计为奇迹,比率被计为理由。我对gregexpr
和regmatches
没有很强的理解力。
创建数据框:
dd <- data.frame(
id = 10:13,
text = c("No wonderful, then, that ever",
"So that in many cases such a ",
"But there were still other and",
"Not even at the rationale")
, stringsAsFactors = F
)
现在,为了从data.frame中读取特殊属性,我们将使用readTabular
函数制作我们自己的自定义data.frame reader
library(tm)
myReader <- readTabular(mapping = list(content = "text", id = "id"))
指定要用于内容的列和data.frame中的id。现在我们使用DataframeSource
阅读它,但使用我们的自定义阅读器。
tm <- VCorpus(DataframeSource(dd), readerControl = list(reader = myReader))
现在,如果我们只想保留一组单词,我们就可以创建自己的content_transformer函数。一种方法是
keepOnlyWords <- content_transformer(function(x, words) {
regmatches(x,
gregexpr(paste0("\\b(", paste(words, collapse = "|"), "\\b)"), x)
, invert = T) <- " "
x
})
这将用空格替换单词列表中没有的所有内容。请注意,您可能希望在此之后运行stripWhitespace
。因此,我们的转换看起来像
keep <- c("wonder", "then", "that", "the")
tm <- tm_map(tm, content_transformer(tolower))
tm <- tm_map(tm, keepOnlyWords, keep)
tm <- tm_map(tm, stripWhitespace)
检查dtm矩阵:
> inspect(dtm)
<<DocumentTermMatrix (documents: 4, terms: 4)>>
Non-/sparse entries: 7/9
Sparsity : 56%
Maximal term length: 6
Weighting : term frequency (tf)
Terms
Docs ratio that the wonder
10 0 1 1 1
11 0 1 0 0
12 0 0 1 0
13 1 0 1 0
答案 0 :(得分:1)
我和@alistaire的结果与tm相同,而keepOnlyWords内容变换器中的以下修改后的行首先由@BEMR定义:
gregexpr(paste0("\\b(", paste(words, collapse = "|"), ")\\b"), x)
有一个错位的&#34;)&#34;在@BEMR首先指定的gregexpr中,即应该是&#34;)\\ b&#34;不是&#34; \\ b)&#34;
我认为上面的gregexpr等同于@alistaire指定的:
gregexpr(paste0("(\\b", paste(words, collapse = "\\b|\\b"), "\\b)"), x)