2013-11-01 12 views
8

Powiedz, że mam ciąg znaków na przykład następujący.Ciąg R usuwa znaki interpunkcyjne w podziale

x <- 'The world is at end. What do you think? I am going crazy! These people are too calm.' 

muszę podzielić tylko na interpunkcji !?. i następującym spacji i znaków interpunkcyjnych utrzymywać z nim.

Usuwa znaki interpunkcyjne i pozostawia spacje w częściach podzielonych though

vec <- strsplit(x, '[!?.][:space:]*') 

Jak mogę podzielone zdania pozostawiając znaki interpunkcyjne?

Odpowiedz

14

Możesz włączyć PCRE za pomocą perl=TRUE i użyć asercji lookbehind.

strsplit(x, '(?<![^!?.])\\s+', perl=TRUE) 

Wyrażenie regularne:

(?<!   look behind to see if there is not: 
[^!?.]  any character except: '!', '?', '.' 
)    end of look-behind 
\s+   whitespace (\n, \r, \t, \f, and " ") (1 or more times) 

Live Demo

+0

jest powodem, że '” .'' nie musi być uciekł, bo to jest w '[]' grupy lub jakiś inny powód? –

+0

Dla PCRE i innych tak zwanych kompatybilnych z Perl smaków, uciekaj '.^$ * +?() [{\ |' Poza klasą znaków i '^', '-','] ', \ inside class character. – hwnd

+0

świetnie, dziękuję za wyjaśnienie –

5

sentSplit funkcja w qdap package było tworzyć tylko dla tego zadania:

library(qdap) 
sentSplit(data.frame(text = x), "text") 

## tot      text 
## 1 1.1  The world is at end. 
## 2 2.2   What do you think? 
## 3 3.3   I am going crazy! 
## 4 4.4 These people are too calm. 
2

Spójrz na this question. Klasy znaków, takie jak [:space:], są zdefiniowane w wyrażeniach nawiasów klamrowych, dlatego należy je ująć w zestaw nawiasów. Wypróbuj:

vec <- strsplit(x, '[!?.][[:space:]]*') 
vec 
# [[1]] 
# [1] "The world is at end"  "What do you think"   
# [3] "I am going crazy"   "These people are too calm" 

Pozbędzie się to wiodących przestrzeni. Aby zachować interpunkcji, należy pozytywnie lookbehind twierdzenie z perl = TRUE:

vec <- strsplit(x, '(?<=[!?.])[[:space:]]*', perl = TRUE) 
vec 
# [[1]] 
# [1] "The world is at end."  "What do you think?"   
# [3] "I am going crazy!"   "These people are too calm." 
+0

Chciał również interpunkcji po podziale. – hwnd

+0

Ah, rozumiem. Będę edytować - będzie to wyglądać jak twoja odpowiedź, po prostu z '[[: space:]]' zamiast '\\ s'. Nakładanie się odpowiedzi nie jest w 100%, więc nie przeszkadza mi, jeśli wszystko z nim w porządku. –

1

Można wymienić następujące przestrzenie znaki interpunkcyjne z ciągiem, np zzzzz a następnie podzielić na tego łańcucha.

x <- gsub("([!?.])[[:space:]]*","\\1zzzzz","The world is at end. What do you think? I am going crazy! These people are too calm.") 
strsplit(x, "zzzzz") 

przypadku \1 w ciągu zastępowania w nawiasach odnoszą się do podgrupy ekspresji wzoru.

1

Od qdap version 1.1.0 można użyć funkcji sent_detect następująco:

library(qdap) 
sent_detect(x) 

## [1] "The world is at end."  "What do you think?"   
## [3] "I am going crazy!"   "These people are too calm." 
+0

Również od wersji 2.2.1 sent_detect_nlp – demongolem

Powiązane problemy