如何从列表中的 R tm_map gsub 中进行大规模 replacement/tokenization?

How to do large-scale replacement/tokenization in R tm_map gsub from a list?

有没有人设法创建大量 find/replace function/working 代码片段来交换数据框中已知的二元语法?

举个例子。我可以使用 onesie-twosie 替换,但我真的想利用一个已知的大约 800 个术语的词典,我想在 DTM 生成之前将它们转换为单词单元。比如我想把"Google Analytics"变成"google-analytics".

我知道这在理论上是可行的;本质上,自定义停用词列表在功能上几乎做同样的事情,只是没有替换。而且只有 800 gsub 似乎很愚蠢。

这是我当前的代码。任何 help/pointers/URLs/RTFMs 将不胜感激。

mystopwords <- read.csv(stopwords.file, header = FALSE)
mystopwords <- as.character(mystopwords$V1)
mystopwords <- c(mystopwords, stopwords())

# load the file

df <- readLines(file.name)

# transform to corpus

doc.vec <- VectorSource(df)
doc.corpus <- Corpus(doc.vec)
# summary(doc.corpus)

## Hit known phrases

docs <- tm_map(doc.corpus, content_transformer(gsub), pattern = "Google Analytics", replacement = "google-analytics")

## Clean up and fix text - note, no stemming

doc.corpus <- tm_map(doc.corpus, content_transformer(tolower))
doc.corpus <- tm_map(doc.corpus, removePunctuation,preserve_intra_word_dashes = TRUE)
doc.corpus <- tm_map(doc.corpus, removeNumbers)
doc.corpus <- tm_map(doc.corpus, removeWords, c(stopwords("english"),mystopwords))
doc.corpus <- tm_map(doc.corpus, stripWhitespace)

语料库 库允许您将多词短语组合成单个标记。当有多个匹配时,它选择最长的一个:

library(corpus)
text_tokens("I live in New York City, New York",
            combine = c("new york city", "new york"))

# [[1]]
# [1] "i"             "live"          "in"            "new_york_city"
# [5] ","             "new_york"

默认情况下,连接符是下划线字符 (_),但您可以使用 connector 参数指定替代连接符。

在您的示例中,您可以执行以下操作来获取逐个文档的矩阵:

mycombine <- c("google analytics", "amazon echo") # etc.
term_matrix(doc.corpus, combine = mycombine,
            drop_punct = TRUE, drop_number = TRUE,
            drop = c(stopwords_en, mystopwords))

另请注意,语料库 保留字内连字符,因此不需要 preserve_intra_word_dashes 选项。

在每个函数调用中指定预处理选项可能很麻烦。如果愿意,您可以将语料库转换为 corpus_frame(带有特殊 text 列的 data.frame ), 然后设置预处理选项(text_filter):

corpus <- as_corpus_frame(doc.corpus)
text_filter(corpus) <- text_filter(combine = mycombine,
                                   drop_punct = TRUE,
                                   drop_number = TRUE,
                                   drop = c(stopwords_en, mystopwords))

之后,您可以调用

term_matrix(corpus)

关于 语料库 的更多信息,包括介绍性插图,位于 http://corpustext.com