• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package jp.co.omronsoft.openwnn.EN;
18 
19 import java.util.HashMap;
20 import java.util.ArrayList;
21 
22 import jp.co.omronsoft.openwnn.*;
23 import android.content.SharedPreferences;
24 
25 /**
26  * The OpenWnn engine class for English IME.
27  *
28  * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
29  */
30 public class OpenWnnEngineEN implements WnnEngine {
31     /** Normal dictionary */
32     public static final int DICT_DEFAULT              = 0;
33     /** Dictionary for mistype correction */
34     public static final int DICT_FOR_CORRECT_MISTYPE  = 1;
35     /** Score(frequency value) of word in the learning dictionary */
36     public static final int FREQ_LEARN = 600;
37     /** Score(frequency value) of word in the user dictionary */
38     public static final int FREQ_USER = 500;
39     /** Limitation of predicted candidates */
40     public static final int PREDICT_LIMIT = 300;
41 
42     /** OpenWnn dictionary */
43 	private   WnnDictionary mDictionary;
44     /** Word list */
45     private ArrayList<WnnWord> mConvResult;
46     /** HashMap for checking duplicate word */
47     private HashMap<String, WnnWord> mCandTable;
48     /** Input string */
49     private String        mInputString;
50     /** Searching string */
51     private String        mSearchKey;
52     /** Number of output candidates */
53     private int           mOutputNum;
54     /** The candidate filter */
55     private CandidateFilter mFilter = null;
56 
57     /**
58      * Candidate's case
59      * <br>
60      * CASE_LOWER: all letters are lower.<br>
61      * CASE_HEAD_UPPER: the first letter is upper; others are lower.<br>
62      * CASE_UPPER: all letters are upper.<br>
63      */
64     private int           mCandidateCase;
65     private static final int CASE_LOWER = 0;
66     private static final int CASE_UPPER = 1;
67     private static final int CASE_HEAD_UPPER = 3;
68 
69     /**
70      * Constructor
71      *
72      * @param writableDictionaryName		Writable dictionary file name(null if not use)
73      */
OpenWnnEngineEN(String writableDictionaryName)74     public OpenWnnEngineEN(String writableDictionaryName) {
75         mConvResult = new ArrayList<WnnWord>();
76         mCandTable = new HashMap<String, WnnWord>();
77         mSearchKey = null;
78         mOutputNum = 0;
79 
80         mDictionary = new OpenWnnDictionaryImpl(
81         		"/data/data/jp.co.omronsoft.openwnn/lib/libWnnEngDic.so",
82         		writableDictionaryName);
83         if (!mDictionary.isActive()) {
84         	mDictionary = new OpenWnnDictionaryImpl(
85         			"/system/lib/libWnnEngDic.so",
86         			writableDictionaryName);
87         }
88         mDictionary.clearDictionary( );
89 
90         mDictionary.setDictionary(0, 400, 550);
91         mDictionary.setDictionary(1, 400, 550);
92         mDictionary.setDictionary(2, 400, 550);
93         mDictionary.setDictionary(WnnDictionary.INDEX_USER_DICTIONARY, FREQ_USER, FREQ_USER);
94         mDictionary.setDictionary(WnnDictionary.INDEX_LEARN_DICTIONARY, FREQ_LEARN, FREQ_LEARN);
95 
96         mDictionary.setApproxPattern(WnnDictionary.APPROX_PATTERN_EN_QWERTY_NEAR);
97 
98         mDictionary.setInUseState( false );
99     }
100 
101     /**
102      * Get a candidate.
103      *
104      * @param index		Index of candidate
105      * @return			A candidate; {@code null} if no candidate for the index.
106      */
getCandidate(int index)107     private WnnWord getCandidate(int index) {
108         WnnWord word;
109         /* search the candidate from the dictionaries */
110         while (mConvResult.size() < PREDICT_LIMIT && index >= mConvResult.size()) {
111             while ((word = mDictionary.getNextWord()) != null) {
112                 /* adjust the case of letter */
113                 char c = word.candidate.charAt(0);
114                 if (mCandidateCase == CASE_LOWER) {
115                     if (Character.isLowerCase(c)) {
116                         break;
117                     }
118                 } else if (mCandidateCase == CASE_HEAD_UPPER) {
119                     if (Character.isLowerCase(c)) {
120                         word.candidate = Character.toString(Character.toUpperCase(c)) + word.candidate.substring(1);
121                     }
122                     break;
123                 } else {
124                     word.candidate = word.candidate.toUpperCase();
125                     break;
126                 }
127             }
128             if (word == null) {
129                 break;
130             }
131             /* check duplication */
132             addCandidate(word);
133         }
134 
135         /* get the default candidates */
136         if (index >= mConvResult.size()) {
137             /* input string itself */
138             addCandidate(new WnnWord(mInputString, mSearchKey));
139 
140             /* Capitalize the head of input */
141             if (mSearchKey.length() > 1) {
142                 addCandidate(new WnnWord(mSearchKey.substring(0,1).toUpperCase() + mSearchKey.substring(1),
143                                          mSearchKey));
144             }
145 
146             /* Capitalize all */
147             addCandidate(new WnnWord(mSearchKey.toUpperCase(), mSearchKey));
148         }
149 
150         if (index >= mConvResult.size()) {
151             return null;
152         }
153         return mConvResult.get(index);
154     }
155 
156     /**
157      * Add a word to the candidates list if there is no duplication.
158      *
159      * @param word		A word
160      * @return			{@code true} if the word is added to the list; {@code false} if not.
161      */
addCandidate(WnnWord word)162     private boolean addCandidate(WnnWord word) {
163         if (word.candidate == null || mCandTable.containsKey(word.candidate)) {
164             return false;
165         }
166         if (mFilter != null && !mFilter.isAllowed(word)) {
167         	return false;
168         }
169         mCandTable.put(word.candidate, word);
170         mConvResult.add(word);
171         return true;
172     }
173 
clearCandidates()174     private void clearCandidates() {
175         mConvResult.clear();
176         mCandTable.clear();
177         mOutputNum = 0;
178         mSearchKey = null;
179     }
180 
181     /**
182      * Set dictionary.
183      *
184      * @param type		Type of dictionary (DIC_DEFAULT or DIC_FOR_CORRECT_MISTYPE)
185      * @return			{@code true} if the dictionary is changed; {@code false} if not.
186      */
setDictionary(int type)187     public boolean setDictionary(int type) {
188         if (type == DICT_FOR_CORRECT_MISTYPE) {
189             mDictionary.clearApproxPattern();
190             mDictionary.setApproxPattern(WnnDictionary.APPROX_PATTERN_EN_QWERTY_NEAR);
191         } else {
192             mDictionary.clearApproxPattern();
193         }
194         return true;
195     }
196 
197     /**
198      * Set search key for the dictionary.
199      * <br>
200      * To search the dictionary, this method set the lower case of
201      * input string to the search key. And hold the input string's
202      * capitalization information to adjust the candidates
203      * capitalization later.
204      *
205      * @param input		Input string
206      * @return			{@code true} if the search key is set; {@code false} if not.
207      */
setSearchKey(String input)208     private boolean setSearchKey(String input) {
209         if (input.length() == 0) {
210             return false;
211         }
212 
213         /* set mInputString */
214         mInputString = input;
215 
216         /* set mSearchKey */
217         mSearchKey = input.toLowerCase();
218 
219         /* set mCandidateCase */
220         if (Character.isUpperCase(input.charAt(0))) {
221             if (input.length() > 1 && Character.isUpperCase(input.charAt(1))) {
222                 mCandidateCase = CASE_UPPER;
223             } else {
224                 mCandidateCase = CASE_HEAD_UPPER;
225             }
226         } else {
227             mCandidateCase = CASE_LOWER;
228         }
229 
230         return true;
231     }
232 
233     /**
234      * Set the candidate filter
235      *
236      * @param filter	The candidate filter
237      */
setFilter(CandidateFilter filter)238     public void setFilter(CandidateFilter filter) {
239     	mFilter = filter;
240     }
241 
242     /***********************************************************************
243      * WnnEngine's interface
244      **********************************************************************/
245     /** @see jp.co.omronsoft.openwnn.WnnEngine#init */
init()246     public void init() {}
247 
248     /** @see jp.co.omronsoft.openwnn.WnnEngine#close */
close()249     public void close() {}
250 
251     /** @see jp.co.omronsoft.openwnn.WnnEngine#predict */
predict(ComposingText text, int minLen, int maxLen)252     public int predict(ComposingText text, int minLen, int maxLen) {
253         clearCandidates();
254 
255         if (text == null) { return 0; }
256 
257         String input = text.toString(2);
258         if (!setSearchKey(input)) {
259             return 0;
260         }
261 
262         /* set dictionaries by the length of input */
263         WnnDictionary dict = mDictionary;
264         dict.setInUseState( true );
265 
266         dict.clearDictionary();
267         dict.setDictionary(0, 400, 550);
268         if (input.length() > 1) {
269             dict.setDictionary(1, 400, 550);
270         }
271         if (input.length() > 2) {
272             dict.setDictionary(2, 400, 550);
273         }
274         dict.setDictionary(WnnDictionary.INDEX_USER_DICTIONARY, FREQ_USER, FREQ_USER);
275         dict.setDictionary(WnnDictionary.INDEX_LEARN_DICTIONARY, FREQ_LEARN, FREQ_LEARN);
276 
277         /* search dictionaries */
278         dict.searchWord(WnnDictionary.SEARCH_PREFIX, WnnDictionary.ORDER_BY_FREQUENCY, mSearchKey);
279         return 1;
280     }
281 
282     /** @see jp.co.omronsoft.openwnn.WnnEngine#convert */
convert(ComposingText text)283     public int convert(ComposingText text) {
284         clearCandidates();
285         return 0;
286     }
287 
288     /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */
searchWords(String key)289     public int searchWords(String key) {
290         clearCandidates();
291         return 0;
292     }
293 
294     /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */
searchWords(WnnWord word)295     public int searchWords(WnnWord word) {
296         clearCandidates();
297         return 0;
298     }
299 
300     /** @see jp.co.omronsoft.openwnn.WnnEngine#getNextCandidate */
getNextCandidate()301     public WnnWord getNextCandidate() {
302         if (mSearchKey == null) {
303             return null;
304         }
305         WnnWord word = getCandidate(mOutputNum);
306         if (word != null) {
307             mOutputNum++;
308         }
309         return word;
310     }
311 
312     /** @see jp.co.omronsoft.openwnn.WnnEngine#learn */
learn(WnnWord word)313     public boolean learn(WnnWord word) {
314         return ( mDictionary.learnWord(word) == 0 );
315     }
316 
317     /** @see jp.co.omronsoft.openwnn.WnnEngine#addWord */
addWord(WnnWord word)318     public int addWord(WnnWord word) {
319         WnnDictionary dict = mDictionary;
320         dict.setInUseState( true );
321         dict.addWordToUserDictionary(word);
322         dict.setInUseState( false );
323         return 0;
324     }
325 
326     /** @see jp.co.omronsoft.openwnn.WnnEngine#deleteWord */
deleteWord(WnnWord word)327     public boolean deleteWord(WnnWord word) {
328         WnnDictionary dict = mDictionary;
329         dict.setInUseState( true );
330         dict.removeWordFromUserDictionary(word);
331         dict.setInUseState( false );
332         return false;
333     }
334 
335     /** @see jp.co.omronsoft.openwnn.WnnEngine#setPreferences */
setPreferences(SharedPreferences pref)336     public void setPreferences(SharedPreferences pref) {}
337 
338     /** @see jp.co.omronsoft.openwnn.WnnEngine#breakSequence */
breakSequence()339     public void breakSequence()  {}
340 
341     /** @see jp.co.omronsoft.openwnn.WnnEngine#makeCandidateListOf */
makeCandidateListOf(int clausePosition)342     public int makeCandidateListOf(int clausePosition)  {return 0;}
343 
344     /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */
initializeDictionary(int dictionary)345     public boolean initializeDictionary(int dictionary)  {
346         WnnDictionary dict = mDictionary;
347 
348         switch( dictionary ) {
349         case WnnEngine.DICTIONARY_TYPE_LEARN:
350             dict.setInUseState( true );
351             dict.clearLearnDictionary();
352             dict.setInUseState( false );
353             return true;
354 
355         case WnnEngine.DICTIONARY_TYPE_USER:
356             dict.setInUseState( true );
357             dict.clearUserDictionary();
358             dict.setInUseState( false );
359             return true;
360         }
361         return false;
362     }
363 
364     /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */
initializeDictionary(int dictionary, int type)365     public boolean initializeDictionary(int dictionary, int type) {
366     	return initializeDictionary(dictionary);
367     }
368 
369     /** @see jp.co.omronsoft.openwnn.WnnEngine#getUserDictionaryWords */
getUserDictionaryWords( )370     public WnnWord[] getUserDictionaryWords( ) {
371         WnnDictionary dict = mDictionary;
372         dict.setInUseState( true );
373         WnnWord[] result = dict.getUserDictionaryWords( );
374         dict.setInUseState( false );
375         return result;
376     }
377 
378 }
379