我正在阅读2个文件:一个名为myFile
,另一个名为dictionary
。
在字典中,每个单词都有2个值。
所以,我读了myFile
中的句子,并将它们标记为每个单词的值。
我的代码运行如下:
while ((text = file.readLine()) != null){//read myFile content line by line
ArrayList<String> content = new ArrayList<String>();
StringTokenizer str = new StringTokenizer(text);//split line content
while (str.hasMoreTokens()) {
String token = str.nextToken();
content.add(token);
}//create an array to store the content of line
//define subjective of each line
boolean subjective = false;
//compare from file content with SentiWordNet
for (int i=0; i<content.size(); i++){
String cont = content.get(i);
while((line = csv.readLine()) != null)
{
//read line from SentiWordNet
String[] data = line.split("\t");
//read data SentiWordnet
String sentiWord = data[4];
if (sentiWord.contains(cont)){
if (data[2] != "0" || data[3] != "0")
subjective = true;
}
}
}
System.out.println(subjective);
}
file
myFile
为句子,csv
为dictionary
。
现在的问题是只有myFile
中的第一个令牌执行比较,而其他令牌则没有。
知道如何解决?
答案 0 :(得分:0)
看起来你没有关闭字典。这行代码:
while((line = csv.readLine()) != null)
第一次到达字典结尾时(即myFile中的第一个单词),将开始失败。对于后续的话,它会立即失败,因为你还没有关闭/重新打开文件。
修改强>
在查看代码时,您试图通过阅读myFile
中的每个句子并循环查看句子中的每个单词来确定某个单词是否具有主观性,并且对于每个单词,请阅读dictionary
。如果您的myFile
包含许多句子和单词,您将多次阅读字典(可能很大),这似乎效率低下。
例如,如果有s
个句子,每个句子都有w
个字词,那么您将打开并阅读整个字典s*n
次。
或者,您可以在整个myFile
中读取长度为s
的句子数组,或甚至读成长度为n*w
的单词数组。这将占用n*w
的顺序内存(您当前的算法仅占用w
内存,因为您正在创建单个数组以将单词存储在句子中,并为每个句子重复使用此数组) 。然后,在字典中读一次,并对字典中的每个单词,看看它是否在单词/句子数组中。
更好的方法会花费更多的内存(假设你的字典大于myFile
)可能是将整个字典读入内存并对其进行排序。然后,阅读myFile
并使用有效搜索找到内存中字典中的每个单词。假设你的文件太大,应该快得多。