如何计算java中的单词

时间:2009-12-31 01:56:58

标签: java algorithm

我正在寻找可以解决以下问题的算法,提示或任何源代码。

我有一个包含许多文本文件的文件夹。我读了它们并将所有文本存储在STRING中。现在我想计算,如果任何单词出现在其他文件中或没有。 (我知道不清楚让我举个例子)

例如,我有两个文件: Doc A => “棕色狐狸跳” Doc B => “狗不跳” Doc C => “狐狸跳狗”

让我们说我的程序读了第一个文件,现在第一个单词是“棕色”,现在我的程序会检查这个单词是否也出现在任何其他文件中?所以答案是0.现在它将再次检查第二个单词“fox”,它会给出输出,它出现在(Doc C)所以...... 现在它将读取Doc B,它将检查狗是否出现在其他文件中?答案是(Doc C)等......

任何建议或伪代码?

提示:它也称为逆文档频率(Idf)。我知道什么是idf。

6 个答案:

答案 0 :(得分:6)

像GregS所说,使用HashMap。我没有发布任何代码,因为我认为这是一个功课,我想给你机会自己创建它,但大纲是:

  1. 打开新文档
  2. 对于每个单词,如果已经存在,请查看您的hashmap。如果不是,请使用此单词在HashMap中创建一个新密钥,并在该位置添加新文档(文件名)。如果是,只需添加文档的文件名。
  3. 例如,如果你有: DocA:布朗狐狸跳 DocB:Fox跳狗

    您将打开DocA并遍历其内容。 'brown'不在您的hashmap中,因此您将添加一个键为'brown'且值为'DocA'的新元素。与“狐狸”和“跳跃”相同。 然后你会打开DocB。 'fox'已经在你的hashmap中了,所以你要添加它的值DocB(值为'DocA DocB')。也许使用ArrayList(在Java中)会有所帮助。

答案 1 :(得分:5)

提示:HashMap将字符串映射到文件列表。

答案 2 :(得分:2)

根据'我可以将所有文档中的这组单词放在一起''可能会有所帮助。我可以以某种方式存储每个文档中的每个文档这些单词出现'。鉴于您的数据的这种表示,很容易确定给定的单词是否出现在多个文档中。关于如何做到这一点,其他人在这里提供了提示。

答案 3 :(得分:2)

只是另一个想法与所有有价值的答案不同,我承认哈希看起来更好,我只想从另一个角度看待它。

我会对每个文档中的所有单词进行排序,并将每个文档相互比较。

例如docA>棕色,狐狸,跳跃; docB-> doc,jump,not docC->狗,狐狸,跳

比较它们就像这样

 until there is a single document with words
   get first element of documents
   compare the most descending first element if that element exists more than once reserve it
   throw the one that is the most descending (in my case)

所以在第一次比较中

docA - >狐狸,跳 docB - > doc,jump,not docC - >狗,狐狸,跳

在第二次比较中

docA - >狐狸,跳 docB - >跳,不是 docC - >狗,狐狸

在第三次比较中

docA - >狐狸,跳 docB - >跳,不是 docC - >狐狸,跳

在第4场比赛中保留狐狸,在第5场比赛中保留跳跃。

答案 4 :(得分:1)

HashMap将字符串映射到整数。整数是不可变的,因此有一些“增量”的喧嚣,但不是太多。你可以覆盖put()方法。

答案 5 :(得分:1)

此代码将所有不同的单词作为键返回,并计为句子中找到的每个单词的值。只需从文件或命令提示符创建一个String对象作为输入,并在下面的方法中传递它。

public Map<String,Integer> getWordsWithCount(String sentances)
{
    Map<String,Integer> wordsWithCount = new HashMap<String, Integer>();

    String[] words = sentances.split(" ");
    for (String word : words)
    {
        if(wordsWithCount.containsKey(word))
        {
            wordsWithCount.put(word, wordsWithCount.get(word)+1);
        }
        else
        {
            wordsWithCount.put(word, 1);
        }

    }

    return wordsWithCount;

}