2017-09-24 5 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"を2つのトークンに分割したいとします。 "単一のトークンとして。 – mlinegar

答えて

2

これをテストして、これがもっと速いかどうかを確認できます。区切り文字(最大6文字の空白文字と区切り文字)を検索します。一致する場合は、2番目の引数の式表記で指定された無名関数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." 

については、それが最初にそれらを削除する方法、そして文字のいずれかの側で残りのドットのために、それはスペースに置き換えます。

これは、例文の最後のドットを文の終わりとしても保持します。

関連する問題