我的问题如下:
我有一个用于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'设置为每个单词,以便我可以在之后以指定的格式编写文件。
我不知道如何解决这个问题,因为同一个班级正在与另一个文本完美配合。
非常感谢你。
答案 0 :(得分:1)
我怀疑piece
等于<END>
。 String.split(String)
的文档说:
“尾随空字符串[因此]不包含在结果数组中。”
因此,以下产生一个零长度数组:
String piece = "<END>"
piece.trim().split("<END>") => []
如果你想保留空的尾随令牌,将第二个参数传递给split
,你得到一个长度为2的数组:
piece.trim().split("<END>", -1) => [, ]