gpt4 book ai didi

Java:计算单词出现次数,程序计算 'empty'个单词

转载 作者:行者123 更新时间:2023-12-02 08:52:47 25 4
gpt4 key购买 nike

我有一个程序,它从文本文件中获取输入,删除标点符号,然后按单个空格分割并将结果记录到 map 中。我可以让它工作,但我在 map 中也得到一个空结果,而且我不知道给出了什么:

扫描仪接受输入:

try
{
Scanner input = new Scanner(file);
String nextLine;
while (input.hasNextLine())
{
nextLine = input.nextLine().trim();
processLine(nextLine, occurrenceMap);
}
input.close();
}
catch(Exception e) { System.out.println("Something has gone wrong!");}

它所提取的文本文件是詹姆斯国王版本的圣经然后一个单独的函数处理每一行:

//String[] words = line.replaceAll("[^a-zA-Z0-9 ]", " ").toLowerCase().split("\\s+"); // runtime for  bible.txt is ~1600ms

// changed to simple iteration and the program ran MUCH faster:

char[] letters = line.trim().toCharArray();
for (int i=0; i<letters.length; i++)
{
if (Character.isLetterOrDigit(letters[i])) {continue;}
else {letters[i] = ' ';}
}

String punctuationFree = new String(letters);
String[] words = punctuationFree.toLowerCase().split("\\W+");

// add each word to the frequency map:
for (int i=0; i<words.length; i++)
{
if (! map.containsKey(words[i]))
{
map.put(words[i], 1);
}
else
{
int value = (int)map.get(words[i]);
map.put(words[i], ++value);
}
}
正如你所看到的,我首先使用全部替换来完成,然后我想出了自己的时髦迭代方法(似乎运行得更快)。在这两种情况下,当我使用 PrintWriter 打印结果时,我在开头都会收到一个奇怪的条目:

num occurences/ (number /word)

25307 : // what is up with this empty value ?
1 : 000 // the results continue in sorted order
2830 : 1
2122 : 10
6 : 100
9 : 101
29 : 102
23 : 103
36 : 104
46 : 105
49 : 106

我尝试将 String[] Words = punctuationFree.toLowerCase().split("\\W+"); 更改为 .split("\s+") 和 .split("")但我仍然在结果中得到这个空值。

我试图只计算单词和数字的出现次数,为什么我得到这个空值?

更新:根据Character.isLetterOrDigit()可能返回不需要的字符的建议,我重写了检查,以便只获取我想要的字符。尽管如此,我仍然得到一个神秘的空值:

for (int i=0; i<letters.length; i++)
{
if ((letters[i] >= 'a' && letters[i] <= 'z') ||
(letters[i] >= 'A' && letters[i] <= 'Z'))
{continue;}
else if (letters[i] >= '0' && letters[i] <= '9')
{continue;}
else if ((letters[i] == ' ')||(letters[i] =='\n')||(letters[i] == '\t'))
{continue;}
else
letters[i] = ' ';
}

最佳答案

只是猜测,但字符方法 IsLetterOrDigit 被定义为在整个 unicode 范围内工作。根据文档page ,它包括所有“有效字母和十进制数字是 UnicodeCategory 中以下类别的成员:UppercaseLetter、LowercaseLetter、TitlecaseLetter、ModifierLetter、OtherLetter 或 DecimalDigitNumber。”

我认为此方法保留了您不想要的字符(特别是 ModifierLetter 和/或 OtherLetter),并且这些字符未包含在您的字体中,因此您看不到它们。

编辑 1:我测试了你的算法。事实证明,空行绕过了您的测试,因为它跳过了 for 循环。您需要在从文件行读取一行后添加行长度:

if (nextLine.length() == 0) {continue;}

编辑 2:此外,由于您正在扫描每个字符以清除“非单词和非数字”,因此您还可以合并逻辑来创建单词并将其添加到 Collection 。也许像这样:

private static void WordSplitTest(String line) {
char[] letters = line.trim().toCharArray();

boolean gotWord = false;

String word = "";

for (int i = 0; i < letters.length; i++) {
if (!Character.isLetterOrDigit(letters[i])) {

if(!gotWord) {continue;}

gotWord = false;

AddWord(word);
}
if (gotWord) {
word += Character.toString(letters[i]);
}
}
}

private static void AddWord(String word) {
if (!map.containsKey(word)) {
map.put(word, 1);
} else {
int value = (int) map.get(word);
map.put(word, ++value);
}
}

关于Java:计算单词出现次数,程序计算 'empty'个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60676130/

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