【问题标题】:generate and output all possible combinations, from three List<String> only once per unique item从三个 List<String> 生成并输出所有可能的组合,每个唯一项目仅一次
【发布时间】:2023-03-18 15:45:02
【问题描述】:

我正在尝试生成所有可能的句子组合。作为变量,我有两个字符串,一个字符串将是主题,例如health 一个是对象,例如fruit,但随后我将有一个与一个“头”字相关联的值的List&lt;String&gt;,因此为了与刚才提到的两个组件保持一致,它们将与列表[improve, change, alter, modify]。我想生成这些句子的所有可能组合,并将每个组合添加到List&lt;Sentences&gt;,如下所示:

Sentence example_sentence = new Sentence(verb, object, subject);
sentences.add(example_sentence);

现在发生这种情况的较大函数如下所示:

public Sentence dataPreprocessing(String raw_subject, String raw_object, String raw_verb, List<Sentence> sentences) throws IOException {
    WordNet wordnet = new WordNet();
    String verb = wordnet.getStem(raw_verb);
    String object = wordnet.getStem(raw_object);        
    String subject = wordnet.getStem(raw_subject);
    List<String> verb_hypernym_container = new ArrayList<>();       
    verb_hypernym_container = wordnet.getHypernyms(verb, POS.VERB);
    //wordnet.getHypernyms(this.object, POS.NOUN);  
    //wordnet.getHypernyms(this.subject, POS.NOUN); 
    Sentence return_sentence = new Sentence( verb, object, subject );
    return return_sentence;
}

我怎样才能最有效地实现生成所有可能句子的目标?

【问题讨论】:

    标签: java string arraylist combinatorics


    【解决方案1】:

    由于您有固定数量的列表,最简单的方法就是使用嵌套循环:

    List<Sentence> sentences = new ArrayList<>();
    
    for(String verb_hypernym : wordnet.getHypernyms(verb, POS.VERB))
        for(String object_hypernym : wordnet.getHypernyms(object, POS.NOUN))
            for(String subject_hypernym : wordnet.getHypernyms(subject, POS.NOUN))
                sentences.add(new Sentence(verb_hypernym, object_hypernym, subject_hypernym));
    
    return sentences;
    

    或者,为了避免过于频繁地致电getHypernyms

    List<String> verb_hypernyms = wordnet.getHypernyms(verb, POS.VERB);
    List<String> object_hypernyms = wordnet.getHypernyms(object, POS.NOUN);
    List<String> subject_hypernyms = wordnet.getHypernyms(subject, POS.NOUN);
    
    
    for(String verb_hypernym : verb_hypernyms)
        for(String object_hypernym : object_hypernyms)
            for(String subject_hypernym : subject_hypernyms)
                sentences.add(new Sentence(verb_hypernym, object_hypernym, subject_hypernym));
    
    return sentences;
    

    【讨论】:

    • 每个列表不止一次生成同一个句子,是否可以使用类似的结构但每个列表只保留一次?
    • @Joao.da.Silva 你是什么意思,每个列表一个?
    • 因为我不想在一个列表中多次生成相同组合中的相同单词
    • @Joao.da.Silva 这不应该发生,除非您的某些上位词列表多次包含同一个词。
    • @João.da.Silva 如果您的意思是最终的句子列表不能包含重复项,那么最简单的方法是将其设为集合而不是列表。
    【解决方案2】:

    一旦你有了一个名词和动词列表,你就可以使用流来返回一个句子列表。这也让您有机会删除任何重复项、排序或您需要对流执行的任何其他操作。

    List<Sentence> sentences = subjectList.stream()
            .flatMap(object -> verbList.stream()
                .flatMap(verb -> objectList.stream()
                    .map(subject -> new Sentence(object, verb, subject))))
            .distinct()
            .collect(Collectors.toList());
    

    【讨论】:

    • 但是我可以用三个列表来完成吗,verbs 之一,objects 之一和subjects 之一?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多