繁体   English   中英

在 R 中应用正则表达式保留逗号

[英]applying regular expression keeping commas in R

我想在数据集上使用正则表达式应用文本清理。 但是我想保留逗号,因为我需要在基于逗号 (,) 清理文本后分割文本。 问题是我对正则表达式不是很熟悉(我通常使用 quanteda 并将单词单独视为 uni-gram,但在这种情况下我不能,因为我需要根据逗号处理每个 X-gram .)

数据集如下所示:

   ID         Key
   1         "Hello, dog_ food, This is it2, water"
   2         "wow! nice, love, yes"
   3         "1997"
   4           
   5         "blabla, 34 l lol, @IceCream, #nice #wow d, seriously Not"
              ....
   .
   .

在我想做的事情中,我想摆脱短于 2 个字母的单词,摆脱任何不是字母数字词干的单字词。

我尝试使用这些命令仅获取低调的字母数字并删除少于 2 个字母的单词,但我最终也取消了逗号,我不知道如何避免它

data$keys <- to_lower(data$keys)
data$keys <- str_replace_all(data$keys, "[^[:alnum:]]", " ")
 data$keys <- gsub(" *\\b[[:alpha:]]{1,2}\\b *", " ", data$keys) # Remove 1-2 letter words
 data$keys <- gsub("^ +| +$|( ) +", "\\1", data$keys)

预期的 output 应该类似于

  ID         Key
   1         "hello, dog food, this, water"
   2         "wow nice, love, yes"
   3         "1997"
   4           
   5         "blabla, lol, icecream, nice wow, seriously not"
              ....
   .
   .
   .

所以基本上,所有内容都是小写的,删除 2 个字母的单词,删除任何不是字母数字的符号。

提前非常感谢您的帮助!

如何做到这一点?

这是一个四步过程:

  1. 删除单词中的特殊字符和数字
  2. 删除 2 个字符或更少的单词。
  3. 清理多余的空间
  4. 转换为小写字符

逻辑

任务 1 - 删除不需要的字符

此处查看此正则表达式

[^a-z\d\s,]+|(?<!\d)\d+(?=[a-z])|(?<=[a-z])\d+(?!\d)

这个怎么运作:

  • 匹配以下选项之一:
    • [^az\d\s,]+匹配集合中不存在的任何字符中的一个或多个:
      • 所以这匹配任何不是az的字符(或AZ因为我们通过将ignore.case=T添加到gsub函数来添加 use i不区分大小写的匹配),不匹配数字字符\d或空格\s ,或逗号,
    • (?<?\d)\d+(?=[az])匹配字母字符之前的任何数字(捕获33wwww3w3w等单词中的数字)
      • (?<!\d)确保前面的不是数字
      • \d+匹配一位或多位数字
      • (?=[az])确保后面是字母字符
    • (?<=[az])\d+匹配字母字符后的任何数字(与之前的交替相反,但在it2之类的单词末尾捕获数字)
      • (?<=[az])确保前面是字母字符
      • \d+匹配一位或多位数字

任务 2 - 删除不需要的单词

此处查看此正则表达式

\b[a-z\d]{1,2}\b

这个怎么运作:

  • \b断言 position 作为单词边界(我们在之前的任务中去掉了_ ,所以没有问题)
  • [az\d]{1,2}匹配一个或两个字母单词和数字(不区分大小写 - 与前面的正则表达式相同)
  • \b将 position 断言为字边界

任务 3 - 删除不需要的空格

请参阅此处使用的正则表达式

(?<= ) +| +(?=,|$)

这个怎么运作:

  • (?<= ) +匹配空格字符后面的一个或多个空格,或
  • +(?=,|$)匹配前面的一个或多个空格,或行尾

任务 4 - 小写转换

有以下 function:

tolower(x)

此处查看正在使用的代码

x <- c(
    "Hello, dog_ food, This is it2, water",
    "wow! nice, love, yes",
    "1997",
    "",
    "blabla, 34 l lol, @IceCream, #nice #wow d, seriously Not"
)
x <- gsub("[^a-z\\d\\s,]+|(?<!\\d)\\d+(?=[a-z])|(?<=[a-z])\\d+", "", x, perl=T, ignore.case=T)
x <- gsub("\\b[a-z\\d]{1,2}\\b", "", x, perl=T, ignore.case=T)
x <- gsub("(?<= ) +| +(?=,|$)", "", x, perl=T)
tolower(x)

输出:

[1] "hello, dog food, this, water"                  
[2] "wow nice, love, yes"                           
[3] "1997"                                          
[4] ""                                              
[5] "blabla, lol, icecream, nice wow, seriously not"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM