gpt4 book ai didi

java - 处理文本以仅使用数组在 Java 中构建字典?

转载 作者:行者123 更新时间:2023-11-30 06:56:53 25 4
gpt4 key购买 nike

我是 Java 初学者,刚开始从事数据挖掘工作。我正在构建一个处理一段文本(article.txt 文件)的程序,它显示 article.txt 的原始单词(例如,无论单词“the”出现多少次,它只会显示一次)和还显示了原始单词的出现次数(例如“the”出现了 120 次)。

这个想法是尝试总结文本数据,让人们通过查看出现次数最多的单词来理解它。我觉得我的问题在于找到原文。

这是我到目前为止所做的:

BufferedReader br = new BufferedReader(new FileReader("article.txt"));
int bufferLength = 1000000;
char[] buffer = new char[bufferLength];
int charsRead = br.read(buffer, 0, bufferLength);
br.close();
String text = new String(buffer);
text = text.toLowerCase();
String[] words = text.split(" ");

int z = 0;

// # OF WORDS IN TEXT
for (int i = 0; i < words.length; i++) {
words[i] = words[i].trim();
}
System.out.println("There are " + words.length + " words in this text.");


String[] uniqueWordArray = new String[412]; // To store unique words
int[] uniqueWordArrayCount = new int[z]; // To store # of unique words

for(int i = 0; i < words.length; i++) {
// char[] convertedText = text.toCharArray();

// FINDING UNIQUE WORDS AND ADDING THEM TO AN ARRAY
if(Arrays.asList(text).contains(words[i]) && !Arrays.asList(uniqueWordArray).contains(words[i])) {

int x = (int)(Math.random()*211);
uniqueWordArray[x] = words[i];
z++; // see uWACount value
}
else {
z++;
}
}
System.out.print(Arrays.toString(uniqueWordArray));
System.out.print(Arrays.toString(uniqueWordArrayCount));

老实说,我不知道我在寻找唯一/原始词方面出了什么问题,我在几次尝试后写了一些伪代码:

For every word in text
if word exists in original/unique word array
Increment corresponding count in unique word count array
else
Add new unique word in original/unique word array
Increment corresponding count in unique word count array

有什么建议吗?您认为我在原始代码中做错了什么?

注意: 目前的答案是指使用不同的导入和库,我正在尝试使用数组(可能是二维数组)来解决这个问题,没有列表、哈希表等,因为我我已经看到其他新手只用数组编写类似的程序,而且我花了几天时间试图弄清楚这一点,所以我感到内疚。我明白这是一种限制,但我觉得如果我用它来应对挑战,我会变得更好。

最佳答案

您可以使用 java.io.StreamTokenizer 从文件中读取单词并将它们存储在 Map 中,您还可以在其中对它们进行计数。

    StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(new FileInputStream("article.txt"))));
st.whitespaceChars(' ', '/');
st.wordChars('a', 'Z');
Map<String, Integer> wordMap = new HashMap<String, Integer>();
int token;
do {
token = st.nextToken();
if (token == StreamTokenizer.TT_WORD) {
String word = st.sval.toLowerCase();
int count = 0;
if (wordMap.containsKey(word))
count = wordMap.get(word);
wordMap.put(word, count + 1);
}
}
while (token != StreamTokenizer.TT_EOF);

for (String word : wordMap.keySet()) {
System.out.println(word + ": " + wordMap.get(word));
}

如果您真的坚持不使用 HashMap,这里是仅使用普通数组的实现。然而,它的效果较差。

    StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(new FileInputStream("article.txt"))));
st.whitespaceChars(' ', '/');
st.wordChars('a', 'Z');

int maxSize = 400;
String[] words = new String[maxSize];
int[] counts = new int[maxSize];
int length = 0;
int token;
do {
token = st.nextToken();
if (token == StreamTokenizer.TT_WORD) {
String word = st.sval.toLowerCase();
boolean newWord = true;
for (int i = 0; i < length; i++)
{
if (words[i].equals(word))
{
counts[i]++;
newWord = false;
break;
}
}
if (newWord) {
words[length] = word;
counts[length] = 1;
length++;
}
}
}
while (token != StreamTokenizer.TT_EOF);

for (int i = 0; i < length; i++) {
System.out.println(words[i] + ": " + counts[i]);
}

它不检查数组的最大长度,因此您需要在向其中添加值之前对其进行验证,并在需要时创建更大的数组。这是非常无效的实现。

关于java - 处理文本以仅使用数组在 Java 中构建字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com