保留 R 语料库中的 EXACT 单词

Posted

技术标签:

【中文标题】保留 R 语料库中的 EXACT 单词【英文标题】:Keep EXACT words from R corpus 【发布时间】:2017-04-17 12:31:31 【问题描述】:

来自发布的答案:@MrFlick 使用 R 语料库保存文档 ID

我试图稍微修改一个很好的例子。

问题:如何修改 content_transformer 函数以仅保留准确字词?您可以在检查输出中看到,精彩被视为奇迹,比率被视为基本原理。我对gregexprregmatches 的理解不是很深。

创建数据框:

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 阅读器

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

【问题讨论】:

【参考方案1】:

我得到了与@alistaire 相同的结果,并在keepOnlyWords 内容转换器中首先由@BEMR 定义了以下修改行:

gregexpr(paste0("\\b(",  paste(words, collapse = "|"), ")\\b"), x)

在 @BEMR 首次指定的 gregexpr 中有一个错位的 ")",即应该是 ")\\b" 而不是 "\\b)"

我认为上面的gregexpr 相当于@alistaire 指定的:

gregexpr(paste0("(\\b",  paste(words, collapse = "\\b|\\b"), "\\b)"), x)

【讨论】:

【参考方案2】:

将语法切换到tidytext,您当前的转换将是

library(tidyverse)
library(tidytext)
library(stringr)

dd %>% unnest_tokens(word, text) %>% 
    mutate(word = str_replace_all(word, setNames(keep, paste0('.*', keep, '.*')))) %>% 
    inner_join(data_frame(word = keep))

##   id   word
## 1 10 wonder
## 2 10    the
## 3 10   that
## 4 11   that
## 5 12    the
## 6 12    the
## 7 13    the

保持完全匹配更容易,因为您可以使用连接(使用 ==)而不是正则表达式:

dd %>% unnest_tokens(word, text) %>% 
    inner_join(data_frame(word = keep))

##   id word
## 1 10 then
## 2 10 that
## 3 11 that
## 4 13  the

要将其带回文档术语矩阵,

library(tm)

dd %>% mutate(id = factor(id)) %>%    # to keep empty rows of DTM
    unnest_tokens(word, text) %>% 
    inner_join(data_frame(word = keep)) %>% 
    mutate(i = 1) %>% 
    cast_dtm(id, word, i) %>% 
    inspect()

## <<DocumentTermMatrix (documents: 4, terms: 3)>>
## Non-/sparse entries: 4/8
## Sparsity           : 67%
## Maximal term length: 4
## Weighting          : term frequency (tf)
## 
##     Terms
## Docs then that the
##   10    1    1   0
##   11    0    1   0
##   12    0    0   0
##   13    0    0   1

目前,您的函数将words 与之前之后的边界相匹配。要将其更改为 之前和 之后,请将 collapse 参数更改为包含边界:

tm <- VCorpus(DataframeSource(dd), readerControl = list(reader = myReader))

keepOnlyWords<-content_transformer(function(x,words) 
        regmatches(x, 
            gregexpr(paste0("(\\b",  paste(words, collapse = "\\b|\\b"), "\\b)"), x)
        , invert = T) <- " "
        x
    )

tm <- tm_map(tm, content_transformer(tolower))
tm <- tm_map(tm, keepOnlyWords, keep)
tm <- tm_map(tm, stripWhitespace)

inspect(DocumentTermMatrix(tm))

## <<DocumentTermMatrix (documents: 4, terms: 3)>>
## Non-/sparse entries: 4/8
## Sparsity           : 67%
## Maximal term length: 4
## Weighting          : term frequency (tf)
## 
##     Terms
## Docs that the then
##   10    1   0    1
##   11    1   0    0
##   12    0   0    0
##   13    0   1    0

【讨论】:

感谢您的详细解答。效果很好! @alistaire

以上是关于保留 R 语料库中的 EXACT 单词的主要内容,如果未能解决你的问题,请参考以下文章

如何将在线书籍中的单词语料库转换为术语文档矩阵?

根据文本语料库中的出现列出词汇表中的单词,使用 Scikit-Learn CountVectorizer

R Tm包字典匹配导致比文本实际单词更高的频率

从 R 中的许多 html 文件创建语料库

使用 quanteda 在 R 中的大型语料库上计算余弦相似度

计算给定单词在超过 10 亿个单词的文本语料库中出现的次数