Как отделить строку от чисел в R? - PullRequest
1 голос
/ 16 мая 2019

У меня дикий и безумный текстовый файл, заголовок которого выглядит так:

2016-07-01 02:50:35 <name redacted> hey
2016-07-01 02:51:26 <name redacted> waiting for plane to Edinburgh
2016-07-01 02:51:45 <name redacted> thinking about my boo
2016-07-01 02:52:07 <name reda> nothing crappy has happened, not really
2016-07-01 02:52:20 <name redac> plane went by pretty fast, didn't sleep
2016-07-01 02:54:08 <name r> no idea what time it is or where I am really
2016-07-01 02:54:17 <name redacted> just know it's london
2016-07-01 02:56:44 <name redacted> you are probably asleep
2016-07-01 02:58:45 <name redacted> I hope fish was fishy in a good eay
2016-07-01 02:58:56 <name redacted> ?
2016-07-01 02:59:34 <name redacted> ???
2016-07-01 03:02:48 <name > British security is a little more rigorous...

Это продолжается некоторое время. Это большой файл. Но я чувствую, что будет трудно комментировать библиотеку coreNLP или пакет. Я делаю обработку естественного языка. Другими словами, мне любопытно, как бы сбрить, скажем, хотя бы даты, если не даты и имена.

Но я думаю, что мне понадобятся имена, потому что, в конце концов, я бы хотел быть похожим, этот человек сказал это 50 раз, тогда как этот человек сказал это 75 раз, и так далее, но это становится немного впереди меня, наверное.

Требуется ли регулярное выражение? Я работаю в Р.

Я еще ничего не пробовал, так как не знаю с чего начать. Как бы я написал код на R, который будет выборочно читать только для текста? содержательно составленные фразы и предложения?

Ответы [ 4 ]

1 голос
/ 16 мая 2019

Это может не нуждаться в выражении, но если вы хотите сделать это, это выражение может помочь вам просто к этому:

(.*)(\s<name.*)

enter image description here

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить выражения в regex101.com . Вы можете добавить больше границ, если это необходимо.

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

JavaScript Demo

const regex = /(.*)(\s<name.*)/gm;
const str = `2016-07-01 02:50:35 <name redacted> hey
2016-07-01 02:51:26 <name redacted> waiting for plane to Edinburgh
2016-07-01 02:51:45 <name redacted> thinking about my boo
2016-07-01 02:52:07 <name reda> nothing crappy has happened, not really
2016-07-01 02:52:20 <name redac> plane went by pretty fast, didn't sleep
2016-07-01 02:54:08 <name r> no idea what time it is or where I am really
2016-07-01 02:54:17 <name redacted> just know it's london
2016-07-01 02:56:44 <name redacted> you are probably asleep
2016-07-01 02:58:45 <name redacted> I hope fish was fishy in a good eay
2016-07-01 02:58:56 <name redacted> ?
2016-07-01 02:59:34 <name redacted> ???
2016-07-01 03:02:48 <name > British security is a little more rigorous...`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
0 голосов
/ 19 мая 2019

С некоторой помощью я смог понять это.

> a <- readLines ("hangouts-conversation-6.txt", encoding = "UTF-8")
> b <- "^([0-9-]{10} [0-9:]{8} )[*]{3} (\\w+ \\w+)"
> c <- gsub(b, "\\1<\\2> ", a)
> d <- "^([0-9-]{10}) ([0-9:]{8}) <(\\w+ \\w+)>\\s*(.+)$"
> e <- data.frame(date = character(),
+                     time = character(),
+                     name = character(),
+                     text = character(),
+                     stringsAsFactors = TRUE)
f <- strcapture(d, c, e)
> f <- f [-c(1),]

В первой строке были все NA, следовательно, последний раз с -c

0 голосов
/ 17 мая 2019

Используя ваш пример вставленного текста, мы можем сделать следующее.Обратите внимание, что ваше описание поведения текста при вставке копии подсказывает мне, что в тексте действительно есть символы новой строки \n, но без воспроизводимого примера трудно сказать.

  1. Разделите одну длинную строку на строки, разделив границу перед датой.Если у вас есть люди, регулярно вводящие даты в сообщения, вы можете расширить шаблон, включив в него время и имя.Если люди вводят это в сообщения, это будет сложно, но, надеюсь, это повлияет только на несколько сообщений.Это будет исправлено с помощью разграничения строк.

  2. Поместите строки в столбец данных и разбейте их на пробелы, которые предшествуют или следуют за кареткой < или >, чтобы разделить на имяи сообщение.

library(tidyverse)
text <- "2016-07-01 23:59:27 <John Doe> We're both signing off at the same time2016-07-02 00:00:04 <John Doe> :-)2016-07-02 00:00:28 <John Doe> I live you supercalagraa...phragrlous...esp..dociois2016-07-02 00:12:23 <Jane Doe> I love you :)2016-07-02 08:57:33"
text %>%
  str_split("(?=\\d{4}-\\d{2}-\\d{2})") %>%
  pluck(1) %>%
  enframe(name = NULL, value = "message") %>%
  separate(message, c("datetime", "name", "message"), sep = "\\s(?=<)|(?<=>)\\s", extra = "merge")
#> Warning: Expected 3 pieces. Missing pieces filled with `NA` in 2 rows [1,
#> 6].
#> # A tibble: 6 x 3
#>   datetime           name      message                                     
#>   <chr>              <chr>     <chr>                                       
#> 1 ""                 <NA>      <NA>                                        
#> 2 2016-07-01 23:59:… <John Do… We're both signing off at the same time     
#> 3 2016-07-02 00:00:… <John Do… :-)                                         
#> 4 2016-07-02 00:00:… <John Do… I live you supercalagraa...phragrlous...esp…
#> 5 2016-07-02 00:12:… <Jane Do… I love you :)                               
#> 6 2016-07-02 08:57:… <NA>      <NA>

Создано в 2019-05-16 с помощью пакета Представитель (v0.2.1)

0 голосов
/ 16 мая 2019

Используя регулярное выражение base R, используемое в функции gsub, можно извлечь каждый фрагмент информации.Предположим, вы создадите этот файл в качестве примера:

2016-07-01 02:50:35 <name1 surname1> hey
2016-07-01 02:51:26 <name1 surname1> waiting for plane to Edinburgh
2016-07-01 02:51:45 <name1 surname1> thinking about
2016-07-01 02:52:07 <name2 surname2> nothing crappy 
2016-07-01 02:52:20 <name2 surname2> plane went by pretty fast
2016-07-01 02:54:08 <name2 surname2> no idea
2016-07-01 02:54:17 <name2 surname2> just know it's london
2016-07-01 02:56:44 <name1 surname1> you are probably asleep
2016-07-01 02:58:45 <name1 surname1> I hope fish was fishy in a good eay
2016-07-01 02:58:56 <name2 surname2> x
2016-07-01 02:59:34 <name1 surname2> y
2016-07-01 03:02:48 <name2 > British security is a little more rigorous...

Теперь в консоли R вы читаете файл как простой текст и обрабатываете его с помощью регулярного выражения.Аргумент 2 из gsub - извлечь шаблон из регулярного выражения

your_data <- readLines(your_text_file)  # Reading 
pattern <- "(.*) <(\\S*) (\\S*)>(.*)" # The regex pattern
times <- gsub(pattern,"\\1",your_data) # Get Time and date
person_name <- gsub(pattern,"\\2 \\3",your_data) # Get name
message <- gsub(pattern,"\\4",your_data) # Get message
...