gpt4 book ai didi

r - 如何编写自定义的removePunctuation()函数以更好地处理Unicode字符?

转载 作者:行者123 更新时间:2023-12-02 04:26:17 26 4
gpt4 key购买 nike

在 tm 文本挖掘 R 包的源代码中,文件 transform.R 中,有 removePunctuation() 函数,当前定义为:

function(x, preserve_intra_word_dashes = FALSE)
{
if (!preserve_intra_word_dashes)
gsub("[[:punct:]]+", "", x)
else {
# Assume there are no ASCII 1 characters.
x <- gsub("(\\w)-(\\w)", "\\1\1\\2", x)
x <- gsub("[[:punct:]]+", "", x)
gsub("\1", "-", x, fixed = TRUE)
}
}

我需要解析和挖掘科学 session 的一些摘要(从他们的网站上以 UTF-8 格式获取)。摘要包含一些需要删除的 unicode 字符,特别是在单词边界处。有常见的 ASCII 标点字符,但也有一些 Unicode 破折号、Unicode 引号、数学符号...

文本中还有URL,还有需要保留词内标点符号的标点符号。 tm 的内置 removePunctuation() 函数太激进了。

所以我需要一个自定义的 removePunctuation() 函数来根据我的要求进行删除。

我的自定义 Unicode 函数现在看起来像这样,但它没有按预期工作。我很少使用 R,因此在 R 中完成工作需要一些时间,即使对于最简单的任务也是如此。

我的功能:

corpus <- tm_map(corpus, rmPunc =  function(x){ 
# lookbehinds
# need to be careful to specify fixed-width conditions
# so that it can be used in lookbehind

x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{5})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{4})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{3})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{2})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>])([[:alnum:]])'," \\2", x, perl=TRUE) ;
# lookaheads (can use variable-width conditions)
x <- gsub('(.*?)(?=[[:alnum:]])([[:punct:]’“”:±]+)$',"\1 ", x, perl=TRUE) ;

# remove all strings that consist *only* of punct chars
gsub('^[[:punct:]’“”:±</>]+$',"", x, perl=TRUE) ;

}

它没有按预期工作。我认为,它根本没有任何作用。标点符号仍在术语文档矩阵内,请参阅:

 head(Terms(tdm), n=30)

[1] "<></>" "---"
[3] "--," ":</>"
[5] ":()" "/)."
[7] "/++" "/++,"
[9] "..," "..."
[11] "...," "..)"
[13] "“”," "(|)"
[15] "(/)" "(.."
[17] "(..," "()=(|=)."
[19] "()," "()."
[21] "(&)" "++,"
[23] "(0°" "0.001),"
[25] "0.003" "=0.005)"
[27] "0.006" "=0.007)"
[29] "000km" "0.01)"
...

所以我的问题是:

  1. 为什么对我的 function(){} 的调用没有达到预期的效果?我的怎么可以功能有待改进吗?
  2. 是 Unicode 正则表达式模式类,例如 ifR 的 perl 兼容正则支持 \P{ASCII}\P{PUNCT}表达式?我认为它们不是(默认情况下)PCRE: :“尽管支持最重要的属性,但仅对\p 的各种 Unicode 属性的支持是不完整的。”

最佳答案

尽管我很喜欢 Susana 的回答,但它破坏了新版本 tm 中的语料库(不再是 PlainTextDocument 并破坏了元)

您将得到一个列表和以下错误:

Error in UseMethod("meta", x) : 
no applicable method for 'meta' applied to an object of class "character"

使用

tm_map(your_corpus, PlainTextDocument)

将返回您的语料库,但 $meta 已损坏(特别是文档 ID 将丢失。

解决方案

使用content_transformer

toSpace <- content_transformer(function(x,pattern)
gsub(pattern," ", x))
your_corpus <- tm_map(your_corpus,toSpace,"„")

来源:使用 R 进行数据科学实践,文本挖掘,Graham.Williams@togaware.com http://onepager.togaware.com/

更新

此函数删除所有非字母数字的内容(即 UTF-8 表情符号等)

removeNonAlnum <- function(x){
gsub("[^[:alnum:]^[:space:]]","",x)
}

关于r - 如何编写自定义的removePunctuation()函数以更好地处理Unicode字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14281282/

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