tm_map(gsub) не может заменить слова

# Loading required libraries


# Set up logistics such as reading in data and setting up corpus

```{r}

# Relative path points to the local folder
folder.path="../data/InauguralSpeeches/"

# get the list of file names
speeches=list.files(path = folder.path, pattern = "*.txt")

# Truncate file names so it is only showing "FirstLast-Term"
prez.out=substr(speeches, 6, nchar(speeches)-4)

# Create a vector NA's equal to the length of the number of speeches
length.speeches=rep(NA, length(speeches))

# Create a corpus
ff.all<-Corpus(DirSource(folder.path))
```

# Clean the data

```{r}

# Use tm_map to strip all white spaces to a single space, to lower case case, remove stop words, empty strings and punctuation.
ff.all<-tm_map(ff.all, stripWhitespace)
ff.all<-tm_map(ff.all, content_transformer(tolower))
ff.all<-tm_map(ff.all, removeWords, stopwords("english"))
ff.all<-tm_map(ff.all, removeWords, c("can", "may", "upon", "shall", "will",     "must", ""))

Проблемная линия

ff.all‹-tm_map(ff.all, gsub, шаблон = "бесплатно", замена = "свобода")

ff.all<-tm_map(ff.all, removeWords, character(0))
ff.all<-tm_map(ff.all, removePunctuation)

# tdm.all =  a Term Document Matrix
tdm.all<-TermDocumentMatrix(ff.all)

Поэтому я пытаюсь заменить слова, похожие на одно корневое слово. Например, замена «бесплатно» на «свобода» в проекте анализа текста.

Затем я узнал эту строку из учебника на Youtube: ff.all‹-tm_map(ff.all, gsub, pattern = "free", replace = "freedom"). Без этой строки код работает.

После добавления этой строки R Studio выдает ошибку «Ошибка: inherits(doc, «TextDocument») is not TRUE» при выполнении этой строки: «tdm.all‹-TermDocumentMatrix( и далее все)"

Я думаю, что это должна быть относительно простая проблема, однако я не смог найти решение в stackoverflow.


person user101998    schedule 29.01.2017    source источник


Ответы (1)


Используя встроенные данные crude tm, я смог решить вашу проблему, заключив gsub в вызов content_transformer вот так.

ff.all<-tm_map(ff.all, content_transformer(function(x) gsub(x, pattern = "free", replacement = "freedom")))

По моему опыту, tm_map делает странные вещи с возвращаемым объектом для пользовательских функций. Таким образом, хотя ваша исходная строка работала, tm_map не совсем возвращает истинный «Корпус», что и вызывает ошибки.

В качестве примечания:

Эта строка, кажется, ничего не делает ff.all‹-tm_map(ff.all, removeWords, character(0))

То же самое с "" в ff.all‹-tm_map(ff.all, removeWords, c("может", "может", "на", "должен", "будет", "должен", ""))

Мой полный пример

library(tm)
data(crude)
ff.all <- crude

ff.all<-tm_map(ff.all, stripWhitespace)
ff.all<-tm_map(ff.all, content_transformer(tolower))
ff.all<-tm_map(ff.all, removeWords, stopwords("english"))
ff.all<-tm_map(ff.all, removeWords, c("can", "may", "upon", "shall", "will",     "must", ""))

ff.all<-tm_map(ff.all, content_transformer(function(x) gsub(x, pattern = "free", replacement = "freedom")))

ff.all<-tm_map(ff.all, removeWords, character(0))
ff.all<-tm_map(ff.all, removePunctuation)

# tdm.all =  a Term Document Matrix
tdm.all<-TermDocumentMatrix(ff.all)
person emilliman5    schedule 30.01.2017
comment
Большое спасибо. Это было спасением. И да, удаление символа (0) излишне. - person user101998; 30.01.2017