gpt4 book ai didi

r - 为 Mechanical Turk 清理文本?

转载 作者:行者123 更新时间:2023-12-01 12:52:34 25 4
gpt4 key购买 nike

是否有预先存在的功能来为 Mechanical Turk 清理 data.frame 的字符列?这是它挂断的线路示例:

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 的简单解决方案会失败。我在下面尝试了一种更细微的解决方案,但我对此不是很满意。

最佳答案

尝试回答我自己的问题,希望有人有更好的方法,因为我不相信这会处理所有时髦的文本:

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 )
}

编辑2

认为这应该可行:

iconv(x, to = "latin1", sub="")

感谢@Masoud 的回答:https://stackoverflow.com/a/20250920/636656

关于r - 为 Mechanical Turk 清理文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11345212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com