-1

以下のコードは、Java でトークン化するためのものです。修正できない小さなバグがあります。これはファイルのトークン化に関するものです。このコードでは、ユーザーがファイルに 4 つの大文字の単語を入力したとします。トークン化することは想定されておらず、同じ行に保持されることが想定されています。大文字などがない場合は、残りの単語をトークン化する必要があります。

例えば

こんにちは、ウォルトです。

O/P は次のようになります。

アメリカ合衆国

やあ

午前

ウォルト。

これが本来の姿です。コードを書いた後、小さなバグに直面しています。O/P はこのように表示されます。

アメリカ合衆国

アメリカ

やあ

午前

ウォルト。

基本的に、「States Of America」を取り除く必要があります。大文字をチェックしているコードの一部。この問題を回避することができないので、この問題を解決するのを手伝ってもらえますか? これを可能にするものは何でも役に立ちます。

コードを自由に変更して、出力を取得してみてください。

import java.io.*;
import java.util.*;

public class Tokenize {
  public static void main (String[] args) {
    try {
      BufferedReader inputReader=new BufferedReader(new FileReader("C:/Users/Advait/Desktop/nlp_wikipedia.txt"));
      String currentLine;
      while ((currentLine = inputReader.readLine())!=null) {
      // START STUDENT CODE
        char atUpper;
        char atUpper1;
        int keeper = 1;
        int keeper1 = 0;
        String temp = "";
        int j;
        int i;
        int counter = 0;
        int m=0;
        int n=0;
        String temp1 = "";
        boolean boolKeeper,boolKeeper1;
        String Delimeter = "[\\s,:;'!?()\"]+";
        for(j=0;j<(currentLine.length()-1);j++) {
          if(currentLine.contains("://")) {
            currentLine=currentLine.replace("://","#");
          }
        }
        String token1[] = currentLine.split(Delimeter);
        for(j=0;j<(token1.length)-1;j++) {
          if(j>0) {
            if(keeper==0) {
              atUpper = token1[j+1].charAt(0);
              atUpper1 = token1[keeper].charAt(0);
              boolKeeper = Character.isUpperCase(atUpper);
              boolKeeper1 = Character.isUpperCase(atUpper1);
              if(boolKeeper==true && boolKeeper1==true) {
                m++;
                temp1 = token1[keeper].concat(" ").concat(token1[j+1]);
                token1[keeper] = temp1;
              }
            } else {
              i=j+1;
              atUpper = token1[j].charAt(0);
              atUpper1 = token1[i].charAt(0);
              boolKeeper = Character.isUpperCase(atUpper);
              boolKeeper1 = Character.isUpperCase(atUpper1);
              if(boolKeeper==true && boolKeeper1==true) {
                counter=counter+1;
                if(counter == 1) {
                  keeper1 = j;
                }
                n++;
                temp = token1[keeper1].concat(" ").concat(token1[i]);
                token1[keeper1] = temp;
              }
            }
          } else {
            i=j+1;
            atUpper = token1[j].charAt(0);
            atUpper1 = token1[i].charAt(0);
            boolKeeper = Character.isUpperCase(atUpper);
            boolKeeper1 = Character.isUpperCase(atUpper1);
            if(boolKeeper==true && boolKeeper1==true) {
              keeper = 0;
              m++;
              temp = token1[j].concat(" ").concat(token1[i]);
              token1[j] = temp;
            }
          }
          ArrayList<String> LineList = new ArrayList<String>();
          for (String token : token1) {
            if (!token.equals("%")) {
              LineList.add(token);
            }
          }
          token1 = LineList.toArray(new String[LineList.size()]);
          String token2 = token1[j];
          for (int l=0;l<(token2.length()-1);l++) {
            if(token2.charAt(l) == '-' && token2.charAt(l+1) == '\n') {
              String token3[] = token2.split("-");
              token1[j] = token3[0] + token3[1];
            }
          }
        }
        for(int k=0;k<(token1.length);k++) {
          if(token1[k].contains(".") && token1[k].contains("@")) {
            token1[k] = token1[k].replace(".", "*");
          }
          if(token1[k].contains("#") && token1[k].contains(".")) {
            token1[k] = token1[k].replace("#","://");
            token1[k] = token1[k].replace(".","*");
          }
        }
        for(int k=0;k<(token1.length);k++) {
          StringTokenizer st = new StringTokenizer(token1[k],".");
          while (st.hasMoreTokens()) {
            token1[k] = st.nextToken();
          }
        }
        for(int k=0;k<(token1.length);k++) {
          String token4 = token1[k];
          for (int l=0;l<(token4.length()-1);l++) {
            if(token4.contains("@") && token4.contains("*")) {
              token1[k] = token4.replace("*",".");
            }
            if(token1[k].contains("://") && token1[k].contains("*")) {
              token1[k] = token4.replace("*",".");
            }
          }
        }
        for(int k=0;k<(token1.length);k++) {
          System.out.println(token1[k]);
        }
        // END STUDENT CODE
      }
    }
    catch (IOException e) {
      System.err.println("Caught IOException: "+e.getMessage());
    }
  }
}
4

1 に答える 1

1

最初の問題は、すべてを 1 つの巨大な関数に詰め込んでいることです。コードを意味のある単位に分割し、それぞれが明確に定義されたわかりやすい操作を実行する必要があります。大文字の単語の特定の問題については、 function をお勧めしますint capitalizedWordStreakLength(String[] tokens, int i)。その関数をループで使用して、「生の」トークンList<String>を反復処理することで結果のトークンを組み立て、String[]その関数が 4 つ以上を返す場合、それらの単語を 1 つのトークンに連結できます。

于 2012-08-15T16:35:28.833 に答える