Поиск строки (содержащий специальный символ) с% в% не работает, пока работает str_detect - PullRequest
0 голосов
/ 28 сентября 2018

Я занимаюсь анализом настроений и хотел бы, чтобы все биграммы начинались со слова отрицания, такого как «не».Использование %in% прекрасно работает с простой строкой, но для тех, которые содержат специальный символ, такой как апостроф, оно не работает для моего текста.

Биграммы из текста:

> head(sup4_bigrams_count,3)
# A tibble: 3 x 3
  word1      word2      n
  <chr>      <chr>  <int>
1 parent’s   day        8
2 mother’s   day        7
3 bachelor’s degree     6

> sup4_bigrams_count$word1 %>% unique  
 ......
 [61] "daily"          "day"            "de"             "define"        
 [65] "depth"          "developed"      "didn’t"         "differentiated"
 [69] "difunctioning"  "diploma"        "doesn’t"        "don’t" 

Яинтерес к биграммам, начинающимся с «не», «не» и «не».Но обратите внимание, что в этих словах это вместо ', поэтому я скопировал эти слова прямо из текста.Аналогично для «не» и «не».Это работает, но отображает одно слово за раз.

> sup4_bigrams_count %>% filter(str_detect(word1,"didn’t"))
# A tibble: 3 x 3
  word1  word2     n
  <chr>  <chr> <int>
1 didn’t argue     1
2 didn’t miss      1
3 didn’t shame     1

Но с использованием% в% это не работает вообще.

negate_words <- c("didn’t","doesn’t","don’t")

> sup4_bigrams_count %>% filter(word1 %in% negate_words)
# A tibble: 0 x 3
# ... with 3 variables: word1 <chr>, word2 <chr>, n <int>

Но если я использую эти слова для создания другогофрейм данных,% в% работает нормально.

a <- data_frame(word=c("didn’t","doesn’t","don’t"),ind=1:3)
n <- c("didn’t","doesn’t")

> a %>% filter(word %in% n)
# A tibble: 2 x 2
  word      ind
  <chr>   <int>
1 didn’t      1
2 doesn’t     2

Что я могу только сделать, это отфильтровать по str_detect три раза и rbind их вместе, но это намного сложнее и не будетбудь проще, если у меня длинный список слов отрицания.Надеюсь, что кто-то может помочь с этим.

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете создать регулярное выражение "ИЛИ" для поиска всех отрицательных слов одновременно.

library(stringr)

negate_words <- c("didn’t","doesn’t","don’t")

strings <-  c("daily",  "day", "de", "define",
              "depth", "developed", "didn’t", "differentiated",
              "difunctioning", "diploma", "doesn’t", "don’t")

str_detect(strings, "didn’t")
# FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

pattern <- paste0("(", paste(negate_words, collapse="|"), ")")
pattern
# "(didn’t|doesn’t|don’t)"

str_detect(strings, pattern)
# FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
...