Удаление неанглоязычного текста из Корпуса в R с помощью tm()

Я использую tm() и wordcloud() для некоторого базового интеллектуального анализа данных в R, но сталкиваюсь с трудностями, потому что в моем наборе данных есть неанглийские символы (хотя я пытался отфильтровать другие языки на основе фоновых переменных.

Допустим, некоторые строки в моем файле TXT (сохраненном как UTF-8 в TextWrangler) выглядят так:

Special
satisfação
Happy
Sad
Potential für

Затем я прочитал свой текстовый файл в R:

words <- Corpus(DirSource("~/temp", encoding = "UTF-8"),readerControl = list(language = "lat"))

Это дает предупреждающее сообщение:

Warning message:
In readLines(y, encoding = x$Encoding) :
  incomplete final line found on '/temp/file.txt'

Но поскольку это предупреждение, а не ошибка, я продолжаю двигаться вперед.

words <- tm_map(words, stripWhitespace)
words <- tm_map(words, tolower)

Затем это дает ошибку:

Error in FUN(X[[1L]], ...) : invalid input 'satisfa��o' in 'utf8towcs'

Я готов найти способы отфильтровать неанглийские символы либо в TextWrangler, либо в R; то, что наиболее целесообразно. Спасибо за вашу помощь!


r tm
person roody    schedule 09.08.2013    source источник
comment
Если цель состоит в том, чтобы просто удалить эти символы, отличные от ASCII, то это поможет: sapply(words, function(row) iconv(row, "latin1", "ASCII", sub="")) (отсюда). Но это оставит вас с фрагментами слов с отсутствующими символами. Если вы хотите удалить неанглийские слова, вы можете подмножить слова с символами, отличными от ASCII, добавить их в свой список стоп-слов и удалить их по мере удаления стоп-слов.   -  person Ben    schedule 09.08.2013
comment
Я на самом деле видел этот пост, но он открывает дверь для необходимости превратить корпус в другой объект? Выполнение этой команды на корпусе дает: Error in UseMethod("tm_map", x) : no applicable method for 'tm_map' applied to an object of class "c('matrix', 'character')"   -  person roody    schedule 09.08.2013
comment
Вы можете преобразовать вывод sapply обратно в корпус следующим образом: dat1 <- sapply(words, function(row) iconv(row, "latin1", "ASCII", sub="")) затем обратно в корпус: words1 <- Corpus(VectorSource(dat1))   -  person Ben    schedule 09.08.2013
comment
Кроме того, вы сможете исправить свое первое предупреждающее сообщение, открыв текстовый файл в любом текстовом редакторе и добавив несколько пустых строк внизу, а затем сохранив, закрыв и перезагрузив в R.   -  person Ben    schedule 09.08.2013
comment
если вы не найдете здесь ответа, обратитесь к людям на Corpus Лингвистика со списком рассылки R   -  person drammock    schedule 11.08.2013


Ответы (2)


Вот способ удаления слов с символами, отличными от ASCII, перед созданием корпуса:

# remove words with non-ASCII characters
# assuming you read your txt file in as a vector, eg. 
# dat <- readLines('~/temp/dat.txt')
dat <- "Special,  satisfação, Happy, Sad, Potential, für"
# convert string to vector of words
dat2 <- unlist(strsplit(dat, split=", "))
# find indices of words with non-ASCII characters
dat3 <- grep("dat2", iconv(dat2, "latin1", "ASCII", sub="dat2"))
# subset original vector of words to exclude words with non-ASCII char
dat4 <- dat2[-dat3]
# convert vector back to a string
dat5 <- paste(dat4, collapse = ", ")
# make corpus
require(tm)
words1 <- Corpus(VectorSource(dat5))
inspect(words1)

A corpus with 1 text document

The metadata consists of 2 tag-value pairs and a data frame
Available tags are:
  create_date creator 
Available variables in the data frame are:
  MetaID 

[[1]]
Special, Happy, Sad, Potential
person Ben    schedule 09.08.2013

Вы также можете использовать пакет «stringi».

Используя приведенный выше пример:

library(stringi)
dat <- "Special,  satisfação, Happy, Sad, Potential, für"
stringi::stri_trans_general(dat, "latin-ascii")

Выход:

[1] "Special,  satisfacao, Happy, Sad, Potential, fur"  
person Wilfredo    schedule 15.02.2019