Санировать текст для Mechanical Turk?
Существует ли ранее существующая функция для очистки символьных столбцов data.frame для Mechanical Turk? Вот пример строки, на которой она зацикливается:
x <- "Duke\U3e32393cs B or C, no concomittant malignancy, ulcerative colitis, Crohn\U3e32393cs disease, renal, heart or liver failure"
Я предполагаю, что это символы Unicode, но MT не позволяет мне продолжать их там. Я, очевидно, могу довольно легко их откорректировать, но я использую MT довольно неплохо и надеялся на более общее решение для удаления всех не-ascii символов.
редактировать
Я могу удалить кодировку следующим образом:
> iconv(x,from="UTF-8",to="latin1",sub=".")
[1] "Duke......s B or C, no concomittant malignancy, ulcerative colitis, Crohn......s disease, renal, heart or liver failure"
Но это все еще оставляет мне нехватку более общего решения для векторов, которые используют не-utf8 кодировки для любого элемента.
> dput(vec)
c("Colorectal cancer patients Duke\U3e32393cs B or C, no concomittant malignancy, ulcerative colitis, Crohn\U3e32393cs disease, renal, heart or liver failure",
"Patients with Parkinson\U3e32393cs Disease not already on levodopa",
"hi")
Обратите внимание, что обычный текст кодируется как "неизвестный", который не имеет преобразования в "latin1", поэтому простые решения, использующие iconv, терпят неудачу. У меня есть одна попытка более детального решения ниже, но я не очень доволен этим.
1 ответ
Попробую ответить на мой собственный вопрос, и, надеюсь, у кого-то есть лучший способ, потому что я не уверен, что он справится со всем напуганным текстом:
sanitize.text <- function(x) {
stopifnot(is.character(x))
sanitize.each.element <- function(elem) {
ifelse(
Encoding(elem)=="unknown",
elem,
iconv(elem,from=as.character(Encoding(elem)),to="latin1",sub="")
)
}
x <- sapply(x, sanitize.each.element)
names(x) <- NULL
x
}
> sanitize.text(vec)
[1] "Colorectal cancer patients Dukes B or C, no concomittant malignancy, ulcerative colitis, Crohns disease, renal, heart or liver failure"
[2] "Patients with Parkinsons Disease not already on levodopa"
[3] "hi"
И функция для обработки других особенностей импорта MT:
library(taRifx)
write.sanitized.csv <- function( x, file="", ... ) {
sanitize.text <- function(x) {
stopifnot(is.character(x))
sanitize.each.element <- function(elem) {
ifelse(
Encoding(elem)=="unknown",
elem,
iconv(elem,from=as.character(Encoding(elem)),to="latin1",sub="")
)
}
x <- sapply(x, sanitize.each.element)
names(x) <- NULL
x
}
x <- japply( df=x, sel=sapply(x,is.character), FUN=sanitize.text)
colnames(x) <- gsub("[^a-zA-Z0-9_]", "_", colnames(x) )
write.csv( x, file, row.names=FALSE, ... )
}
редактировать
Из-за отсутствия лучшего места для размещения этого кода вы можете выяснить, какой элемент символьного вектора вызывает проблемы, которые даже вышеуказанная функция не исправит, например:
#' Function to locate a non-ASCII character
#' @param txt A character vector
#' @return A logical of length length(txt)
locateBadString <- function(txt) {
vapply(txt, function(x) {
class( try( substr( x, 1, nchar(x) ) ) )!="try-error"
}, TRUE )
}
Edit2
Я думаю, что это должно работать:
iconv(x, to = "latin1", sub="")
Благодаря @Masoud в этом ответе: /questions/14345428/analiz-dannyih-v-tvittere-oshibka-v-matritse-srochnyih-dokumentov/14345431#14345431