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