Trigram:仅标记化数据集的一部分

时间:2019-12-07 07:48:18

标签: java stringtokenizer trigram

线程“主”中的异常java.util.NoSuchElementException
该文档中有500行,但仅标记300 ++行。  s3 = itr.nextToken(); //这是出现错误的行。控制台在此行显示该错误。

public class bigram {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("Airline.txt"));
        FileOutputStream out = new FileOutputStream("Airline2.txt");

        ArrayList < String > bigrams = new ArrayList < String > ();

        while (true) {
            String line = reader.readLine();
            if (line == null) {
                break;
            }

            StringTokenizer itr = new StringTokenizer(line);
            if (itr.countTokens() > 1) {
                System.out.println("String array size : " + itr.countTokens());
                String s1 = "";
                String s2 = "";
                String s3 = "";
                String s4 = "";
                while (itr.hasMoreTokens()) {
                    if (s1.isEmpty())
                        s1 = itr.nextToken();
                    if (s2.isEmpty()) {
                        s2 = itr.nextToken();
                    }
                    s3 = itr.nextToken(); // This is the line that got error.
                    s4 = "'" + s1 + "_" + s2 + "_" + s3 + "'";
                    bigrams.add(s4);
                    s1 = s2;
                    s2 = s3;
                    s3 = "";
                }

            } else
                System.out.println("Tokens is 1 or 0");
            int i = 0;
            while (i < bigrams.size()) {
                System.out.println(bigrams.get(i));
                i++;
            }
            //bigrams = Arrays.asList(i);
            for (String s: bigrams) {
                PrintStream p = new PrintStream(out);
                p.println(s);
                System.out.println(s);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题出在代码的这一部分:

// previous code 

while (itr.hasMoreTokens()) {
    if(s1.isEmpty())
        s1 = itr.nextToken();
    if(s2.isEmpty()) {
        s2 = itr.nextToken();
    }
    s3 = itr.nextToken(); 

// further code

假设迭代器中只剩下 一个令牌,因此while (itr.hasMoreTokens())将返回true。

现在假设s1为空,因此itr.nextToken();将为其赋予最后一个标记。

现在假设s2也为空,因此此itr.nextToken();将尝试再给它一个令牌,但它为空。如果没有,则s3不会被检查,itr肯定会尝试从一个空的迭代器中为其赋予一个令牌。

NoSuchElementException Enumeration nextElement方法抛出,表示enumeration中没有更多元素。

您需要根据要达到的目标进行更好的检查。建议您在循环中仅在迭代器上调用.next...(),除非您非常了解文件。

编辑:

如果绝对必须循环调用next() 3次,则需要在尝试next()之前显式检查它们是否是更多令牌,如下所示:

if (sX.isEmpty()) {
    if (itr.hasMoreTokens()) {
        s1 = itr.nextToken();
    } else {
        // no more tokens
        break;
    }
}

希望这会有所帮助。祝你好运。