2015-01-30 4 views
1

가능한 모든 문장 조합을 생성하려고합니다. 변수로 두 개의 문자열이 있습니다. 하나의 문자열이 대상이됩니다 (예 : health이고 하나는 fruit과 같은 개체가 될 것입니다. 그런 다음 List<String>의 값이 하나의 "머리"단어와 연결되므로 방금 언급 한 두 구성 요소를 유지하면서 목록 [improve, change, alter, modify]과 연결됩니다.은 가능한 모든 조합을 생성하여 3 개의 목록 에서 고유 항목 당 한 번만 생성하고 출력합니다.

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; 
} 

을이 걸리는 장소는 다음과 같습니다되는 큰 기능을 지금

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

: 나는이 문장의 모든 가능한 조합을 생성하고 같은과 함께 List<Sentences>에 각 하나를 추가 할 가능한 모든 문장을 생성하는 목표를 가장 효과적으로 달성하려면 어떻게해야합니까? 필요한 것보다 더 자주 getHypernyms를 호출하지 않도록

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; 

또는 : 당신이 목록의 고정 된 수를 가지고 있기 때문에

답변

2

, 가장 간단한 방법은 중첩 루프를 사용하는 것입니다 당신이 한 번

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; 
+0

같은 문장을리스트마다 두 번 이상 생성하는 비슷한 비슷한 문장을 사용할 수도 있지만 목록 당 한 번만 사용할 수 있습니까? –

+0

@ Joao.da.Silva 목록마다 하나씩 무엇을 의미합니까? – immibis

+0

같이 하나의 목록에 같은 조합으로 동일한 단어를 생성하고 싶지 않다 –

1

명사와 동사 목록을 사용하면 스트림을 사용하여 문장 목록을 반환 할 수 있습니다. 또한 스트림에해야 할 중복, 정렬 또는 다른 것을 제거 할 수있는 기회를 제공합니다.

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

하지만 '객체'중 하나와 '주제'중 하나 인 '동사'중 하나 인 세 개의 목록으로 할 수 있습니까? –

+0

예 - 코드를 변경하겠습니다. – sprinter

+0

이것은 Java 8에서만 작동합니다. –