2012-08-15 36 views
-1

下面的代碼用於java中的標記化。我有一個小錯誤,我只是無法修復。這是關於文件標記。在此代碼中,如果用戶在文件中輸入四個大寫單詞。它不應該被標記,並且應該保留在同一行。如果沒有大寫字母或任何其他字符,其餘的詞必須標記。java中的文件標記化

例如

美利堅合衆國 您好我是沃爾特。

該O/P應該看起來像下面這樣。

美利堅合衆國

上午

沃爾特。

這是它的樣子。在我編寫代碼之後,我正面臨着一個小錯誤。 O/P顯示如此。

美利堅合衆國

美國

美國

上午

Walt。

基本上我需要擺脫「美國國家」。在我正在檢查大寫字母的那段代碼中。你能幫我解決這個問題,因爲我只是無法解決這個問題嗎?任何事情都可能會有所幫助。

請隨時更改我的代碼並嘗試獲取我的輸出。

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()); 
    } 
    } 
} 
+2

因此,200多行代碼中的某個地方是我們應該查看的部分? – 2012-08-15 16:24:09

+0

答案提示:這是家庭作業,它不適合提供完整的解決方案,只提示。 – 2012-08-15 16:26:06

+2

將您的代碼集中到[Short,Self Contained,Correct(Compilable),Example](http://sscce.org/),我們需要解決這個問題。 – 2012-08-15 16:26:17

回答

1

你的第一個問題是你將所有東西都塞進一個巨大的函數中。您需要將代碼拆分爲有意義的單元,每個單元執行定義明確,易於理解的操作。對於大寫字的特定問題,我推薦一個功能int capitalizedWordStreakLength(String[] tokens, int i)。您可以在循環中使用該函數,該函數通過迭代「原始」標記的String[]來彙集結果標記的List<String>,如果該函數返回四個或更多標記,則將這些單詞連接成單個標記。