【问题标题】:How to check and count if a word in a linkedHashset appears in a sentence from an arraylist?如何检查和计算linkedHashset中的单词是否出现在arraylist的句子中?
【发布时间】:2016-08-12 08:58:38
【问题描述】:

我已经被这个问题困扰了几天。例如,我希望能够检查和计算 uniqueBagOfWords 中的每个单词是否出现在一个句子中,

UniqueBagOfWords = [i, like, to, play, 网球, think, football, needs, big, changes]

输出将是-

句子 - 我喜欢打网球 = 1,1,1,1,0,0,0,0,0

sentence - i like football like = 1,2,0,0,0,0,1,0,0,0

public static void main(String[] args) {
        List<String> sentences = new ArrayList<String>();
        sentences.add("i like to play tennis");
        sentences.add("i think football needs big changes");
        sentences.add("i like football like");

List<String[]> bagOfWords = new ArrayList<String[]>();
    for(String str : sentences){
        bagOfWords.add(str.split(" "));

    }
    Set<String> uniqueBagOfWords = new LinkedHashSet<String>();
    for(String[] s : bagOfWords){
        for(String ss : s)
            for(String st : ss.split(" "))
                if(!uniqueBagOfWords.contains(st))
                    uniqueBagOfWords.add(st);

    }

我已经尝试过了,我知道它不对,但不知道从这里去哪里。任何帮助都会很棒!

for(String s : sentences){
        for(String ss : s.split(" ")){
            int count= 0;
            for(int loop=0; loop <uniqueBagOfWords.size(); loop++){
            if(uniqueBagOfWords.contains(ss)){
                count +=1;
            }



            }
            System.out.println(ss +" "+ count);

【问题讨论】:

  • 为什么还要使用 set 呢?你可以用arraylist来做。
  • 如何从“我喜欢打网球”得到1,1,1,1,0,0,0,0,0?不应该有5个,因为“网球”在包里?
  • 你有一个哈希集。你不需要遍历它。只需使用contains()

标签: java string arraylist hashset word-count


【解决方案1】:

我认为数组是错误的数据结构。更好的选择是简单地绘制袋子中每个单词的计数图,这是一个单行:

Map<String, Integer> hits = Arrays.stream(sentence.split(" "))
   .filter(uniqueBagOfWords::contains)
   .collect(groupingBy(identity()), counting());

这将产生类似:

{i=1, like=2, football=1}

这看起来要简单得多。如果您绝对必须有一个(稀疏)数组,则可以将其创建为单独的步骤。

【讨论】:

    【解决方案2】:

    在这里,我只是为词袋制作了一个字符串数组,并将所有句子放入一个数组列表中。然后我做了一个比较,检查句子中特定位置的字母是否与 bagOfWords 数组中的位置匹配。

    public static void main(String[] args) {
        String[] bagOfWords = {"i", "like", "to", "play", "tennis", "think", "football", "needs", "big", "changes"};
    
        List<String> sentences = new ArrayList<String>();
        sentences.add("i like to play tennis");
        sentences.add("i think football needs big changes");
        sentences.add("i like football");
    
        for(String s1 : sentences){
            String[] sentenceSplit = splitWords(s1);
    
            for(int i=0;i<sentenceSplit.length;i++){
                if(sentenceSplit[i].equals(bagOfWords[i])){
                    System.out.print("1 ");
                }
                else{
                    System.out.print("0 ");
                }
            }
            System.out.println("");
        }
    }
    
    private static String[] splitWords(String sentence){
        String[] afterSplit = sentence.split(" ");
        return afterSplit;
    }
    

    【讨论】:

    • 你已经把一个 O(N) 问题变成了一个 O(N^2) 问题。您应该遍历调用Set.contains()sentence,在散列集的情况下为O(1)
    • 即使使用包含,也必须检查单词是否在正确的位置。为此,我认为您需要将句子分解为单词。或者你可以用套装来做吗?我很困惑。
    【解决方案3】:

    尝试循环遍历您的 hashSet,而不是句子中的每个单词。另外,我会使用 StringBuilder 或类似的东西来输出。看看下面的循环:

        for (String s : sentences) {
    
            StringBuilder numberOfOccurences = new StringBuilder();
    
            for (String word : uniqueBagOfWords) {
                if (s.contains(word)) {
                    numberOfOccurences.append("1,");
                } else {
                    numberOfOccurences.append("0,");
                }
            }
    
            System.out.println(s + " = " + numberOfOccurences);
        }
    

    输出:

    我喜欢打网球 = 1,1,1,1,1,0,0,0,0,0,

    我认为足球需要大的改变 = 1,0,0,0,0,1,1,1,1,1,

    我喜欢足球 = 1,1,0,0,0,0,1,0,0,0,

    【讨论】:

    • 如何更新此代码以便计算单词出现的次数?例如,如果足球在一个句子中出现两次,它会打印 2。谢谢!
    • 当哈希集有 O(1) contains() 方法时,为什么要反转代码并循环遍历它?
    猜你喜欢
    • 2022-06-19
    • 1970-01-01
    • 2012-01-06
    • 2021-12-11
    • 2021-12-02
    • 2020-09-06
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多