R - 如何使用例外拆分文本和标点符号?

时间:2017-08-06 19:21:24

标签: r regex text split gsub

分析R中的Facebook评论以进行感伤分析。表情符号在<>之间的文本中进行编码。符号。

示例:

"Jesus te ama!!! <U+2764>  Ou não...?<U+1F628> (fé em stand by)"

<U+2764><U+1F628>是表情符号(沉重的黑色心脏和可怕的脸, 分别地)。

因此,除了表情符号代码外,我需要拆分字/数字和标点/符号。 我用gsub函数做了这个:

a1  <- "([[:alpha:]])([[:punct:]])"
a2 <- "([[:punct:]])([[:alpha:]])"
b <- "\\1 \\2"
gsub(a1, b, gsub(a2, b, "Jesus te ama!!! <U+2764>  Ou não...?<U+1F628> (fé em stand by)"))

...但是,从逻辑上讲,结果也会影响表情符号代码:

[1] "Jesus te ama !!! < U +2764>  Ou não ...?< U +1F628> ( fé em stand by )"

目标是为&lt;&gt;之间的文本创建一个例外,将其拆分为外部并且不要在内部拆分 - 即:

[1] "Jesus te ama !!! <U+2764>  Ou não ...? <U+1F628> ( fé em stand by )"
  

请注意:

     
    
        
  1. 有时句子/单词/ punct和表情符号代码之间的空格不存在(需要创建)
  2.     
  3. 要求短片序列保持连接(例如&#34; !!!&#34;,&#34; ......?&#34;)
  4.        

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式解决方案:

a1  <- "(?<=<)U\\+\\w+>(*SKIP)(*F)|(?<=\\S)(?=<U\\+\\w+>)|(?<=[[:alpha:]])(?=[[:punct:]])|(?<=[[:punct:]])(?=[[:alpha:]])"
gsub(a1, " ", "Jesus te ama!!! <U+2764>  Ou não...?<U+1F628> (fé em stand by)", perl=TRUE)
# => [1] "Jesus te ama !!! <U+2764>  Ou não ...? <U+1F628> ( fé em stand by )"

请参阅online R demo

此PCRE正则表达式(请参阅perl=TRUE调用中的gsub参数)匹配:

  • (?<=<)U\\+\\w+>(*SKIP)(*F) - 一个U+和1+个字符,如果前面有>,则< - 并且匹配值将被PCRE动词{{1}丢弃并且从本场比赛结束时查找下一场比赛
  • (*SKIP)(*F) - 或
  • | - 非空白字符必须立即出现在当前位置的左侧,并且(?<=\\S)(?=<U\\+\\w+>),1 +字字符和<U+必须立即出现在当前位置的权利
  • > - 或
  • | - 必须在当前位置的左侧立即显示一封信,并且必须在当前位置的右侧立即显示标点符号
  • (?<=[[:alpha:]])(?=[[:punct:]]) - 或
  • | - 必须在当前位置的左侧立即显示标点符号,并且必须在当前位置的右侧立即显示一个字母

答案 1 :(得分:1)

> str <- "Jesus te ama!!! <U+2764>  Ou não...?<U+1F628> (fé em stand by)"
> strsplit(str,"[[:space:]]|(?=[.!?])",perl=TRUE)
[[1]]
 [1] "Jesus"     "te"        "ama"       "!"         "!"         "!"        
 [7] ""          "<U+2764>"  ""          "Ou"        "não"       "."        
[13] "."         "."         "?"         "<U+1F628>" "(fé"       "em"       
[19] "stand"     "by)"