3

そのため、指定されたファイルを 1 行ずつ読み取る関数 parse() を作成し、String.split(regex) 関数を使用して行を単語の文字列配列に分割しています。さらに、各単語は、parse() に引数として渡される別の関数に含まれる HashMap に渡されます。Stack Overflow をブラウジングして役立つ情報を探しましたが、関数が原因でプログラムがハングする理由はまだわかりません。

関数自体は次のとおりです。

public void parse(FrequencyCounter counter) throws IOException {

    BufferedReader fileReader = new BufferedReader(new FileReader(file));

    String searchExpression = "[\\p{Space}\\p{Punct}]"; 

    String line;
    String[] wordList;

    line = fileReader.readLine();

    while (!line.isEmpty()) {

        wordList = line.split(searchExpression); 

        System.out.println("First value of wordList: " + wordList[0]);

        for (String each : wordList) {
            if(each.isEmpty()) 
                break;

            if(counter.isAnElement(each)) {
                counter.incrementKey(each);
            } else {
                counter.addKey(each);
            }
        }
    }

    fileReader.close();
}

そのため、問題なく while ループに入ることができますが、wordList の想定される構築の後に println() ステートメントを追加すると、プログラムは空の wordList を無限に出力し、プログラムは関数から戻りません。私の観点からすると、私が使用している正規表現は、私が望む目的を達成していないと信じるようになりました。

必要なことを詳しく説明すると、正規表現はアルファベット文字のみで構成される単語を分離する必要があります。完璧なケースでは、接続詞またはハイフンでつながれた単語を完全に認識して、wordList に追加できます。ただし、「won't」や「twenty-two」などの単語を「won」、「t」、「twenty」、「two」にすることはできます。

テスト ケースとして、Lewis Carroll の詩「Jabberwocky」を含むプレーンテキスト ファイルを実行していますが、これには分割するのが非常に難しい単語以外のトークンは含まれていません。

この問題の原因は何ですか?また、この関数による解析を改善するにはどうすればよいですか?

4

3 に答える 3

2

あなたと一緒[]にセットを定義します。セット自体は何にも一致しません。その背後に数量詞を配置する必要があります。たとえば[\\p{Space}\\p{Punct}]+、句読点とスペースの任意の組み合わせに一致します1。

ここにそれに関する良いチュートリアルがあります

于 2013-03-05T09:30:23.183 に答える
2

linewhile ループ内で文字列を変更しないため、一致することはありません!line.isEmpty()

于 2013-03-05T09:30:49.797 に答える
0

無限ループの理由は、コードの次の部分にあります。

        line = fileReader.readLine();
        while (!line.isEmpty()) {

ループするたびに必ず読む必要があります。

        line = fileReader.readLine();
        while (!line.isEmpty()) {
             ... your while loop
             line = fileReader.readLine();
        }
于 2013-03-05T09:31:53.267 に答える