如何在列表中的R tm_map gsub中进行大规模替换/标记化?

时间:2017-08-18 11:27:16

标签: r nlp text-mining tm tidyr

有没有人设法创建一个庞大的查找/替换功能/工作代码片段,在数据帧中交换已知的双字母组合?

这是一个例子。我能够进行单人替换,但我真的想利用我想要找到的大约800个术语的已知词典 - 替换它们在DTM生成之前将它们变成单词单位。例如,我想转向" Google Analytics"进入" google-analytics"。

我知道它在理论上是可能的;实质上,自定义停用词列表在功能上几乎完全相同,除非没有替换。只有800 gsubs似乎很愚蠢。

这是我目前的代码。任何帮助/指针/ URL / RTFM都将不胜感激。

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)

1 个答案:

答案 0 :(得分:1)

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

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),然后设置预处理选项(< EM> 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