• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * 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, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.android.inputmethod.latin.dicttool;
18 
19 import com.android.inputmethod.latin.makedict.FormatSpec;
20 import com.android.inputmethod.latin.makedict.FusionDictionary;
21 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
22 import com.android.inputmethod.latin.makedict.WeightedString;
23 import com.android.inputmethod.latin.makedict.WordProperty;
24 
25 import java.util.Arrays;
26 import java.util.ArrayList;
27 
28 public class Info extends Dicttool.Command {
29     public static final String COMMAND = "info";
30 
Info()31     public Info() {
32     }
33 
34     @Override
getHelp()35     public String getHelp() {
36         return COMMAND + " <filename>: prints various information about a dictionary file";
37     }
38 
showInfo(final FusionDictionary dict, final boolean plumbing)39     private static void showInfo(final FusionDictionary dict, final boolean plumbing) {
40         System.out.println("Header attributes :");
41         System.out.print(dict.mOptions.toString(2, plumbing));
42         int wordCount = 0;
43         int bigramCount = 0;
44         int shortcutCount = 0;
45         int whitelistCount = 0;
46         for (final WordProperty wordProperty : dict) {
47             ++wordCount;
48             if (wordProperty.mHasNgrams) {
49                 bigramCount += wordProperty.mNgrams.size();
50             }
51             if (null != wordProperty.mShortcutTargets) {
52                 shortcutCount += wordProperty.mShortcutTargets.size();
53                 for (WeightedString shortcutTarget : wordProperty.mShortcutTargets) {
54                     if (FormatSpec.SHORTCUT_WHITELIST_FREQUENCY
55                             == shortcutTarget.getProbability()) {
56                         ++whitelistCount;
57                     }
58                 }
59             }
60         }
61         System.out.println("Words in the dictionary : " + wordCount);
62         System.out.println("Bigram count : " + bigramCount);
63         System.out.println("Shortcuts : " + shortcutCount + " (out of which " + whitelistCount
64                 + " whitelist entries)");
65     }
66 
showWordInfo(final FusionDictionary dict, final String word)67     private static void showWordInfo(final FusionDictionary dict, final String word) {
68         final PtNode ptNode = FusionDictionary.findWordInTree(dict.mRootNodeArray, word);
69         if (null == ptNode) {
70             System.out.println(word + " is not in the dictionary");
71             return;
72         }
73         System.out.println("Word: " + word);
74         System.out.println("  Freq: " + ptNode.getProbability());
75         if (ptNode.getIsNotAWord()) {
76             System.out.println("  Is not a word");
77         }
78         if (ptNode.getIsPossiblyOffensive()) {
79             System.out.println("  Is possibly offensive");
80         }
81         final ArrayList<WeightedString> shortcutTargets = ptNode.getShortcutTargets();
82         if (null == shortcutTargets || shortcutTargets.isEmpty()) {
83             System.out.println("  No shortcuts");
84         } else {
85             for (final WeightedString shortcutTarget : shortcutTargets) {
86                 System.out.println("  Shortcut target: " + shortcutTarget.mWord + " ("
87                         + (FormatSpec.SHORTCUT_WHITELIST_FREQUENCY
88                                 == shortcutTarget.getProbability() ?
89                                         "whitelist" : shortcutTarget.getProbability()) + ")");
90             }
91         }
92         final ArrayList<WeightedString> bigrams = ptNode.getBigrams();
93         if (null == bigrams || bigrams.isEmpty()) {
94             System.out.println("  No bigrams");
95         } else {
96             for (final WeightedString bigram : bigrams) {
97                 System.out.println(
98                         "  Bigram: " + bigram.mWord + " (" + bigram.getProbability() + ")");
99             }
100         }
101     }
102 
103     @Override
run()104     public void run() {
105         if (mArgs.length < 1) {
106             throw new RuntimeException("Not enough arguments for command " + COMMAND);
107         }
108         final boolean plumbing;
109         if ("-p".equals(mArgs[0])) {
110             plumbing = true;
111             mArgs = Arrays.copyOfRange(mArgs, 1, mArgs.length);
112             if (mArgs.length != 1) { // There should be only 1 argument left
113                 throw new RuntimeException("Wrong number of arguments for command " + COMMAND);
114             }
115         } else {
116             plumbing = false;
117         }
118         final String filename = mArgs[0];
119         final boolean hasWordArguments = (1 == mArgs.length);
120         final FusionDictionary dict = BinaryDictOffdeviceUtils.getDictionary(filename,
121                 hasWordArguments /* report */);
122         if (hasWordArguments) {
123             showInfo(dict, plumbing);
124         } else {
125             for (int i = 1; i < mArgs.length; ++i) {
126                 showWordInfo(dict, mArgs[i]);
127             }
128         }
129     }
130 }
131