2013-11-01 6 views
8

Angenommen, ich habe eine Zeichenfolge zum Beispiel folgende.R-String entfernt Interpunktion beim Teilen

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

Ich brauche nur auf die Zeichensetzung !?. und folgende Leerzeichen und halten Sie die Zeichensetzung mit ihm zu teilen.

Dies entfernt die Zeichensetzung und läßt führende Leerzeichen in den geteilten Teilen obwohl

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

Wie kann ich Sätze aufgeteilt, um die Interpunktion zu verlassen?

Antwort

14

Sie können PCRE einschalten, indem Sie perl=TRUE verwenden und eine Lookbehind-Assertion verwenden.

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

Regulärer Ausdruck:

(?<!   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

der Grund dafür ist, dass die '‘ .'' muss nicht entkommen, weil es in einem '[]' Gruppe ist oder für Ein anderer Grund? –

+0

Für PCRE und andere sogenannte Perl-kompatible Flavors, entkomme '.^$ * +?() [{\\' außerhalb der Zeichenklasse und '^', '-','] ', \ innerhalb der Zeichenklasse. – hwnd

+0

super, danke für die Klärung –

5

Die sentSplit Funktion im qdap package war nur für diese Aufgabe erstellen:

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

einen Blick auf this question nehmen. Zeichenklassen wie [:space:] sind innerhalb von Klammerausdrücken definiert, Sie müssen sie also in Klammern setzen. Versuchen Sie:

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" 

Dies wird die führenden Leerzeichen los. Damit Interpunktion, verwenden Sie eine positive Lookbehind Behauptung mit 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

Er wollte die Interpunktion auch nach dem Split. – hwnd

+0

Ah, hab es. Ich bearbeite - es sieht Ihrer Antwort sehr ähnlich, nur mit '[[:: Leerzeichen:]]' 'anstelle von' \\ s'. Die Überschneidung der Antworten ist nicht 100%, also bin ich damit einverstanden, wenn du damit einverstanden bist. –

1

Sie könnten die Räume ersetzen folgende Satzzeichen mit einem String, z zzzzz und spaltete dann auf dieser Zeichenfolge.

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") 

\1 Wo in der Ersatzzeichenfolge in dem geklammerten Unterausdruck des Musters bezieht.

1

Ab qdap version 1.1.0 können Sie die sent_detect Funktion wie folgt:

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

Ebenfalls ab 2.2.1, sent_detect_nlp – demongolem

Verwandte Themen