2017-09-24 144 views
3

我有一個data.frame與大量的(冗長)字符串。在處理它們之前,我試圖對它們進行一些清理,但在處理期間時遇到了問題。我希望能夠區分句子用於結束句子和何時用作縮寫詞的一部分。我希望通過這個詞的長度來做到這一點,但還沒有找到正確的正則表達式。用字長替換字符串中的標點符號在R

說我有這樣的字符串:mystring <- "hello.world from the u.s.a."。我想用"hello world from the usa"之類的東西代替它。

我可以嘗試使用split_string <- unlist(strsplit(mystring, split=" "))分裂空格的data.frame,然後運行像

split_string <- ifelse(nchar(split_string) < 7, gsub(".", "", split_string), gsub(".", " ", split_string))

但作爲文本的身體是相當大的,這是一個非常緩慢的(和比較難看)過程。我怎樣才能以更高效和更清潔的方式來做到這一點?

+0

不是一個直接的答案,但考慮使用'Python'和'nltk'預處理字符串,這對於區分縮寫詞中的點和句子結尾來說更好。 – Jan

+1

將句子分開不是更好嗎? –

+0

主要問題是數據非常混亂,很難判斷句子的邊界在哪裏 - 例如,我想將「hello」和「world」分成兩個單獨的標記,但在「mystring」中留下「usa」 「作爲一個單一的標記。 – mlinegar

回答

2

你可以測試一下,看看這是否更快。它會查找分隔符,最多6個非空格字符和分隔符,對於任何此類匹配,它將運行gsubfn的第二個參數中的公式表示法中指定的匿名函數。該匿名函數刪除匹配中的任何句點。在什麼是gsub用一個空格替換每個時期。

library(gsubfn) 
pat <- "(?<=^|)(\\S{1,6})(?=$|)" 
gsub("[.]", " ", gsubfn(pat, ~ gsub("[.]", "", ..1), mystring, perl = TRUE)) 
## [1] "hello world from the usa" 
+0

很好的回答!我非常感謝你讓它可以擴展到任何數量的非空格字符。肯定比for循環跑得快! – mlinegar

2

如何以下...

mystring2 <- gsub("(\\w)\\.(\\w)","\\1 \\2",gsub("\\.(\\w+)\\.","\\1",mystring)) 

mystring2 
[1] "hello world from the usa." 

對於點任一字母的一面,它會刪除它們,然後再與字母兩邊的剩餘點,它會替換他們的空間。

它甚至可以將您示例中的最後一個點作爲句子的結尾!