计算不同单词的数量

时间:2011-06-23 12:57:22

标签: java text-processing

我正在尝试使用Java计算文本中不同单词的数量。

这个词可以是unigram, bigram or trigram noun。这三个已经通过使用Stanford POS tagger找到了,但是我无法计算频率大于等于1,2,3,4和5的单词以及它们的计数。

3 个答案:

答案 0 :(得分:4)

我可能没有正确理解,但如果你需要做的就是计算给定文本中不同单词的数量,具体取决于你从文本中获取需要计算的单词的位置/方式,你可以使用Java.Util.Scanner,然后将单词添加到ArrayList,如果单词已经存在于列表中,则不添加它,然后列表的大小将是不同单词的数量,类似于示例下面:

public ArrayList<String> makeWordList(){
    Scanner scan = new Scanner(yourTextFileOrOtherTypeOfInput);
    ArrayList<String> listOfWords = new ArrayList<String>();

       String word = scan.next(); //scanner automatically uses " " as a delimeter
       if(!listOfWords.contains(word)){ //add the word if it isn't added already
            listOfWords.add(word);
    }

    return listOfWords; //return the list you made of distinct words
}

public int getDistinctWordCount(ArrayList<String> list){
    return list.size();
}

现在如果你真的必须在将它添加到列表之前首先计算单词中的字符数,那么你只需要添加一些语句来检查单词字符串的长度,然后再将它添加到列表中。例如:

if(word.length() <= someNumber){
//do whatever you need to
}

很抱歉,如果我不理解这个问题,只是给了一些蹩脚的无关答案= P,但我希望它有所帮助!

如果你需要跟踪你看到同一个单词的频率,即使你只想计算一次,你也可以创建一个跟踪该频率的变量并将其放入一个列表中,使得索引为频率计数与ArrayList中的索引相同,因此您可以知道频率对应哪个词或更好但使用HashMap,其中键是不同的词,值是其频率(基本上使用相同的代码如上所述,而不是ArrayList使用HashMap并添加一些变量来计算频率:

 public HashMap<String, Integer> makeWordList(){
        Scanner scan = new Scanner(yourTextFileOrOtherTypeOfInput);
        HashMap<String, Integer> listOfWords = new HashMap<String, Integer>();
        Scanner scan = new Scanner(sc);
        while(cs.hasNext())
       {
            String word = scan.next(); //scanner automatically uses " " as a delimeter
            int countWord = 0;
            if(!listOfWords.containsKey(word))
            {                             //add word if it isn't added already
                listOfWords.put(word, 1); //first occurance of this word
            }
            else
            {
                countWord = listOfWords.get(word) + 1; //get current count and increment
                //now put the new value back in the HashMap
                listOfWords.remove(word); //first remove it (can't have duplicate keys)
                listOfWords.put(word, countWord); //now put it back with new value
            }
       }
        return listOfWrods; //return the HashMap you made of distinct words
    }

public int getDistinctWordCount(HashMap<String, Integer> list){
       return list.size();
}

//get the frequency of the given word
public int getFrequencyForWord(String word, HashMap<String, Integer> list){
    return list.get(word);
}

答案 1 :(得分:2)

您可以使用Multiset

  • 在空格上分割字符串
  • 从结果
  • 创建一个新的多重集

这样的东西
String[] words = string.split(" ");
Multiset<String> wordCounts = HashMultiset.create(Arrays.asList(words));

答案 2 :(得分:1)

对于这个问题可以有很多解决方案,但有一顶帽子对我有帮助,就像下面这样简单:

public static int countDistinctWords(String str){
        Set<String> noOWoInString = new HashSet<String>();
        String[] words = str.split(" ");
        //noOWoInString.addAll(words);
    for(String wrd:words){
        noOWoInString.add(wrd);
    }
    return noOWoInString.size();
}

谢谢,Sagar