java中的文件标记化

时间:2012-08-15 16:11:30

标签: java tokenize

以下代码用于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());
    }
  }
}

1 个答案:

答案 0 :(得分:1)

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