2016-05-12 18 views
-1

Ich muss Wörter mit 3 oder mehr sich wiederholenden Buchstaben aus einer Zeichenfolge mit gsub entfernen. Beispiel:R: Entfernen Sie Wörter mit 3 oder mehr sich wiederholenden Buchstaben mit GSUB

„Es hat geregnet seeehr schlecht heeere letzten Tage“

Ich muss die folgende using gsub Funktion zu erhalten:

„Es hat geregnet schlecht letzten Tage“. Wörter 'verrrry' und 'heeere' werden aus der Zeichenfolge entfernt.

+0

Ich glaube nicht, dass dies eine R Sache wirklich, ich würde empfehlen, "Backreferences Regex" in Google nachschlagen, und Sie sollten in der Lage sein, es herauszufinden. Wenn du immer noch feststeckst, poste deinen Versuch hier und ich bin mir sicher, dass die Leute dir helfen werden. – chappers

+0

neu zu regex/gsub. benötigen Sie diese Funktionalität in R-Skript – manoj

+0

einzubetten, wie lange ist die Zeichenfolge, die Sie benötigen, um die Wörter zu entfernen? Sprechen wir wie ein ganzes Buch oder nur ein paar Seiten? – Chris

Antwort

0

Eine schnelle Suche this SO answer gebracht. Mit, dass Sie so etwas wie tun:

## string with repeated letters 
s <- "It has been raining verrrry badly heeere last few days" 

## split string into vector of words to select 
svec <- unlist(strsplit(s, " ")) 

## find words with 3 or more repeated letters/numbers 
## (for any general symbol use '.' instead of '\\w') 
rmword <- grep("(\\w)\\1{2, }", svec) 

## join words into single string again, removing the unwanted ones 
paste(svec[-rmword], collapse = " ") 

## output: 
[1] "It has been raining badly last few days" 

EDIT beantworten die Follow-up-Anfrage . Auch grep-grepl geändert

Lassen Sie sich zunächst den Code in eine Funktion wickeln:

rm.repeatLetters <- function(x){ 
    xvec <- unlist(strsplit(x, " ")) 
    rmword <- grepl("(\\w)\\1{2, }", xvec) 
    return(paste(xvec[!rmword], collapse = " ")) 
} 

Dann ist es auf einem Datenrahmen zu verwenden:

df <- data.frame(id=c(1, 2, 3), text=c(s, s, s), stringsAsFactors=FALSE) 
## > df 
## id             text 
## 1 1 It has been raining verrrry badly heeere last few days 
## 2 2 It has been raining verrrry badly heeere last few days 
## 3 3 It has been raining verrrry badly heeere last few days 


df$text <- sapply(df$text, rm.repeatLetters) 
## > df 
## id         text 
## 1 1 It has been raining badly last few days 
## 2 2 It has been raining badly last few days 
## 3 3 It has been raining badly last few days 
+0

Whoa viele ähnliche Antworten tauchte in der Zeit auf, als ich dies schrieb ... – Gabe

+0

Danke Gabe..danks für die gemeinsame Nutzung der Lösung.Können Sie angeben, wie Sie es in einem Datenrahmen mit zwei Spalten ID und Text implementieren? Die Verarbeitung muss in der Spalte Text erfolgen. – manoj

+0

Ist jede Textzeile des Datenrahmens ein einzelnes Wort oder ein vollständiger Satz (oder Absatz)? – Gabe

0

Dies sieht aus wie die Ausgabezeichenfolge an Sie sind mit dem Ziel:

origStr = "It has been raining verrrry badly heeere last few days" 

newStr <- gsub("e{3,}","e", origStr) # replaces e's greater than 2 repeat 
(newStr <- gsub("r{3,}","r", newStr)) # replaces r's greater than 2 repeat 

# [1] "It has been raining very badly here last few days" 
+0

Danke Bob. Ich wollte, dass die Wörter aus der Zeichenfolge gelöscht werden, wenn sie einen Buchstaben haben, der sich mehr als zweimal wiederholt. In meinem Beispiel wurden 'verrrry' und 'heeere' gelöscht, da sie Buchstaben hatten, die sich mehr als zweimal wiederholten. Auch ich suche nach einer generischen Funktion, die über jedes Wort angewendet werden kann, das irgendwelche sich wiederholenden Buchstaben enthält .... Entschuldigung, ich war vorher nicht klar. schätze deine Hilfe wirklich – manoj

-1

Hier ist eine Art und Weise:

library(tm) 
data("acq") 
acq[[12]]$content -> sometext 
tm::MC_tokenizer(x = sometext) -> q 
q[131] <- "eeee" 

sapply(letters, FUN = function(x) { 
    grepl(paste0(x, "{3,}"), x = q, ignore.case = TRUE) -> k 
    k 
}) -> zz 

apply(X = zz, 1, sum) -> flag 
q[ifelse(flag == 1, FALSE, TRUE)] -> newq 
paste(newq, collapse = " ") -> final 
+0

Danke Chris. Ihre Lösungen funktionieren. Ich frage mich, wie ich Ihre Lösung auf einen Datenrahmen erweitern kann (haben Sie einen Datenrahmen mit zwei Spalten ... ID und Text). Die Verarbeitung findet im Textfeld statt. – manoj

+0

Ich schlage vor, Sie verwenden eine der gezeigten Lösungen abvoe ... Sie sind effizienter als die, die ich gab. – Chris

0

Eine mögliche Lösung, die durch einen regulären Ausdruck für Ihren Fall konstruiert zunächst.

regExp <- paste(sapply(letters, paste, "{3,}", sep = ""), collapse = "|") 
> regExp 

"a{3,}|b{3,}|c{3,}|d{3,}|e{3,}|f{3,}|g{3,}|h{3,}|i{3,}|j{3,}|k{3,}|l{3,}|m{3,}|n{3,}|o{3,}|p{3,}|q{3,}|r{3,}|s{3,}|t{3,}|u{3,}|v{3,}|w{3,}|x{3,}|y{3,}|z{3,}" 

words <- unlist(strsplit(origStr, "\\s+")) 
cleanStr <- paste(words[!grepl(regExp, words)], collapse = " ") 
cleanStr 
[1] "It has been raining badly last few days" 
3

Option 1

x <- "It has been raining verrrry badly heeere last few days" 
m <- gregexpr('\\s\\b\\w*(\\w)\\1{2,}\\w*\\b\\s', x, perl = TRUE) 
regmatches(x, m) <- ' ' 
x 
# [1] "It has been raining badly last few days" 

Option 2

x <- "It has been raining verrrry badly heeere last few days" 
sp <- strsplit(x, ' ')[[1]] 
s <- sp[!sapply(sp, function(y) any(rle(strsplit(y, '')[[1]])$lengths >= 3))] 
paste(s, collapse = ' ') 
# [1] "It has been raining badly last few days"