diff --git a/lib/dict.js b/lib/dict.js index 7713e5d..39f571d 100644 --- a/lib/dict.js +++ b/lib/dict.js @@ -3,7 +3,7 @@ var LEFT = 0; var RIGHT = 1; var path = require("path"); var glob = require("glob"); - +var createPrefixTree = require("./prefixtree").createPrefixTree; var WordcutDict = { @@ -41,6 +41,7 @@ var WordcutDict = { finalizeDict: function(){ this.dict = this.sortuniq(this.dict); + this.tree = createPrefixTree(this.dict.map(w => [w, null])) }, addFiles: function(files, finalize){ @@ -93,38 +94,31 @@ var WordcutDict = { }, createAcceptor: function () { + let dict = this; return { - l: 0, - r: this.dict.length - 1, + nodeId: 0, strOffset: 0, isFinal: false, - dict: this, - transit: function (ch) { - return this.dict.transit(this, ch); - }, isError: false, tag: "DICT", w: 1, - type: "DICT" + type: "DICT", + dict: dict, + + transit(ch) { + return this.dict.transit(this, ch) + } }; }, transit: function (acceptor, ch) { - var l = this.dictSeek(acceptor.l, - acceptor.r, - ch, - acceptor.strOffset, - LEFT); - if (l !== null) { - var r = this.dictSeek(l, - acceptor.r, - ch, - acceptor.strOffset, - RIGHT); - acceptor.l = l; - acceptor.r = r; - acceptor.strOffset++; - acceptor.isFinal = this.isFinal(acceptor); + let child = this.tree.lookup(acceptor.nodeId, acceptor.strOffset, ch) + if (child !== null) { + + let [nodeId, isFinal, payload] = child + acceptor.nodeId = nodeId + acceptor.strOffset++ + acceptor.isFinal = isFinal } else { acceptor.isError = true; } diff --git a/test/tests.js b/test/tests.js index 4a36772..1370aa5 100644 --- a/test/tests.js +++ b/test/tests.js @@ -133,5 +133,4 @@ describe("Wordcut", function() { expect(segmentedResult).to.deep.equal(["ฉัน","ชอบ","กิน","ข้าว"]) }); - });