R:在分割文本时如何避免对空向量进行strsplit打嗝

时间:2014-01-02 20:19:14

标签: r string sapply strsplit

有一个文本列表 - sections,需要通过以下方式分成sentences

>  textList <- list(sections=sections[(length(sections)-2):length(sections)])
>  textList$sentences <- sapply(textList$sections, function(x) strsplit(as.character(x), "(?<=und/KON)\\s(?!\\S+/V)|(?<=oder/KON)\\s|(?<=/\\$[[:punct:]])\\s(?!dass/KOUS)(?!dann/ADV)(?!weil/KOUS)", perl=TRUE))
>  sent <- textList$sentences

最终目标是将ID添加到所有sentences并将它们一起排列到数据框列表中 - 与每个部分对应的数据框。

>  sent.list <- lapply(seq_along(sent), function(i)
+                               data.frame(ID=paste(sprintf("%02d", i), sprintf("%03d", seq_along(sent[[i]])), sep = ""),
+                                          Sentence=sent[[i]]))
Error in data.frame(ID = paste(sprintf("%02d", i), sprintf("%03d", seq_along(sent[[i]])),  : 
  arguments imply differing number of rows: 1, 0

问题:但是我尝试在第一步中对分割进行变换,不知何故,似乎我得到的列表中只有一个character(0)元素(最后一个)。这阻碍了执行第二步 - 创建数据帧列表 - 上面的错误。

请注意list的结构似乎有些损坏。向下--R控制台复制 - 粘贴 - 前两个sections开始(#*)与$... #*(顺便说一下。我无法解释有意义)。但是,第三部分(#**)以[[3]]开头。

>  sent
$... #*
 [1] "Das/ART Spiel/NN besteht/VVFIN aus/APPR mehreren/PIAT Früchten/NN -LRB-/TRUNC rote/ADJA Kirschen/NN ,/$," 
 .
 .
 . 
[51] "-RRB-/TRUNC sie/PPER bleiben/VVFIN die/ART ganze/ADJA Zeit/NN über/APPR konzetriert/ADJD bei/APPR der/ART Sache/NN ./$."                                                                       
[52] "Das/ART Spiel/NN ist/VAFIN eine/ART absolue/ADJA Kaufempfehlung/NN !!!!/CARD "                                                                                                                 

$... #*
 [1] "Obstgarten/NN ist/VAFIN DAS/NE Einsteigerspiel/NN für/APPR Kinder/NN ab/APPR zwei/CARD Jahren/NN ./$."  
 .
 .
 .                    
[36] "hochgelobten/ADJA Klassiker/NN werden/VAFIN lassen/VVINF kann/VMFIN ./$."                                                                                                                                

[[3]] #**
character(0)

我试图重现人工复制数据的错误而没有太大的成功。所以请原谅复杂的代码。

我可以在R控制台中执行时重现错误的textList的最小版本:

> textList
$sections
[1] "Obstgarten/NN ist/VAFIN DAS/NE Einsteigerspiel/NN für/APPR Kinder/NN ab/APPR zwei/CARD Jahren/NN ./$. Preis/NN führt/VVFIN ,/$, aus/APPR einem/ART einfachen/ADJA Spiel/NN schnell/ADJD einen/ART hochwertigen/ADJA und/KON hochgelobten/ADJA Klassiker/NN werden/VAFIN lassen/VVINF kann/VMFIN ./$. "
[2] ""    

关注包含最小版本dput的{​​{1}}文件的内容,该文件会再现该示例。

textList

1 个答案:

答案 0 :(得分:4)

只需删除长度等于0的元素:

sent <- unlist(sent,recursive=FALSE)
sent <- sent[lapply(sent,length)>0]

编辑 OP似乎在如何重现错误方面存在问题,我在这里展示如何重现错误:

使用此例如发送:

sent = list("a",character(0))  ## you get an error because of character(0)

 lapply(seq_along(sent), 
           function(i)
             data.frame(ID=paste(sprintf("%02d", i),
                                  sprintf("%03d", seq_along(sent[[i]])), sep = ""),
                        Sentence=sent[[i]]))

重现错误:

Error in data.frame(ID = paste(sprintf("%02d", i), sprintf("%03d", seq_along(sent[[i]])),  : 
  arguments imply differing number of rows: 1, 0