【问题标题】:applying regular expression keeping commas in R在R中应用正则表达式保留逗号
【发布时间】:2019-11-20 16:12:52
【问题描述】:

我想在数据集上使用正则表达式进行文本清理。但是我想保留逗号,因为我需要在基于逗号 (,) 清理文本后分割文本。 问题是我对正则表达式不是很熟悉(我通常使用 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)

预期的输出应该是这样的

  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 个字母的单词,删除任何非字母数字的符号。

提前非常感谢您的帮助!

【问题讨论】:

  • 显示预期输出。
  • @G.Grothendieck 完成了,希望现在更清楚了,事实是,无论我想对正则表达式做什么操作,我都想确保逗号保持原位。
  • 你不能做你已经做的然后用逗号替换空格吗?对我来说似乎是最简单的选择。
  • @HanselPalencia 我不确定我是否理解您的建议。如果我用逗号替换空格,我会用逗号分隔每个单词,我不想要这个。因为我希望一组单词用逗号分隔,因为它们是 noe(即有些单词像“hello”这个词一样单独,而其他单词则不像“wow nice”
  • 有道理,没注意到我的错误

标签: r regex nlp data-cleaning


【解决方案1】:

如何做到这一点?

这是一个四步过程:

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

逻辑

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

查看此正则表达式here

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

它是如何工作的:

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

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

查看此正则表达式here

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

它是如何工作的:

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

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

查看使用中的正则表达式here

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

它是如何工作的:

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

任务 4 - 小写转换

具有以下功能:

tolower(x)

查看使用中的代码here

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多