无法在这里弄清楚如何解决这个问题:ArrayIndexOutOfBoundsException:0

时间:2015-03-26 15:47:55

标签: java string indexoutofboundsexception tokenize

我的问题如下:

我有一个用于Apache NLP的15k-line .train文件,这是整个文本的样本:

La joven Estefania Lopez Montesinos de la comision <START:falla> Embarcadero  Historiador Beti <END> y la niña Maria Donderis Sanchis de la Falla <START:falla> Blasco Ibáñez  Plaza Maestro Ripoll <END>

如您所见,标记包含在<START:category>tag<END>之间,标记可能只包含一个单词。

我需要做的是将这个巨大的文本文件转换为如下所示: (也就是说我需要用标记分隔每一行,然后在一个标签分隔的列中,如果标记不是标记或者我的文本中的类别(总是falla),我必须放置'O',如果它是标记)

La  O
joven   O
Estefanía   O
Lopez   O
Montesinos  O
de  O
la  O
comisión    O
Embarcadero FALLA
Historiador FALLA
Beti    FALLA
y   O
la  O
niña    O
María   O
Donderis    O
Sanchez O
de  O
la  O
falla   O
Blasco  FALLA
Ibañez  FALLA
Plaza   FALLA
Maestro FALLA
Ripoll  FALLA

为了创建一个具有后一种文本形式的文件,我创建了一个从第一个文本中逐行接收的类,其操作方式如下:

import java.util.ArrayList;
import java.util.List;


public class Tokenizer {
    public static ArrayList<Token> inspect (String input){
        ArrayList<Token> tokens = new ArrayList<Token>();


        if(input.contains("<START:falla>")){
            String[] chunks = input.split("<START:falla>");
            for(String piece : chunks){
                if(piece.contains("<END>")){
                    String[] polaridad = piece.trim().split("<END>");
                    String falla = polaridad[0]; // Here is where I get the error.
                    String[] falles = falla.trim().split( " " );
                    for(String s : falles){
                        if ( !s.trim().isEmpty() ){
                            Token word = new Token(s);
                            word.setType(true);
                            tokens.add(word);
                        }
                    }
                    if(polaridad.length>1){
                        String weird = polaridad[1];
                        if(!weird.isEmpty()){
                            String[] nofalles = weird.trim().split( " " );
                            for(String s : nofalles){
                                if ( !s.trim().isEmpty() ){
                                    Token word = new Token(s);
                                    word.setType(false);
                                    tokens.add(word);
                                }
                            }
                        }
                    }       

                }else{  // if(!piece.contains("<END>"))
                    String[] pieces = piece.trim().split(" ");
                    for(String s : pieces){
                        if ( !s.trim().isEmpty() ){
                            Token word = new Token(s);
                            word.setType(false);
                            tokens.add(word);
                        }
                    }
                }
            }
        }else{
            // splits using spaces
            String[] firstPass = input.trim().split( " " );

            for ( String s : firstPass ) {
                // the current part cannot be empty
                if ( !s.trim().isEmpty() ){
                    Token word = new Token(s);
                    word.setType(false);
                    tokens.add(word);
                }
            }
        }   
        return tokens;      
    }
}

如您所见,在本课程中,我将属性'setType'设置为每个单词,以便我可以在之后以指定的格式编写文件。

我不知道如何解决这个问题,因为同一个班级正在与另一个文本完美配合。

非常感谢你。

1 个答案:

答案 0 :(得分:1)

我怀疑piece等于<END>String.split(String)的文档说:

  

“尾随空字符串[因此]不包含在结果数组中。”

因此,以下产生一个零长度数组:

String piece = "<END>"
piece.trim().split("<END>") => []

如果你想保留空的尾随令牌,将第二个参数传递给split,你得到一个长度为2的数组:

piece.trim().split("<END>", -1) => [, ]