0

文字列から:

"((VBD)(((JJ))(CC)((RB)(JJ)))((IN)((DT)(JJ)(NNP)(NNPS))))"

私は以下が必要でした:

"JJ", "RBJJ", "DTJJNNPNNPS", "JJCCRBJJ", "INDTJJNNPNNPS" "VBDJJCCRBJJINDTJJNNPNNPS"

(これは、@ Brian Diggsによって解決されたSOに関する私の以前のクエリでした。必要に応じて、「R:正規表現を使用して最も内側のブラケットと最も内側のブラケットを区別する方法」を参照してください)

だから私は次のコードを使用しました:

library("plotrix")
library("plyr")
strr<-c("((VBD)(((JJ))(CC)((RB)(JJ)))((IN)((DT)(JJ)(NNP)(NNPS))))")
tmp <- gsub("\\(([^\\(\\)]*)\\)",  '("\\1")', strr)
tmp <- gsub("\\(", "list(", tmp)
tmp <- gsub("\\)list", "),list", tmp)
tmp <- eval(parse(text=tmp))
atdepth <- function(l, d) {
if (d > 0 & !is.list(l)) {
 return(NULL)
}
 if (d == 0) {
 return(unlist(l))
 }
if (is.list(l)) {
 llply(l, atdepth, d-1)
 }
 }

 pastelist <- function(l) {paste(unlist(l), collapse="", sep="")}
 down <- llply(1:listDepth(tmp), atdepth, l=tmp)
 out <- if (length(down) > 2) {
 c(unlist(llply(length(down):3, function(i) {
 unlist(do.call(llply, c(list(down[[i]]), replicate(i-3, llply), pastelist)))
 })), unlist(pastelist(down[[2]]))) 
 } else {
 unlist(pastelist(down[[2]]))
 }
 out <- out[out != ""]

そして、私は欲しいものを手に入れましたが、上記のコードをループで使用して、複数の文字列(strrなど)を同時に処理することはできませんか?処理してファイルに収集する文字列の束が大まかに必要です。ループを含めようとしていますが、常にoutファイルの文字列セットの最後の文字列だけが含まれることになります。コードをループで実行するにはどうすればよいですか?以下に設定された文字列。

strr<-c("(((((NNS))((IN)((NNS)(CC)(NNS))))((VBD)((PRP))((IN)((NN))))))", 

"((((NNS))((VBD)((TO)(((NNP))((NNP))))((TO)((DT)(NNP))))))", 

"((((IN)(((NNP))((NNP))))((NNP)(NNP)(NNPW)(NNP))((VBD)((IN)((DT)(JJ)(NN)(NN))))))"
)
4

1 に答える 1

0

おそらくもっと賢い方法で変更することもできますが、簡単な方法は新しい関数を定義して使用することですsapply()

### Nothing new
library("plotrix")
library("plyr")
strr<-c("(((((NNS))((IN)((NNS)(CC)(NNS))))((VBD)((PRP))((IN)((NN))))))", 
        "((((NNS))((VBD)((TO)(((NNP))((NNP))))((TO)((DT)(NNP))))))",   
        "((((IN)(((NNP))((NNP))))((NNP)(NNP)(NNPW)(NNP))((VBD)((IN)((DT)(JJ)(NN)(NN))))))")

strrr <- strr[rep(1:3,200)]

atdepth <- function(l, d) {
  if (d > 0 & !is.list(l)) {
    return(NULL)
  }
  if (d == 0) {
    return(unlist(l))
  }
  if (is.list(l)) {
    llply(l, atdepth, d-1)
  }
}
pastelist <- function(l) {paste(unlist(l), collapse="", sep="")}
###
### New function here
fun <- function(strr){
tmp <- gsub("\\(([^\\(\\)]*)\\)",  '("\\1")', strr)
tmp <- gsub("\\(", "list(", tmp)
tmp <- gsub("\\)list", "),list", tmp)
tmp <- eval(parse(text=tmp))

down <- llply(1:listDepth(tmp), atdepth, l=tmp)
out <- if (length(down) > 2) {
  c(unlist(llply(length(down):3, function(i) {
    unlist(do.call(llply, c(list(down[[i]]), replicate(i-3, llply), pastelist)))
  })), unlist(pastelist(down[[2]]))) 
} else {
  unlist(pastelist(down[[2]]))
}
out <- out[out != ""]
out
}

sapply(strr, fun)
于 2012-07-13T11:38:05.730 に答える