【问题标题】:R - How to split text and punctuation with a exception?R - 如何拆分文本和标点符号?
【发布时间】:2017-08-06 19:21:24
【问题描述】:

在 R 中分析 Facebook cmets 以进行情感分析。表情符号在 符号之间的文本中编码。

例子:

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

&lt;U+2764&gt;&lt;U+1F628&gt; 是表情符号(沉重的黑心和恐惧的脸, 分别)。

所以,我需要拆分单词/数字和标点符号/符号,但表情符号代码除外。 我做到了,使用 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 )"

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

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

注意:

  1. 有时句子/单词/标点符号和表情符号代码之间的空格不存在(需要创建)
  2. 要求 punct 序列保持连接(例如“!!!”、“...?”)

我该怎么做?

【问题讨论】:

  • 前段时间我也遇到过同样的问题,虽然我丢弃了大多数表情符号,但只留下了六个左右,这些表情符号特别常见且与我的特定情绪分析相关。因此,我将相关的 unicode 替换为一致的字符串(即 gsub("U+1F642|U+263A","emoji_happy_faces", df$comment) ,然后我才使用 tm 包删除标点符号。希望它有所帮助。(全部emoji unidoes 可以在这里找到:unicode.org/emoji/charts/full-emoji-list.html)

标签: r regex text split gsub


【解决方案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 正则表达式(请参阅对 gsub 的调用中的 perl=TRUE 参数)匹配:

  • (?&lt;=&lt;)U\\+\\w+&gt;(*SKIP)(*F) - 一个 U+ 和 1+ 个带有 &gt; 的单词字符,如果前面有 &lt; - 并且匹配值与 PCRE 动词 (*SKIP)(*F) 一起被丢弃,并从结尾处查找下一个匹配项匹配
  • | - 或
  • (?&lt;=\\S)(?=&lt;U\\+\\w+&gt;) - 非空白字符必须紧邻当前位置的左侧,&lt;U+、1+ 字字符和 &gt; 必须紧邻当前位置的右侧出现
  • | - 或
  • (?&lt;=[[:alpha:]])(?=[[:punct:]]) - 字母必须紧邻当前位置的左侧,标点符号必须紧邻当前位置的右侧
  • | - 或
  • (?&lt;=[[:punct:]])(?=[[:alpha:]]) - 标点符号必须紧邻当前位置的左侧,字母必须紧邻当前位置的右侧

【讨论】:

  • (?&lt;=&lt;)U\\+\\w+&gt;(*SKIP)(*F)| 部分允许跳过&lt;U+...&gt; 中的替换,(?&lt;=\\S)(?=&lt;U\\+\\w+&gt;) 部分允许在句子/单词/标点符号和表情符号代码之间插入空格。
【解决方案2】:
> 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)"      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多