1/* 2 * Copyright (C) 2008-2012 OMRON SOFTWARE Co., Ltd. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package jp.co.omronsoft.openwnn; 18 19import java.lang.StringBuffer; 20import java.util.ArrayList; 21import java.util.Iterator; 22 23/** 24 * The container class of a sentence. 25 * 26 * @author Copyright (C) 2009, OMRON SOFTWARE CO., LTD. All Rights Reserved. 27 */ 28public class WnnSentence extends WnnWord { 29 /** The array of clauses */ 30 public ArrayList<WnnClause> elements; 31 32 /** 33 * Constructor 34 * 35 * @param input The string of reading 36 * @param clauses The array of clauses of this sentence 37 */ 38 public WnnSentence(String input, ArrayList<WnnClause> clauses) { 39 if (clauses == null || clauses.isEmpty()) { 40 this.id = 0; 41 this.candidate = ""; 42 this.stroke = ""; 43 this.frequency = 0; 44 this.partOfSpeech = new WnnPOS(); 45 this.attribute = 0; 46 } else { 47 this.elements = clauses; 48 WnnClause headClause = (WnnClause)clauses.get(0); 49 50 if (clauses.size() == 1) { 51 this.id = headClause.id; 52 this.candidate = headClause.candidate; 53 this.stroke = input; 54 this.frequency = headClause.frequency; 55 this.partOfSpeech = headClause.partOfSpeech; 56 this.attribute = headClause.attribute; 57 } else { 58 StringBuffer candidate = new StringBuffer(); 59 Iterator<WnnClause> ci = clauses.iterator(); 60 while (ci.hasNext()) { 61 WnnClause clause = ci.next(); 62 candidate.append(clause.candidate); 63 } 64 WnnClause lastClause = (WnnClause)clauses.get(clauses.size() - 1); 65 66 this.id = headClause.id; 67 this.candidate = candidate.toString(); 68 this.stroke = input; 69 this.frequency = headClause.frequency; 70 this.partOfSpeech = new WnnPOS(headClause.partOfSpeech.left, lastClause.partOfSpeech.right); 71 this.attribute = 2; 72 } 73 } 74 } 75 76 /** 77 * Constructor 78 * 79 * @param input The string of reading 80 * @param clause The clauses of this sentence 81 */ 82 public WnnSentence(String input, WnnClause clause) { 83 this.id = clause.id; 84 this.candidate = clause.candidate; 85 this.stroke = input; 86 this.frequency = clause.frequency; 87 this.partOfSpeech = clause.partOfSpeech; 88 this.attribute = clause.attribute; 89 90 this.elements = new ArrayList<WnnClause>(); 91 this.elements.add(clause); 92 } 93 94 /** 95 * Constructor 96 * 97 * @param prev The previous clauses 98 * @param clause The clauses of this sentence 99 */ 100 public WnnSentence(WnnSentence prev, WnnClause clause) { 101 this.id = prev.id; 102 this.candidate = prev.candidate + clause.candidate; 103 this.stroke = prev.stroke + clause.stroke; 104 this.frequency = prev.frequency + clause.frequency; 105 this.partOfSpeech = new WnnPOS(prev.partOfSpeech.left, clause.partOfSpeech.right); 106 this.attribute = prev.attribute; 107 108 this.elements = new ArrayList<WnnClause>(); 109 this.elements.addAll(prev.elements); 110 this.elements.add(clause); 111 } 112 113 /** 114 * Constructor 115 * 116 * @param head The top clause of this sentence 117 * @param tail The following sentence 118 */ 119 public WnnSentence(WnnClause head, WnnSentence tail) { 120 if (tail == null) { 121 /* single clause */ 122 this.id = head.id; 123 this.candidate = head.candidate; 124 this.stroke = head.stroke; 125 this.frequency = head.frequency; 126 this.partOfSpeech = head.partOfSpeech; 127 this.attribute = head.attribute; 128 this.elements = new ArrayList<WnnClause>(); 129 this.elements.add(head); 130 } else { 131 /* consecutive clauses */ 132 this.id = head.id; 133 this.candidate = head.candidate + tail.candidate; 134 this.stroke = head.stroke + tail.stroke; 135 this.frequency = head.frequency + tail.frequency; 136 this.partOfSpeech = new WnnPOS(head.partOfSpeech.left, tail.partOfSpeech.right); 137 this.attribute = 2; 138 139 this.elements = new ArrayList<WnnClause>(); 140 this.elements.add(head); 141 this.elements.addAll(tail.elements); 142 } 143 } 144} 145