如何计算一行中特定单词的频率?

时间:2010-11-16 23:17:02

标签: java string

我想知道,如果我有一个单行字符串,那么如何使用简单的java代码计算该字符串中特定单词的频率?!

提前致谢..


我正在寻找的是java中的示例逻辑代码,用于搜索句子中的特定单词。我正在构建一个垃圾邮件过滤器,需要读取该行然后对其进行分类。

7 个答案:

答案 0 :(得分:9)

来自StringUtils

commons-lang已:

StringUtils.countMatches(string, searchedFor);

答案 1 :(得分:4)

您可以使用正则表达式。代码的一个例子是:

public int count(String word, String line){
    Pattern pattern = Pattern.compile(word);
    Matcher matcher = pattern.matcher(line);
    int counter = 0;
    while (matcher.find())
        counter++;
    return counter;
}

答案 2 :(得分:3)

首先按空格分割(参见String#split

然后使用地图以频率映射单词。

String [] words = line.split(" ");

Map<String,Integer> frequency = new Map <String,Integer>();

for (String word:words){

    Integer f = frequency.get(word);
    frequency.put(word,f+1);
}

然后你可以找到一个特定的单词:

frequency.get(word)

答案 3 :(得分:2)

使用Guava库:

  1. MultiSet 在需要所有单词的计数时使用

    String line="Hello world bye bye world";
    Multiset<String> countStr=HashMultiset.create(Splitter.on(' ').split(line)); 
    System.out.println(countStr.count("Hello")); //gives count of the word 'Hello'
    
  2. Iterators 在只需要几个字的情况下使用

    String line="Hello world bye bye world";
    Iterable<String> splitStr=Splitter.on(' ').split(line);
    System.out.println(Iterables.frequency(splitStr, "Hello"));
    

答案 4 :(得分:1)

经过谷歌搜索和一点点研究后我得到了这些东西__可能会有所帮助

String str="hello new demo hello";
Map<String,Integer> hmap= new HashMap<String,Integer>();
for(String tempStr : str.split(" "))
{
  if(hmap.containsKey(tempStr))
  {
     Integer i=hmap.get(tempStr);
     i+=1;
     hmap.put(tempStr,i);
  }
  else
     hmap.put(tempStr,1);
}
System.out.println(hmap);

答案 5 :(得分:0)

有几种方法:

  1. 使用拆分
  2. 使用标记器
  3. 使用正则表达式
  4. 使用良好的旧循环和字符串操作(即indexOf()等)
  5. 选项1&amp; 2有一个开销,试图弄清楚你的单词是否恰好是最后一行(并且需要添加额外的计数)

    选项3要求您能够形成正则表达式语法

    选项4是陈旧的

答案 6 :(得分:0)

获取字符串数组后,您可以尝试从Java 10开始的以下代码。它使用流来获取频率图。

import java.util.Arrays;
import java.util.stream.Collectors;

public class StringFrequencyMap {
    public static void main(String... args) {
        String[] wordArray = {"One", "two", "three", "one", "two", "two", "three"};
        var freqCaseSensitive = Arrays.stream(wordArray)
                         .collect(Collectors.groupingBy(x -> x, Collectors.counting()));
        //If you want case insensitive then use
        var freqCaseInSensitive = Arrays.stream(wordArray)
                .collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));

        System.out.println(freqCaseSensitive);
        System.out.println(freqCaseInSensitive);
        System.out.println("Frequency of \"two\" is: "+freqCaseInSensitive.get("two"));
    }
}

输出将是:

{one=1, One=1, three=2, two=3}
{one=2, three=2, two=3}
Frequency of "two" is: 3