【问题标题】:How to find all words in a string in R?如何在R中查找字符串中的所有单词?
【发布时间】:2016-03-21 22:05:21
【问题描述】:

我想查找字符向量中的所有单词,但我想假设单词也可以用标点符号分隔,而不仅仅是空格。

我总是可以使用s <- strsplit(x, " ")[[1]] 之类的方法来将所有单词用空格分隔,但如果它们被其他标点符号分隔,而用户只是忘记包含空格怎么办?

我相信我需要编写某种正则表达式来只匹配单词,而忽略标点符号。

编辑:

我只是想将我的字符串拆分为单词。如果我有 I,love pizza-because/it tastes.good 之类的东西,我想得到所有单词,意思是 "I", "love", "pizza", "because", "it", "tastes", "good"。正如我告诉你的,如果单词只是用空格分隔,那很容易,但是如果它们用不同的标点符号分隔呢?

我的意思是我总是可以使用str_replace_all(x, "[[:punct:]]", " ")之类的东西,然后用空格分隔它们,但我不想依赖一些外部包,也不想破坏原始字符串形式。

【问题讨论】:

  • 请提供一些示例数据和您期望的解决方案。
  • @JonathanCarroll 请检查编辑。

标签: r


【解决方案1】:

这是:punct: 的选项:

> strsplit("I,love pizza-because/it tastes.good", "[[:punct:] ]")
[[1]]
[1] "I"       "love"    "pizza"   "because" "it"      "tastes"  "good"

【讨论】:

  • 这无法在空格处分割。尝试使用 lorem ipsum 文本。
  • @JonathanCarroll 有效,字符类中包含空格。
  • x <- "Lorem ipsum dolor sit amet, omnes inermis inimicus his an. Impedit phaedrum torquatos vix ea. Pro ex atqui novum sonet, ut odio graece ridens vel. Elitr bonorum in sea." ... strsplit(x, "[[:punct:]]") ... [1] "Lorem ipsum dolor sit amet" " omnes inermis inimicus his an"
  • @JonathanCarroll 您忘记在字符类中包含空格。答案有。
  • @KonradRudolph 啊,我错过了,我想这表明它比 \\W 更不透明。但它在换行符处失败。
【解决方案2】:

您可以将 POSIX 类 [[:punct:]]\\w 用于单词字符。 R 正则表达式页面讨论了字符类。

tst <- "I,love pizza-because/it tastes.good"
regmatches(tst, gregexpr("\\w+", tst))

【讨论】:

    【解决方案3】:

    拆分否定词 (\\W) 应该可以解决问题。

    x <- "Lorem ipsum dolor sit amet, omnes inermis inimicus his an. Impedit
    phaedrum torquatos vix ea. Pro ex atqui novum sonet, ut odio graece ridens
    vel. Elitr bonorum in sea."
    
    strsplit(x, "\\W")
    
    [[1]]
     [1] "Lorem"           "ipsum"           "dolor"           "sit"             "amet"           
     [6] ""                "omnes"           "inermis"         "inimicus"        "his"            
    [11] "an"              ""                "Impedit"         "phaedrum"        "torquatos" 
    
    y <- "I,love pizza-because/it tastes.good"
    
    strsplit(y, "\\W")
    
    [[1]]
    [1] "I"       "love"    "pizza"   "because" "it"      "tastes"  "good"   
    

    【讨论】:

      【解决方案4】:

      使用 \W 表示非单词字符:

      > strsplit("I,love pizza-because/it tastes.good","\\W")
      [[1]]
      [1] "I"       "love"    "pizza"   "because" "it"      "tastes"  "good"   
      
      > strsplit("I,love pizza-because/it,, tastes.good","\\W")
      [[1]]
      [1] "I"       "love"    "pizza"   "because" "it"      ""        ""        "tastes"  "good"   
      
      > strsplit("I,love pizza-because/it,, tastes.good","\\W+")
      [[1]]
      [1] "I"       "love"    "pizza"   "because" "it"      "tastes"  "good"   
      

      【讨论】:

        【解决方案5】:

        另一个选项是来自library(stringi)stri_extract_all。它已被注释,但不是解决方案格式。

        library(stringi)
        stri_extract_all_regex(tst, "\\w+")[[1]]
        #[1] "I"       "love"    "pizza"   "because" "it"      "tastes"  "good"    
        

        或者我们可以使用base R 中的gsub 将所有的标点字符替换为单个分隔符,然后使用scan 字符串。

        scan(text=gsub("[[:punct:]]", ",", tst), what="", 
                         sep=",", quiet=TRUE)
        #[1] "I"          "love pizza" "because"    "it tastes"  "good"   
        

        数据

        tst <- "I,love pizza-because/it tastes.good"
        

        【讨论】:

          猜你喜欢
          • 2012-07-06
          • 1970-01-01
          • 1970-01-01
          • 2016-12-01
          • 1970-01-01
          • 2015-12-05
          • 2019-05-12
          • 2022-01-09
          相关资源
          最近更新 更多