ViterbiNode用のArrayListの生成を実際に必要になるまで遅延
@@ -13,7 +13,9 @@ | ||
13 | 13 | * 形態素解析を行うクラス |
14 | 14 | */ |
15 | 15 | public final class Tagger { |
16 | - private static final ArrayList<ViterbiNode> BOS_NODES = new ArrayList<ViterbiNode>(1); | |
16 | + static class ViterbiNodeList extends ArrayList<ViterbiNode> {} | |
17 | + | |
18 | + private static final ViterbiNodeList BOS_NODES = new ViterbiNodeList(); | |
17 | 19 | static { |
18 | 20 | BOS_NODES.add(ViterbiNode.makeBOSEOS()); |
19 | 21 | } |
@@ -86,15 +88,12 @@ | ||
86 | 88 | |
87 | 89 | private ViterbiNode parseImpl(CharSequence text) { |
88 | 90 | final int len = text.length(); |
89 | - final ArrayList<ArrayList<ViterbiNode>> nodesAry = new ArrayList<ArrayList<ViterbiNode>>(len+1); | |
91 | + final ViterbiNodeList[] nodesAry = new ViterbiNodeList[len+1]; | |
92 | + nodesAry[0] = BOS_NODES; | |
90 | 93 | |
91 | - nodesAry.add(BOS_NODES); | |
92 | - for(int i=1; i <= len; i++) | |
93 | - nodesAry.add(new ArrayList<ViterbiNode>()); | |
94 | - | |
95 | 94 | MakeLattice fn = new MakeLattice(nodesAry); |
96 | 95 | for(int i=0; i < len; i++) { |
97 | - if(nodesAry.get(i).isEmpty()==false) { | |
96 | + if(nodesAry[i] != null) { | |
98 | 97 | fn.set(i); |
99 | 98 | wdc.search(text, i, fn); // 単語辞書から形態素を検索 |
100 | 99 | unk.search(text, i, wdc, fn); // 未知語辞書から形態素を検索 |
@@ -101,7 +100,7 @@ | ||
101 | 100 | } |
102 | 101 | } |
103 | 102 | |
104 | - ViterbiNode cur = setMincostNode(ViterbiNode.makeBOSEOS(), nodesAry.get(len)).prev; | |
103 | + ViterbiNode cur = setMincostNode(ViterbiNode.makeBOSEOS(), nodesAry[len]).prev; | |
105 | 104 | |
106 | 105 | // reverse |
107 | 106 | ViterbiNode head = null; |
@@ -114,7 +113,7 @@ | ||
114 | 113 | return head; |
115 | 114 | } |
116 | 115 | |
117 | - private ViterbiNode setMincostNode(ViterbiNode vn, ArrayList<ViterbiNode> prevs) { | |
116 | + private ViterbiNode setMincostNode(ViterbiNode vn, ViterbiNodeList prevs) { | |
118 | 117 | final ViterbiNode f = vn.prev = prevs.get(0); |
119 | 118 | int minCost = f.cost + mtx.linkCost(f.rightId, vn.leftId); |
120 | 119 |
@@ -131,27 +130,34 @@ | ||
131 | 130 | } |
132 | 131 | |
133 | 132 | private final class MakeLattice implements WordDic.Callback { |
134 | - private final ArrayList<ArrayList<ViterbiNode>> nodesAry; | |
133 | + private final ViterbiNodeList[] nodesAry; | |
135 | 134 | private int i; |
136 | - private ArrayList<ViterbiNode> prevs; | |
135 | + private ViterbiNodeList prevs; | |
137 | 136 | private boolean empty=true; |
138 | 137 | |
139 | - public MakeLattice(ArrayList<ArrayList<ViterbiNode>> nodesAry) { | |
138 | + public MakeLattice(ViterbiNodeList[] nodesAry) { | |
140 | 139 | this.nodesAry = nodesAry; |
141 | 140 | } |
142 | 141 | |
143 | 142 | public void set(int i) { |
144 | 143 | this.i = i; |
145 | - prevs = nodesAry.get(i); | |
144 | + prevs = nodesAry[i]; | |
145 | + nodesAry[i] = null; | |
146 | 146 | empty = true; |
147 | 147 | } |
148 | 148 | |
149 | 149 | public void call(ViterbiNode vn) { |
150 | 150 | empty=false; |
151 | + | |
152 | + final int end = i+vn.length; | |
153 | + if(nodesAry[end]==null) | |
154 | + nodesAry[end] = new ViterbiNodeList(); | |
155 | + ViterbiNodeList ends = nodesAry[end]; | |
156 | + | |
151 | 157 | if(vn.isSpace) |
152 | - nodesAry.get(i+vn.length).addAll(prevs); | |
158 | + nodesAry[end].addAll(prevs); | |
153 | 159 | else |
154 | - nodesAry.get(i+vn.length).add(setMincostNode(vn, prevs)); | |
160 | + nodesAry[end].add(setMincostNode(vn, prevs)); | |
155 | 161 | } |
156 | 162 | |
157 | 163 | public boolean isEmpty() { return empty; } |
@@ -1,7 +1,7 @@ | ||
1 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | 2 | |
3 | 3 | <project name="igo" default="jar" basedir="."> |
4 | - <property name="version" value="0.4.3" /> | |
4 | + <property name="version" value="0.4.4" /> | |
5 | 5 | <property name="src.dir" value="src"/> |
6 | 6 | <property name="classes.dir" value="classes"/> |
7 | 7 | <property name="javadoc.dir" value="docs"/> |