-1

以下代码用于 java 中的标记化。我有一个小错误,我无法修复。这是关于文件标记化的。在此代码中,如果用户在文件中输入四个大写单词。它不应该被标记化并且应该保留在同一行。如果没有大写字母或其他任何内容,则必须对其余单词进行标记。

例如

美利坚合众国 大家好,我是沃尔特。

O/P 应该如下所示。

美国

你好

沃尔特。

这就是它应该看起来的样子。写完代码后,我面临一个小错误。O/P 就是这样出现的。

美国

状态

美国

你好

沃尔特。

基本上我需要摆脱“美国”。在我检查大写的代码中。你能帮我解决这个问题吗,因为我无法解决这个问题?任何使这成为可能的事情都会有所帮助。

请随时更改我的代码并尝试获取我的输出。

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

你的第一个问题是你把所有东西都塞进了一个巨大的函数中。您需要将代码拆分为有意义的单元,每个单元执行定义明确、易于理解的操作。对于大写单词的具体问题,我推荐一个函数int capitalizedWordStreakLength(String[] tokens, int i)。您可以在循环中使用该函数,该循环List<String>通过迭代String[]您的“原始”标记来组装结果标记,如果该函数返回四个或更多,则将这些单词连接到单个标记中。

于 2012-08-15T16:35:28.833 回答