├── .gitignore ├── .npmignore ├── History.md ├── Makefile ├── README.md ├── binding.gyp ├── index.js ├── lib └── mmseg.js ├── mmseg-ubuntu.sh ├── mmseg.cc ├── mmseg.h ├── package.json ├── test ├── mmseg.js └── performance.js └── wscript /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.swp 3 | dict/ 4 | build 5 | .lock-wscript 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | support 2 | test 3 | examples 4 | build 5 | .lock-wscript 6 | -------------------------------------------------------------------------------- /History.md: -------------------------------------------------------------------------------- 1 | 2 | 0.0.1 / 2010-01-03 3 | ================== 4 | 5 | * Initial release 6 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | test: 3 | @echo "populate me" 4 | 5 | .PHONY: test -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | mmseg 3 | ========================== 4 | 5 | A nodeJS driver for [libmmseg](http://www.coreseek.cn/opensource/mmseg/) 6 | 7 | ## Install libmmseg 8 | 9 | ###libmmseg on ubuntu 10 | 11 | apt-get install make gcc g++ automake libtool 12 | wget http://www.coreseek.cn/uploads/csft/3.2/mmseg-3.2.14.tar.gz 13 | tar zxvf mmseg-3.2.14.tar.gz 14 | cd mmseg-3.2.14 15 | ./bootstrap 16 | ./configure 17 | make && make install 18 | #Install libmmseg on ubuntu 19 | 20 | ###libmmseg on mac os 21 | 22 | sudo port install autoconf263 libtool-devel m4 autoconf automake libtool 23 | wget http://www.coreseek.cn/uploads/csft/3.2/mmseg-3.2.14.tar.gz 24 | tar zxvf mmseg-3.2.14.tar.gz 25 | cd mmseg-3.2.14 26 | aclocal && glibtoolize --copy --force --ltdl && autoreconf -i -f && automake --a && ./configure && make && sudo make install 27 | 28 | ###Other system 29 | 30 | Please check [the official install document](http://www.coreseek.cn/products-install/) 31 | 32 | ## Install mmseg-node 33 | 34 | #Install mmseg-node with npm 35 | #Set the os env MMSEG_PATH if you configure libmmseg with --prefix 36 | #export MMSEG_PATH=/usr/local/mmseg3 37 | npm install mmseg 38 | 39 | ##Usage 40 | 41 | var mmseg = require("mmseg"); 42 | var q = mmseg.open('/usr/local/etc/'); 43 | console.log(q.segmentSync("我是中文分词")); 44 | 45 | 46 | 47 | ## License 48 | 49 | (The MIT License) 50 | 51 | Copyright (c) 2011 Hidden <zzdhidden@gmail.com> 52 | 53 | Permission is hereby granted, free of charge, to any person obtaining 54 | a copy of this software and associated documentation files (the 55 | 'Software'), to deal in the Software without restriction, including 56 | without limitation the rights to use, copy, modify, merge, publish, 57 | distribute, sublicense, and/or sell copies of the Software, and to 58 | permit persons to whom the Software is furnished to do so, subject to 59 | the following conditions: 60 | 61 | The above copyright notice and this permission notice shall be 62 | included in all copies or substantial portions of the Software. 63 | 64 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 65 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 66 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 67 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 68 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 69 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 70 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 71 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "targets": [ 4 | { 5 | "target_name": "mmseg", 6 | "sources": [ 7 | "mmseg.cc" 8 | ], 9 | "include_dirs": [ 10 | "/usr/local/include/mmseg/" 11 | ], 12 | "cflags_cc": [ 13 | "-fPIC", "-O2", "-pthread", 14 | "-finline", "-finline-small-functions", 15 | "-fomit-frame-pointer", "-momit-leaf-frame-pointer", 16 | "-Wno-unused-function" 17 | ], 18 | "defines": ["NDEBUG"], 19 | "conditions": [ 20 | [ 21 | "OS!='win'", 22 | { 23 | "link_settings": { 24 | "ldflags": ["-Wl,-O3"], 25 | "libraries": ["-lmmseg"] 26 | } 27 | } 28 | ] 29 | ] 30 | } 31 | ] 32 | } 33 | 34 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var mmseg = require("./build/Release/mmseg.node").mmseg; 2 | 3 | module.exports.open = function(file) { 4 | return new mmseg(file); 5 | }; 6 | 7 | /* 8 | * 9 | * Clean 10 | * 11 | * $param array ar 12 | * $return array ar. Only return number, letter, chinese word 13 | * 14 | */ 15 | module.exports.clean =function(ar) { 16 | if( ar && ar.length ){ 17 | var a = []; 18 | for (var i = 0, l = ar.length; i < l; i++) { 19 | if( /^[\u4e00-\u9fa5\da-zA-Z]+$/.test(ar[i]) ) a.push(ar[i]); 20 | }; 21 | ar = a; 22 | } 23 | return ar; 24 | }; 25 | 26 | module.exports.uniq =function(arr) { 27 | var u = {}, a = []; 28 | for(var i = 0, l = arr.length; i < l; ++i){ 29 | if(u.hasOwnProperty(arr[i])) 30 | continue; 31 | a.push(arr[i]); 32 | u[arr[i]] = 1; 33 | } 34 | return a; 35 | } 36 | -------------------------------------------------------------------------------- /lib/mmseg.js: -------------------------------------------------------------------------------- 1 | 2 | /*! 3 | * mmseg 4 | * Copyright(c) 2011 Hidden 5 | * MIT Licensed 6 | */ 7 | 8 | /** 9 | * Library version. 10 | */ 11 | 12 | exports.version = '0.0.1'; -------------------------------------------------------------------------------- /mmseg-ubuntu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | apt-get install make gcc g++ automake libtool 4 | wget http://www.coreseek.cn/uploads/csft/3.2/mmseg-3.2.14.tar.gz 5 | tar zxvf mmseg-3.2.14.tar.gz 6 | cd mmseg-3.2.14 7 | ./bootstrap 8 | #./configure --prefix=/usr/local/mmseg3 9 | ./configure 10 | make && make install 11 | 12 | #/usr/local/include/mmseg/ /usr/local/lib 13 | 14 | -------------------------------------------------------------------------------- /mmseg.cc: -------------------------------------------------------------------------------- 1 | #include "mmseg.h" 2 | 3 | using namespace node; 4 | using namespace v8; 5 | 6 | Persistent mmseg::constructor_template; 7 | 8 | void mmseg::Initialize (Handle target) 9 | { 10 | 11 | HandleScope scope; 12 | 13 | Local t = FunctionTemplate::New(New); 14 | t->InstanceTemplate()->SetInternalFieldCount(1); 15 | NODE_SET_PROTOTYPE_METHOD(t, "segmentSync", SegmentSync); 16 | NODE_SET_PROTOTYPE_METHOD(t, "complexSegmentSync", ComplexSegmentSync); 17 | NODE_SET_PROTOTYPE_METHOD(t, "close", Close); 18 | target->Set(String::NewSymbol("mmseg"), t->GetFunction()); 19 | } 20 | 21 | Handle mmseg::New (const Arguments& args) 22 | { 23 | HandleScope scope; 24 | if (args.Length() == 0 || !args[0]->IsString()) { 25 | return ThrowException(Exception::Error( 26 | String::New("Need data path"))); 27 | } 28 | Handle str = args[0]->ToString(); 29 | char path[str->Utf8Length()+1]; 30 | str->WriteUtf8((char*) &path); 31 | init( path ); 32 | return Undefined(); 33 | //return args.This(); 34 | } 35 | 36 | Handle mmseg::SegmentSync (const Arguments& args) 37 | { 38 | HandleScope scope; 39 | if (args.Length() == 0 || !args[0]->IsString()) { 40 | return Undefined(); 41 | } 42 | Handle str = args[0]->ToString(); 43 | char words[str->Utf8Length()+1]; 44 | str->WriteUtf8((char*) &words); 45 | Local ar = segmentSync(words); 46 | return ar; 47 | } 48 | 49 | Handle mmseg::ComplexSegmentSync (const Arguments& args) 50 | { 51 | HandleScope scope; 52 | if (args.Length() == 0 || !args[0]->IsString()) { 53 | return Undefined(); 54 | } 55 | Handle str = args[0]->ToString(); 56 | char words[str->Utf8Length()+1]; 57 | str->WriteUtf8((char*) &words); 58 | Local ar = complexSegmentSync(words); 59 | return ar; 60 | } 61 | 62 | 63 | 64 | Handle mmseg::Close (const Arguments& args) 65 | { 66 | HandleScope scope; 67 | destroy(); 68 | return Undefined(); 69 | } 70 | 71 | css::SegmenterManager g_mgr; 72 | bool g_bInited = false; 73 | 74 | int mmseg::init(char *path) 75 | { 76 | if( g_bInited ) return 1; 77 | if (g_mgr.init(path) != 0) { 78 | perror(path); 79 | return 1; 80 | } 81 | g_bInited = true; 82 | return 0; 83 | } 84 | 85 | Local mmseg::segmentSync(char *f_words) 86 | { 87 | Local ar = Array::New(); 88 | if( !g_bInited ) { 89 | return ar; 90 | } 91 | int i = 0; 92 | css::Segmenter* seg = g_mgr.getSegmenter(); 93 | seg->setBuffer((u1*)f_words, (u4)strlen(f_words)); 94 | while(1) 95 | { 96 | u2 len = 0, symlen = 0; 97 | char* tok = (char*)seg->peekToken(len,symlen); 98 | if(!tok || !*tok || !len){ 99 | break; 100 | } 101 | //append new item 102 | ar->Set(i, String::New(tok, len)); 103 | i++; 104 | seg->popToken(len); 105 | } 106 | g_mgr.clear(); 107 | return ar; 108 | } 109 | 110 | Local mmseg::complexSegmentSync(char *f_words) 111 | { 112 | Local ar = Array::New(); 113 | if( !g_bInited ) { 114 | return ar; 115 | } 116 | int i = 0; 117 | css::Segmenter* seg = g_mgr.getSegmenter(); 118 | seg->setBuffer((u1*)f_words, (u4)strlen(f_words)); 119 | while(1) 120 | { 121 | u2 len = 0, symlen = 0; 122 | char* tok = (char*)seg->peekToken(len,symlen); 123 | if(!tok || !*tok || !len){ 124 | break; 125 | } 126 | //append new item 127 | ar->Set(i, String::New(tok, len)); 128 | i++; 129 | seg->popToken(len); 130 | //check thesaurus 131 | { 132 | const char* thesaurus_ptr = seg->thesaurus(tok, symlen); 133 | while(thesaurus_ptr && *thesaurus_ptr) { 134 | len = strlen(thesaurus_ptr); 135 | ar->Set(i, String::New(thesaurus_ptr, len)); 136 | i++; 137 | thesaurus_ptr += len + 1; //move next 138 | } 139 | } 140 | } 141 | //u2 len = 0, symlen = 0; 142 | //u2 kwlen = 0, kwsymlen = 0; 143 | ////check ist token 144 | //char txtHead[3] = {239,187,191}; 145 | //char* tok = (char*)seg->peekToken(len, symlen); 146 | //seg->popToken(len); 147 | //if(seg->isSentenceEnd()){ 148 | // do { 149 | // char* kwtok = (char*)seg->peekToken(kwlen , kwsymlen,1); 150 | // if(kwsymlen){ 151 | // //kw 152 | // ar->Set(i, String::New(kwtok, kwsymlen)); 153 | // i++; 154 | // } 155 | // }while(kwsymlen); 156 | //} 157 | 158 | //if(len == 3 && memcmp(tok,txtHead,sizeof(char)*3) == 0){ 159 | // //check is 0xFEFF 160 | // //do nothing 161 | //}else{ 162 | // ar->Set(i, String::New(tok, symlen)); 163 | // i++; 164 | //} 165 | //while(1) 166 | //{ 167 | // len = 0; 168 | // char* tok = (char*)seg->peekToken(len,symlen); 169 | // if(!tok || !*tok || !len){ 170 | // break; 171 | // } 172 | // seg->popToken(len); 173 | // if(seg->isSentenceEnd()){ 174 | // do { 175 | // char* kwtok = (char*)seg->peekToken(kwlen , kwsymlen,1); 176 | // if(kwsymlen){ 177 | // ar->Set(i, String::New(kwtok, kwsymlen)); 178 | // i++; 179 | // } 180 | // }while(kwsymlen); 181 | // } 182 | 183 | // if(*tok == '\r') 184 | // continue; 185 | // if(*tok == '\n'){ 186 | // continue; 187 | // } 188 | // ar->Set(i, String::New(tok, symlen)); 189 | // i++; 190 | 191 | //} 192 | g_mgr.clear(); 193 | return ar; 194 | } 195 | 196 | void mmseg::destroy() 197 | { 198 | if( g_bInited ){ 199 | g_bInited = false; 200 | } 201 | } 202 | 203 | //extern "C" void init (Handle target) 204 | //{ 205 | // HandleScope scope; 206 | // mmseg::Initialize(target); 207 | //} 208 | 209 | 210 | 211 | void RegisterModule(Handle target) { 212 | HandleScope scope; 213 | mmseg::Initialize(target); 214 | } 215 | 216 | NODE_MODULE(mmseg, RegisterModule); 217 | -------------------------------------------------------------------------------- /mmseg.h: -------------------------------------------------------------------------------- 1 | #ifndef MMSEG_H 2 | #define MMSEG_H 3 | 4 | #include 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | 15 | #include 16 | #include 17 | #include "SegmenterManager.h" 18 | #include "Segmenter.h" 19 | 20 | using namespace node; 21 | using namespace v8; 22 | 23 | class mmseg: ObjectWrap 24 | { 25 | public: 26 | static void Initialize(Handle target); 27 | protected: 28 | static Persistent constructor_template; 29 | static Handle New (const Arguments& args); 30 | static Handle SegmentSync (const Arguments& args); 31 | static Handle ComplexSegmentSync (const Arguments& args); 32 | static Handle Close (const Arguments& args); 33 | 34 | mmseg () : ObjectWrap() { 35 | }; 36 | 37 | ~mmseg (){}; 38 | 39 | private: 40 | static int init(char *path); 41 | static Local segmentSync(char *f_words); 42 | static Local complexSegmentSync(char *f_words); 43 | static void destroy(); 44 | }; 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mmseg" 3 | , "version": "0.2.0" 4 | , "description": "A node.js driver for libmmseg" 5 | , "keywords": ["mmseg","libmmseg"] 6 | , "author": "Hidden " 7 | , "dependencies": {} 8 | , "scripts": { "install": "node-gyp clean configure build" } 9 | , "main": "index" 10 | , "engines": { "node": ">=0.8.0" } 11 | , "licenses" : [ { "type": "The MIT License", "url": "http://www.opensource.org/licenses/mit-license.php" } ] 12 | } 13 | -------------------------------------------------------------------------------- /test/mmseg.js: -------------------------------------------------------------------------------- 1 | var mmseg = require("../index.js"); 2 | var q = mmseg.open('/usr/local/etc/'); 3 | 4 | var ar = q.segmentSync("13家店通用!9元超低价享404元维娜姿瘦身养生套餐:速效纤体排毒(原价298元30分钟)+美式头面部舒压疗法 原价58(约15分钟)+背部紧致修身(原价48元15分钟)+全身脂肪测评1次!男女通用!商家承诺绝无任何隐性消费!国际专业减重连锁,让身体回复轻盈呼吸!繁體測試測試"); 5 | console.log(ar); 6 | console.log(mmseg.clean(ar)); 7 | console.log(mmseg.uniq(mmseg.clean(ar))); 8 | -------------------------------------------------------------------------------- /test/performance.js: -------------------------------------------------------------------------------- 1 | var mmseg = require("../index.js"); 2 | var q = mmseg.open('/usr/local/etc/'); 3 | 4 | var length=0; 5 | 6 | var str="this is english test 收2拾4心333情,将这一段时间所经历的一些事情和从杀戮本源魂珠那里得来的消息都整理了一遍,然后,龙翔就站起身来,准备带着小白开始他们增强实力之旅。 当然,在离开之前,龙翔还是没有忘记将这个亚龙魔兽身体里面的那颗魔核取出来。 这一颗散发着一股荧光魔核足足有鸡蛋大小,照这样看来,这一颗魔核里面的能量就足够小白和龙翔补充能量十多次了。 将魔核收进空间戒指之后,龙翔就抱着小白起身继续向前走去。 按照杀戮本源魂珠所说的,龙翔现在前进的方向上面就有一片森林,穿过森林之后,就可以达到一座副城。 正好,在穿过这一片森林的时候,会遇到各种各样的魔兽和人类冒险者,在这一段时间会有足够多的机会锻炼龙翔和小白的实战经验。 按照杀戮本源魂珠所说的,遇到魔兽,最好就由小白出手,而碰到人类武者的话,就由龙翔出手,只有碰到在一个人对付不了的对手的时候,才两个人一块出手。 这样也算是事先演练一下,熟悉之后对手的战斗风格。 然后,杀戮本源魂珠还补充了一点,在前期战斗的时候,小白先不要使用自己血脉之中的威压,遇到的敌人的时候再使用。 这些,龙翔和小白都赞成,认为这样对两人的实力增长有很大的帮助。但是,随后杀戮本源魂珠所说的,龙翔和小白就有些不太同意了。 杀戮本源魂珠告诉小白和龙翔,在前进的道路上面,不管遇到什么样的生命,最好不要和他交谈,也不要相信任何人说的任何话。要么离得远远地,要么就不由分说的上前厮杀。遇见看似不平的事情,更加不要拔刀相助。 对于这一点,龙翔和小白一致认为,这是因为杀戮本源魂珠本性之中不可磨灭的杀戮欲望在作祟。根本就没有什么实质性的理由和意义。 一路上,龙翔和小白时刻放出自己的灵魂力量,感知着周围的一举一动,在这危机四伏的空间里面,由不得他们不小心谨慎。 不过,与此同时,杀戮本源魂珠也不断的向龙翔和小白传达一些他不断记起的信息。 按照杀戮本源魂珠告诉他们的方法,小白和龙翔总算是学会了修罗炼狱场的计时方法。 在他们出发的时候,正是星期三刚刚开始的时候,但是,现在,一直到了第二个星期一,也就是足足经过了五天的时间,龙翔和小白还是没有碰到一个生命。 这不禁让他们感觉到烦躁,对于他们来说,连续五天枯燥的赶路,实在是一件令人难受的事情。 在星期一过了大约一半的时候,终于,一望无际的荒原走到了尽头,远远的,小白和龙翔已经能够看到一片森林的轮廓了。 这个发现,让小白和龙翔一阵激动和兴奋。不管怎样,眼前一成不变的环境变化一下也算是好事。更何况,按照杀戮本源魂珠所说的,在森林里面,不管是人类冒险者还是魔兽,数量和密集程度都要较荒原上面高出很多倍。 终于,又是三个小时快速的赶路,小白和龙翔终于到了森林的边缘。 就在龙翔和小白准备进去森林里面的时候,突然冲出来了一个人。 这是一个中年人,这个人看起来相当的狼狈,浑身上下所有的衣服都成了一条条的碎布条挂在身上,根本就遮不住多少地方。 从那些裸露在外的地方,龙翔可以看见一道道狰狞的伤口,有些伤口上面的鲜血甚至还在飞快的往外面冒。 一看就知道,这个中年人在不久之前一定经历了一场相当残酷的战斗。 这个中年人飞快的向龙翔和小白所在的地方跑过来,随着这个中年人的靠近,一股浓郁的药味冲进龙翔和小白的鼻子之中。 看着这个中年人直接朝着自己冲过来,似乎根本就没有发现自己一样,龙翔眉头不禁皱了皱,脚下一个滑步,侧身让开。 而这时,那个中年人好像突然发现了龙翔的存在,眼睛一亮,叫道:“朋友,快逃吧!” 龙翔仔细的感受了一下,发现那个中年人仅仅是五阶武爵,但是,在这个中年人的双眼上面并不是想之前碰到的那些魔兽一样双眼通红的,只是在眼底深处有着一抹猩红。 这样的现象杀戮本源魂珠早就告诉过龙翔,这是因为服用要玩之后出现的症状。 听到这个中年人的话,龙翔不但没有立刻离开,反而还拦在了那个中年人的面前。 “你,你这究竟是什么意思?”看到龙翔拦在自己面前,那个中年人不禁有些急怒的说道。 “没什么意思,只是想要问一下,在前面究竟有什么样的危险。”听到这个中年人的责问,龙翔只是淡淡的一笑。 “我好心提醒你,到现在你居然害我,你想死的话我不拦着你,但是,你也不要拉着我陪你一块去死。”听到龙翔的话,那个中年人恼怒的说道,说完就要从龙翔的身边走过去。 龙翔又是一个滑步,拦在了那个中年人的面前,这个中年人的话,严重的激起了龙翔的好奇心,现在,龙翔是铁了心弄明白究竟是什么一回事。 于是龙翔想着说道:“放心吧,你告诉我究竟是怎么一回事之后,我就放你离开。” 听到龙翔的话,那个中年人显然更加的愤怒了,但是,他的实力太低,打又打不过,想要从旁边绕过去,速度又没有龙翔快,只得恨恨的说道:“你想要知道,自己到前面去看看不就知道了,何必多此一举的来问我。” 龙翔淡淡的一笑,没有多说什么,只是身上的气势不断的攀升。 感受到龙翔身上恐怖的气势,那个中年人脸色有些发白,知道要是自己现在还这么磨蹭的话,这个年轻人说不定就会翻脸了。 所以只好老老实实的说道:“在前面,我和我的伙伴遇到了一只兽爵巅峰境界的风系魔兽,我们一行五个,到现在也仅仅只有我一个人活着逃出来了,快走吧,说不定那只魔兽就要追出来了。” 听到这话,龙翔眉头微不可察的皱了皱,这个人竟然扔下同伴一个人逃生,像这样的人,龙翔是最为不齿的。 厌恶的摆了摆手,龙翔冷冷的说道:“滚吧,竟然抛弃同伴一个人逃生,像你这样的人,应该第一个被魔兽吃掉。” 听到龙翔的话,那个中年人的眼中流落出一丝愤怒的神色,但是,随即又被很好的掩饰住了,低下头,默默的从龙翔的身边绕开。 看着这个中年人离开了,龙翔看了看身边的小白,笑道:“一个兽爵巅峰境界的魔兽?正好我们可以练一下手。好长时间都没有机会动手,机会终于来了。我们走吧,到前面看看去。” 说完,就准备带着小白向前走去。 这时,杀戮本源魂珠的声音传来:“你们真的准备到前面的森林里面看看?你们就真的相信这个中年人的话?” 听到杀戮本源魂珠的话,龙翔笑了笑,说道:“当然要看看,就算是前面没有魔兽,我们反正是要去森林里面的,至于那个人的话,相不相信,都不重要了。” 感受到龙翔话语中的坚定,杀戮本源魂珠没有多说什么。 然后龙翔就带着小白一起走进了森林里面。 在走进森林里面的时候,小白和龙翔就同时感觉到自己身上一阵发寒。就好像一个远古凶兽正大张着嘴等着自己自投罗网。 但是,现在两人都已经走进森林里面了,当然不可能再转身离开了。只得硬着头皮小心翼翼地向前面慢慢的前行着。 就这样,大约经过了一炷香的时间,小白和龙翔已经深入森林里面大约两千米了,在这一路上,走过的相当平静,森林里面没有看见任何动物,也没有听见任何声音。 在这样安静的有些过分的环境下,龙翔和小白都要随时紧绷着自己的神经,不敢有丝毫的大意。 就在这时,从四周传来一阵阵向枭啼一般的声音,听到这个声音,龙翔和小白出奇的,竟然不约而同的松了一口气。 实在是因为之前的那种过于平静的气氛太压抑了,现在听见这种平时听起来相当怪异和讨厌的声音,在这个时候,竟然还感觉到有一丝的悦耳。 在这一声枭啼之后,龙翔和小白面前就出现了一行五个冒险者打扮的武者,看到这些武者,龙翔和小白心中都是一惊,在他们面前的五个武者,身上散发出来的气息极为的隐晦,但是,从这丝丝隐晦的能量波动之中,龙翔和小白都能够清晰的感觉到,这五个武者,竟然无一例外的都是武皇境界的强者。 其中,有两名武者处在三阶武皇,剩下的三名都是一阶武皇。 看到这样强悍的阵容,龙翔和小白脸上都是不自觉的露出了一丝凝重的神色。 就算是在武印大陆上面,面对这样强悍的阵容,龙翔和小白都需要花费不小的力气才能够解决,在这个修罗炼狱场里面,同等级的武者,实力都要远远的超过武印大陆上面的武者。 看来,今天的这一仗实在是不好打,要是自己真的和一般的武爵境界的武者一样的话,今天真的是插翅难飞了,这分明就是事先预谋好的,这根本就是一个阴谋! 但是,面对这样的情况,龙翔丝毫不惧,他有着自己的底牌,虽然现在的形式看起来不太乐观,但是,这样的阵容,还无法将龙翔逼上绝路。 现在龙翔总算是想明白了事情的前因后果,也相信了杀戮本源魂珠所说的话。 在这个空间里面,根本就不应该相信任何人,这是一个没有丝毫信任感存在的空间。 想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。想起杀戮本源魂珠的话,龙翔的双眼不禁一亮,在这个根本就没有丝毫信任感存在的空间里面,现在竟然出现了五个人联手对付自己的情况。"; 7 | 8 | var start= +new Date(); 9 | 10 | var regNonChinese=/([\w])/; 11 | function filterWords(arr){ 12 | //unique, Chinese only 13 | var u = {}, a = []; 14 | for(var i = 0, l = arr.length; i < l; ++i){ 15 | if(u.hasOwnProperty(arr[i]) || (arr[i].length< 2) || regNonChinese.test(arr[i])) { 16 | continue; 17 | } 18 | a.push(arr[i]); 19 | u[arr[i]] = 1; 20 | } 21 | return a; 22 | } 23 | 24 | 25 | function run () { 26 | length+= str.length; 27 | //var arr = q.segmentSync("13家店通用!9元超低价享404元维娜姿瘦身养生套餐:速效纤体排毒(原价298元30分钟)+美式头面部舒压疗法 原价58(约15分钟)+背部紧致修身(原价48元15分钟)+全身脂肪测评1次!男女通用!商家承诺绝无任何隐性消费!国际专业减重连锁,让身体回复轻盈呼吸!繁體測試測試"); 28 | // var arr = q.segmentSync(str); 29 | var arr = q.complexSegmentSync(str); 30 | arr= filterWords(arr); 31 | 32 | // arr = mmseg.uniq(mmseg.clean(arr)); 33 | // console.log(arr && arr.join(",")); 34 | } 35 | 36 | function runGroup () { 37 | for (var i = 0; i < 1000; i++) { 38 | run(); 39 | }; 40 | } 41 | 42 | //setInterval( runGroup, 1000 ); 43 | //run(); 44 | runGroup(); 45 | 46 | var dur= +new Date - start; 47 | console.log('finished, timecost: '+ dur + ' ms, text length : '+ length + ', speed: '+ (length*1000/dur)+ ' characters/second'); 48 | 49 | //run(); 50 | -------------------------------------------------------------------------------- /wscript: -------------------------------------------------------------------------------- 1 | #MMSEG_PATH 2 | import os 3 | srcdir = "." 4 | blddir = "build" 5 | VERSION = "0.0.1" 6 | 7 | def set_options(opt): 8 | opt.tool_options("compiler_cxx") 9 | 10 | def configure(conf): 11 | mmsegpath = os.environ.get('MMSEG_PATH') 12 | libpath = ['/usr/lib', '/usr/local/lib'] 13 | if mmsegpath != None: 14 | libpath.append('/'.join([mmsegpath,'lib'])) 15 | conf.check_tool("compiler_cxx") 16 | conf.check_tool("node_addon") 17 | conf.check(lib='stdc++', libpath=['/usr/lib', '/usr/local/lib'], uselib_store='LIBSTDC') 18 | conf.check(lib='mmseg', libpath=libpath, uselib_store='LIBMMSEG') 19 | conf.env.append_value('CCFLAGS', ['-O3']) 20 | conf.env.set_variant("default") 21 | 22 | def build(bld): 23 | mmsegpath = os.environ.get('MMSEG_PATH') 24 | includepath = ["/usr/local/include/mmseg"] 25 | if mmsegpath != None: 26 | includepath.append('/'.join([mmsegpath,'include'])) 27 | obj = bld.new_task_gen("cxx", "shlib", "node_addon") 28 | obj.target = "mmseg" 29 | obj.source = "mmseg.cc" 30 | obj.uselib = ["LIBSTDC", "LIBMMSEG"] 31 | obj.includes = includepath 32 | --------------------------------------------------------------------------------