Проблема с токенизацией

Я пытаюсь токенизировать предложение следующим образом.

Section <- c("If an infusion reaction occurs, interrupt the infusion.")
df <- data.frame(Section)

Когда я токенизирую с помощью tidytext и приведенного ниже кода,

AA <- df %>%
  mutate(tokens = str_extract_all(df$Section, "([^\\s]+)"),
         locations = str_locate_all(df$Section, "([^\\s]+)"),
         locations = map(locations, as.data.frame)) %>%
  select(-Section) %>%
  unnest(tokens, locations) 

это дает мне набор результатов, как показано ниже (см. изображение).

Вывод R для АА

Как получить запятую и точку как независимые токены, которые не являются частью «происходит» и «вливание». соответственно, используя tidytext. поэтому мои токены должны быть

If
an
infusion
reaction
occurs
,
interrupt
the
infusion
.

person Krishna    schedule 14.08.2018    source источник


Ответы (4)


Замените их чем-то другим заранее. Не забудьте добавить пробел перед заменой. Затем разделите предложения пробелами.

include = c(".", ",") #The symbols that should be included

mystr = Section  # copy data
for (mypattern in include){
    mystr = gsub(pattern = mypattern,
                 replacement = paste0(" ", mypattern),
                 x = mystr, fixed = TRUE)
}
lapply(strsplit(mystr, " "), function(V) data.frame(Tokens = V))
#[[1]]
#      Tokens
#1         If
#2         an
#3   infusion
#4   reaction
#5     occurs
#6          ,
#7  interrupt
#8        the
#9   infusion
#10         .
person d.b    schedule 14.08.2018

Это в конечном итоге увеличит длину вашей строки:

df%>%
  mutate(Section =  gsub("([,.])",' \\1',Section),
  start = gregexpr("\\S+",Section),
  end = list(attr(start[[1]],"match.length")+unlist(start)),
  Section = strsplit(Section,"\\s+"))%>%
  unnest()

     Section start end
1         If     1   3
2         an     4   6
3   infusion     7  15
4   reaction    16  24
5     occurs    25  31
6          ,    32  33
7  interrupt    34  43
8        the    44  47
9   infusion    48  56
10         .    57  58
person Onyambu    schedule 15.08.2018

Вот способ сделать это, не заменяя ничего в первую очередь, хитрость заключается в использовании подстановочного знака [[:punct:]], который соответствует любому из:

!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~

Шаблон просто \\w+|[[:punct:]]-, который говорит: сопоставьте последовательные символы слова или символ пунктуации, str_extract_all позаботится об остальном, вытягивая каждый из них отдельно. Если вы хотите выделить только определенные знаки препинания, вы также можете просто использовать \\w+|[,.] или что-то подобное.

AA <- df %>% mutate(
     tokens = str_extract_all(Section, "\\w+|[[:punct:]]"),
     locations = str_locate_all(Section, "\\w+|[[:punct:]]"),
     locations = map(locations, as.data.frame)) %>%
  select(-Section) %>%
  unnest(tokens, locations)

      tokens start end
1         If     1   2
2         an     4   5
3   infusion     7  14
4   reaction    16  23
5     occurs    25  30
6          ,    31  31
7  interrupt    33  41
8        the    43  45
9   infusion    47  54
10         .    55  55
person Mako212    schedule 15.08.2018

Функция unnest_tokens() имеет аргумент strip_punct для токенизаторов, таких как слово токенизатор.

library(tidyverse)
library(tidytext)

df %>%
  unnest_tokens(word, Section, strip_punct = FALSE)
#> # A tibble: 10 x 1
#>    word     
#>    <chr>    
#>  1 if       
#>  2 an       
#>  3 infusion 
#>  4 reaction 
#>  5 occurs   
#>  6 ,        
#>  7 interrupt
#>  8 the      
#>  9 infusion 
#> 10 .

Создано 15 августа 2018 г. с помощью пакета reprex (v0.2.0).

person Julia Silge    schedule 15.08.2018