cShop是國內基于Java開發的企業級電商平臺,現推出.3.0版本,具有以下特性:
一、使用freemaker模板引擎提升性能
二、nginx負載均衡
三、認證采用token式
四、三端兼容(買家、賣家、平臺)
五、完整的單元測試(覆蓋所有controller及復雜的業務類)
六、采用Spring MVC
七、restful 化(無狀態、跨域,三端支撐)
八、Rest API 調用
九、共享租賃,秒殺,特價
九、Spring Security 安全框架
官網:http://www.jiexitek.com/
架構概覽
架構概覽
JcShop使用Spring 做為基礎架構,使用spring mvc實現Rest API,并通過Swagger提供了完整的API可實現化文檔,使用Spring security做為安全機制,使用Elasticsearch作為搜索引擎,使用druid做為數據庫連接池,使用FreeMaker模板引擎。
訂單流程架構
訂單流程架構
在電子商務系統中,對商品的規格,屬性,尺寸,顏色的管理是一個難點,比如某件衣服有多種顏色、多種尺碼,這些屬性會直接關聯價格和庫存的, 比如某個款式的襯衫,有XL/L/XXL三種大小,有紅黃藍三種顏色,但是對于手機而言它的規格參數是一些機身顏色內存大小,再比如電飯煲或冰箱它們的規格參數只是一些型號,所有對商品的規格屬性想做到統一管理是一個比較難的事情,jcshop采用spu,sku數據庫設計完美的解決了這一問題。
靜態頁生成及展示
模板文件存放在Web服務器上,當有人來訪問這個頁面,FreeMarker就會介入執行,然后動態轉換模板,用最新的數據內容替換模板中${...}的部分,之后將結果發送到訪問者的Web瀏覽器中。訪問者的Web瀏覽器就會接收到例如第一個HTML示例那樣的內容(也就是沒有FreeMarker指令的HTML代碼),訪問者也不會察覺到服務器端使用的FreeMarker,從而提升性能。
部署概覽
Jcshop基礎設施的部署有:Mysql集群、Elasticsearch集群,支持基于nginx的負載均衡高可用解決方案。
界面展示
PC商城
小程序端
跳轉的"目標"地址由"標簽"來指定,該標簽稱之為"跳轉標簽"。跳轉標簽最多4個字符,且第一個字符必須為字母。跳轉標簽后必須帶有冒號":" ,且在行中必須位于程序語句之前。
跳轉指令根據"跳轉"的機理,首先可分為"無條件跳轉"和"條件跳轉",除此之外,還有一個特殊的跳轉指令,可實現分支跳轉。
程序在執行時,遇到JU指令,無條件的跳轉到其"標簽"所指示的代碼行繼續執行。跳轉指令和跳轉目標必須在同一個塊內。
需要注意的是:理論上,JU指令允許向前跳,也允許向后跳。向后跳屬于常規用法,一般沒什么問題。但向前跳,容易形成死循環,因此,一般不建議使用JU命令向前跳。
顧名思義,與無條件跳轉不同,有條件跳轉指令中斷原程序邏輯流,發生跳轉是需要條件的,根據跳轉條件的不同,它們又有不同的分類。
(1) 由RLO的狀態決定是否跳轉
對于"JC"指令,當邏輯運算結果(RLO)為"1"時,"跳轉"生效,中斷當前的線性掃描,跳轉到"跳轉標簽"所標識的行繼續執行。同樣,可以選擇向前跳,也可以向后跳。
"JCN"指令與"JC"指令相反,當"RLO"為"1"的時候,"跳轉"生效。
另外:當條件不滿足,不執行跳轉的時候,該指令會將RLO置"1",然后繼續執行下面的指令。
(2) 帶BR位,由RLO狀態決定是否跳轉
對于"JCB"指令,其與"JC"指令一樣,當RLO為1時,"跳轉"生效,中斷當前的線性掃描,跳轉到"跳轉標簽"所標識的指令行繼續執行。而與"JC"指令不同的是,"JCB"指令會"額外"的做一項工作:將RLO的狀態復制到BR(二進制結果位)中。
同樣,"JNB"指令,其觸發跳轉的條件為RLO=0,且也會將RLO狀態復制到BR中。
(3) 由"狀態寄存器"的"BR"位決定跳轉與否
(4) 由"狀態寄存器"的"OV"、"OS"位決定跳轉與否
狀態字的第4位和第5位分別為"溢出位OV"和"溢出狀態保持位OS"。當算術運算或浮點數比較指令執行時出現錯誤(如溢出、非法操作和不規范的格式等)時,OV位會被置1,同時OS位也被置1。而如果后面同類指令執行結果正確,則OV位會被清0,但OS位仍然保持為1。只有JOS指令、塊調用指令和塊結束指令才能復位OS位。
一般用于檢查算術運算指令結果是否有溢出,若有溢出,可用JO、JOS指令進行跳轉,以做相應的錯誤處理。
(5) 由條件碼1(CC1)和條件碼0(CC0)決定是否跳轉
狀態字的第7位(CC1)和第6位(CC0)分別為條件碼1和條件碼0。這兩位綜合起來用于表示在累加器1(ACCU1)中產生的算術運算或邏輯運算的結果與"0"的大小關系、比較指令的執行結果或移位指令的移出位的結果。
CC1和CC0的狀態與"算術運算"的結果的關系如下:
在"跳轉指令"中,有一類指令根據算術運算的結果來決定邏輯流是否跳轉,本質上,是在執行完算術運算后,根據CC1和CC0的不同狀態,來決定相應的跳轉指令是否具備跳轉條件,如下表所示:
在語句表的指令集中,還有一條特殊的跳轉指令,它能夠實現向多路分支跳轉的功能,它就是分支跳轉指令JL,其執行流程如下圖所示。
JL指令根據累加器1(ACCU1)的低字節中的數值大小來決定程序"沿著"哪一條分支執行。由于一個字節的數值范圍為0~255,因此,JL指令最多可管理多達256條分支的程序。
JL指令一般要與無條件跳轉指令JU配合使用,其指令的格式如下:
詳見《PLC語句表編程:“跳轉指令”特輯》
cseg是基于mmseg算法的一個輕量級中文分詞器,同時集成了關鍵字提取,關鍵短語提取,關鍵句子提取和文章自動摘要等功能,并且提供了一個基于Jetty的web服務器,方便各大語言直接http調用,同時提供了最新版本的lucene, solr, elasticsearch的分詞接口!Jcseg自帶了一個 jcseg.properties文件用于快速配置而得到適合不同場合的分詞應用,例如:最大匹配詞長,是否開啟中文人名識別,是否追加拼音,是否追加同義詞等!
七種切分模式:
+--------Jcseg chinese word tokenizer demo-------------------+
|- @Author chenxin<chenxin619315@gmail.com> |
|- :seg_mode : switch to specified tokenizer mode. |
|- (:complex,:simple,:most,:detect,:delimiter,:NLP,:ngram) |
|- :keywords : switch to keywords extract mode. |
|- :keyphrase : switch to keyphrase extract mode. |
|- :sentence : switch to sentence extract mode. |
|- :summary : switch to summary extract mode. |
|- :help : print this help menu. |
|- :quit : to exit the program. |
+------------------------------------------------------------+
jcseg~tokenizer:complex>>
歧義和同義詞:研究生命起源,混合詞: 做B超檢查身體,x射線本質是什么,今天去奇都ktv唱卡拉ok去,哆啦a夢是一個動漫中的主角,單位和全角: 2009年8月6日開始大學之旅,岳陽今天的氣溫為38.6℃, 也就是101.48℉, 中文數字/分數: 你分三十分之二, 小陳拿三十分之五,剩下的三十分之二十三全部是我的,那是一九九八年前的事了,四川麻辣燙很好吃,五四運動留下的五四精神。筆記本五折包郵虧本大甩賣。人名識別: 我是陳鑫,也是jcseg的作者,三國時期的諸葛亮是個天才,我們一起給劉翔加油,羅志高興奮極了因為老吳送了他一臺筆記本。外文名識別:冰島時間7月1日,正在當地拍片的湯姆·克魯斯通過發言人承認,他與第三任妻子凱蒂·赫爾墨斯(第一二任妻子分別為咪咪·羅杰斯、妮可·基德曼)的婚姻即將結束。配對標點: 本次『暢想杯』黑客技術大賽的得主為電信09-2BF的張三,獎勵C++程序設計語言一書和【暢想網絡】的『PHP教程』一套。特殊字母: 【Ⅰ】(Ⅱ),英文數字: bug report chenxin619315@gmail.com or visit http://code.google.com/p/jcseg, we all admire the hacker spirit!特殊數字: ① ⑩ ⑽ ㈩.
歧義/n 和/o 同義詞/n :/w 研究/vn 琢磨/vn 研討/vn 鉆研/vn 生命/n 起源/n ,/w 混合詞 :/w 做/v b超/n 檢查/vn 身體/n ,/w x射線/n x光線/n 本質/n 是/a 什么/n ,/w 今天/t 去/q 奇都ktv/nz 唱/n 卡拉ok/nz 去/q ,/w 哆啦a夢/nz 是/a 一個/q 動漫/n 中/q 的/u 主角/n ,/w 單位/n 和/o 全角/nz :/w 2009年/m 8月/m 6日/m 開始/n 大學/n 之旅 ,/w 岳陽/ns 今天/t 的/u 氣溫/n 為/u 38.6℃/m ,/w 也就是/v 101.48℉/m ,/w 中文/n 國語/n 數字/n //w 分數/n :/w 你/r 分/h 三十分之二/m ,/w 小陳/nr 拿/nh 三十分之五/m ,/w 剩下/v 的/u 三十分之二十三/m 全部/a 是/a 我的/nt ,/w 那是/c 一九九八年/m 1998年/m 前/v 的/u 事/i 了/i ,/w 四川/ns 麻辣燙/n 很/m 好吃/v ,/w 五四運動/nz 留下/v 的/u 五四/m 54/m 精神/n 。/w 筆記本/n 五折/m 5折/m 包郵 虧本/v 大甩賣 甩賣 。/w 人名/n 識別/v :/w 我/r 是/a 陳鑫/nr ,/w 也/e 是/a jcseg/en 的/u 作者/n ,/w 三國/mq 時期/n 的/u 諸葛亮/nr 是個 天才/n ,/w 我們/r 一起/d 給/v 劉翔/nr 加油/v ,/w 羅志高/nr 興奮/v 極了/u 因為/c 老吳/nr 送了 他/r 一臺 筆記本/n 。/w 外文/n 名/j 識別/v :/w 冰島/ns 時間/n 7月/m 1日/m ,/w 正在/u 當地/s 拍片/vi 的/u 湯姆·克魯斯/nr 阿湯哥/nr 通過/v 發言人/n 承認/v ,/w 他/r 與/u 第三/m 任/q 妻子/n 凱蒂·赫爾墨斯/nr (/w 第一/a 二/j 任/q 妻子/n 分別為 咪咪·羅杰斯/nr 、/w 妮可·基德曼/nr )/w 的/u 婚姻/n 即將/d 結束/v 。/w 配對/v 標點/n :/w 本次/r 『/w 暢想杯/nz 』/w 黑客/n 技術/n 大賽/vn 的/u 得主/n 為/u 電信/nt 09/en -/w bf/en 2bf/en 的/u 張三/nr ,/w 獎勵/vn c++/en 程序設計/gi 語言/n 一書/ns 和/o 【/w 暢想網絡/nz 】/w 的/u 『/w PHP教程/nz 』/w 一套/m 。/w 特殊/a 字母/n :/w 【/w Ⅰ/nz 】/w (/w Ⅱ/m )/w ,/w 英文/n 英語/n 數字/n :/w bug/en report/en chenxin/en 619315/en gmail/en com/en chenxin619315@gmail.com/en or/en visit/en http/en :/w //w //w code/en google/en com/en code.google.com/en //w p/en //w jcseg/en ,/w we/en all/en admire/en appreciate/en like/en love/en enjoy/en the/en hacker/en spirit/en mind/en !/w 特殊/a 數字/n :/w ①/m ⑩/m ⑽/m ㈩/m ./w
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-analyzer</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-elasticsearch</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-server</artifactId>
<version>2.6.2</version>
</dependency>
//lucene 5.x
//Analyzer analyzer=new JcsegAnalyzer5X(JcsegTaskConfig.COMPLEX_MODE);
//available constructor: since 1.9.8
//1, JcsegAnalyzer5X(int mode)
//2, JcsegAnalyzer5X(int mode, String proFile)
//3, JcsegAnalyzer5X(int mode, JcsegTaskConfig config)
//4, JcsegAnalyzer5X(int mode, JcsegTaskConfig config, ADictionary dic)
//lucene 4.x版本
//Analyzer analyzer=new JcsegAnalyzer4X(JcsegTaskConfig.COMPLEX_MODE);
//lucene 6.3.0以及以上版本
Analyzer analyzer=new JcsegAnalyzer(JcsegTaskConfig.COMPLEX_MODE);
//available constructor:
//1, JcsegAnalyzer(int mode)
//2, JcsegAnalyzer(int mode, String proFile)
//3, JcsegAnalyzer(int mode, JcsegTaskConfig config)
//4, JcsegAnalyzer(int mode, JcsegTaskConfig config, ADictionary dic)
//非必須(用于修改默認配置): 獲取分詞任務配置實例
JcsegAnalyzer jcseg=(JcsegAnalyzer) analyzer;
SegmenterConfig config=jcseg.getConfig();
//追加同義詞, 需要在 jcseg.properties中配置jcseg.loadsyn=1
config.setAppendCJKSyn(true);
//追加拼音, 需要在jcseg.properties中配置jcseg.loadpinyin=1
config.setAppendCJKPinyin();
//更多配置, 請查看 org.lionsoul.jcseg.SegmenterConfig
<!-- 復雜模式分詞: -->
<fieldtype name="textComplex" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="complex"/>
</analyzer>
</fieldtype>
<!-- 簡易模式分詞: -->
<fieldtype name="textSimple" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="simple"/>
</analyzer>
</fieldtype>
<!-- 檢測模式分詞: -->
<fieldtype name="textDetect" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="detect"/>
</analyzer>
</fieldtype>
<!-- 檢索模式分詞: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="most"/>
</analyzer>
</fieldtype>
<!-- NLP模式分詞: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="nlp"/>
</analyzer>
</fieldtype>
<!-- 空格分隔符模式分詞: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="delimiter"/>
</analyzer>
</fieldtype>
<!-- n-gram模式分詞: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="ngram"/>
</analyzer>
</fieldtype>
備注:
<fieldtype name="textComplex" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="complex" jsceg_loadsyn="1"/>
</analyzer>
</fieldtype>
可選的analyzer名字:
jcseg : 對應Jcseg的檢索模式切分算法
jcseg_complex : 對應Jcseg的復雜模式切分算法
jcseg_simple : 對應Jcseg的簡易切分算法
jcseg_detect : 對應Jcseg的檢測模式切分算法
jcseg_most : 對應Jcseg的最多分詞切分算法
jcseg_nlp : 對應Jcseg的NLP模式切分算法
jcseg_delimiter : 對應Jcseg的分隔符模式切分算法
jcseg_ngram : 對應Jcseg的n-gram模式切分算法
索引級別的自定義配置: 從2.5.0以上的版本開始,你可以在elasticsearch mapping的時候使用jcseg.properties中定義的任何參數來覆蓋配置,區別就是將配置名稱的"."替換為"_"即可,例如:設置加載同義詞:
"settings": {
"analysis": {
"analyzer": {
"jcseg_complex_v3": {
"type": "jcseg_complex",
"jcseg_maxlen": "3",
"jcseg_loadsyn": "1"
}
}
}
}
配置測試地址:
http://localhost:9200/_analyze?analyzer=jcseg_most&text=一百美元等于多少人民幣
7.x版本請使用如下方式測試:
curl 'http://localhost:9200/_analyze?pretty=true' -H 'Content-Type:application/json' -d'
{
"analyzer": "jcseg_most",
"text": "一百美元等于多少人民幣"
}'
打印結果如下:
{
"tokens" : [
{
"token" : "一",
"start_offset" : 0,
"end_offset" : 1,
"type" : "word",
"position" : 0
},
{
"token" : "一百",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 1
},
{
"token" : "百",
"start_offset" : 1,
"end_offset" : 2,
"type" : "word",
"position" : 2
},
{
"token" : "美",
"start_offset" : 2,
"end_offset" : 3,
"type" : "word",
"position" : 3
},
{
"token" : "美元",
"start_offset" : 2,
"end_offset" : 4,
"type" : "word",
"position" : 4
},
{
"token" : "元",
"start_offset" : 3,
"end_offset" : 4,
"type" : "word",
"position" : 5
},
{
"token" : "等",
"start_offset" : 4,
"end_offset" : 5,
"type" : "word",
"position" : 6
},
{
"token" : "等于",
"start_offset" : 4,
"end_offset" : 6,
"type" : "word",
"position" : 7
},
{
"token" : "于",
"start_offset" : 5,
"end_offset" : 6,
"type" : "word",
"position" : 8
},
{
"token" : "多",
"start_offset" : 6,
"end_offset" : 7,
"type" : "word",
"position" : 9
},
{
"token" : "多少",
"start_offset" : 6,
"end_offset" : 8,
"type" : "word",
"position" : 10
},
{
"token" : "少",
"start_offset" : 7,
"end_offset" : 8,
"type" : "word",
"position" : 11
},
{
"token" : "人",
"start_offset" : 8,
"end_offset" : 9,
"type" : "word",
"position" : 12
},
{
"token" : "人民",
"start_offset" : 8,
"end_offset" : 10,
"type" : "word",
"position" : 13
},
{
"token" : "人民幣",
"start_offset" : 8,
"end_offset" : 11,
"type" : "word",
"position" : 14
},
{
"token" : "民",
"start_offset" : 9,
"end_offset" : 10,
"type" : "word",
"position" : 15
},
{
"token" : "幣",
"start_offset" : 10,
"end_offset" : 11,
"type" : "word",
"position" : 16
}
]
}
也可以直接使用集成了jcseg的elasticsearch運行包:elasticsearch-jcseg,開封就可以使用。
jcseg-server模塊嵌入了jetty,實現了一個絕對高性能的服務器,給jcseg的全部Api功能都加上了restful接口,并且標準化了api結果的json輸出格式,各大語言直接使用http客戶端調用即可。
# 在最后傳入jcseg-server.properties配置文件的路徑
java -jar jcseg-server-{version}.jar ./jcseg-server.properties
01, config: 配置目錄,jcseg-server.properties管理服務器和詞庫的配置,jvm.options管理jvm的參數,例如內存分配等,默認1.5G
02, lib: 全部依賴的jar包目錄
03, lexicon: jcseg詞庫目錄,在此更改管理詞庫即可
04, jcseg-server: 啟動管理腳本, 僅限linux 增加-d參數可以后臺啟動
# 將jcseg-server/target/jcseg-server整個目錄拷貝到安裝目錄,設為$JS_DIR
cd $JS_DIR
# 初次運行給jcseg-server增加+x權限
# 同步運行
./jcseg-server
# 后臺運行
./jcseg-server -d
懶得翻譯了,默默的多念幾遍就會了!
# jcseg server configuration file with standard json syntax
{
# jcseg server configuration
"server_config": {
# server port
"port": 1990,
# default conmunication charset
"charset": "utf-8",
# http idle timeout in ms
"http_connection_idle_timeout": 60000,
# jetty maximum thread pool size
"max_thread_pool_size": 200,
# thread idle timeout in ms
"thread_idle_timeout": 30000,
# http output buffer size
"http_output_buffer_size": 32768,
# request header size
"http_request_header_size": 8192,
# response header size
"http_response_header_size": 8192
},
# global setting for jcseg, yet another copy of the old
# configuration file jcseg.properties
"jcseg_global_config": {
# maximum match length. (5-7)
"jcseg_maxlen": 7,
# recognized the chinese name.
# (true to open and false to close it)
"jcseg_icnname": true,
# maximum length for pair punctuation text.
# set it to 0 to close this function
"jcseg_pptmaxlen": 7,
# maximum length for chinese last name andron.
"jcseg_cnmaxlnadron": 1,
# Whether to clear the stopwords.
# (set true to clear stopwords and false to close it)
"jcseg_clearstopword": false,
# Whether to convert the chinese numeric to arabic number.
# (set to true open it and false to close it) like '\u4E09\u4E07' to 30000.
"jcseg_cnnumtoarabic": true,
# Whether to convert the chinese fraction to arabic fraction.
# @Note: for lucene,solr,elasticsearch eg.. close it.
"jcseg_cnfratoarabic": false,
# Whether to keep the unrecognized word.
# (set true to keep unrecognized word and false to clear it)
"jcseg_keepunregword": true,
# Whether to start the secondary segmentation for the complex english words.
"jcseg_ensencondseg": true,
# min length of the secondary simple token.
# (better larger than 1)
"jcseg_stokenminlen": 2,
#thrshold for chinese name recognize.
# better not change it before you know what you are doing.
"jcseg_nsthreshold": 1000000,
#The punctuations that will be keep in an token.
# (Not the end of the token).
"jcseg_keeppunctuations": "@#%.&+"
},
# dictionary instance setting.
# add yours here with standard json syntax
"jcseg_dict": {
"master": {
"path": [
"{jar.dir}/lexicon"
# absolute path here
#"/java/JavaSE/jcseg/lexicon"
],
# Whether to load the part of speech of the words
"loadpos": true,
# Whether to load the pinyin of the words.
"loadpinyin": true,
# Whether to load the synoyms words of the words.
"loadsyn": true,
# whether to load the entity of the words.
"loadentity": true,
# Whether to load the modified lexicon file auto.
"autoload": true,
# Poll time for auto load. (in seconds)
"polltime": 300
}
# add more of yours here
# ,"name" : {
# "path": [
# "absolute jcseg standard lexicon path 1",
# "absolute jcseg standard lexicon path 2"
# ...
# ],
# "autoload": 0,
# "polltime": 300
# }
},
# JcsegTaskConfig instance setting.
# @Note:
# All the config instance here is extends from the global_setting above.
# do nothing will extends all the setting from global_setting
"jcseg_config": {
"master": {
# extends and Override the global setting
"jcseg_pptmaxlen": 0,
"jcseg_cnfratoarabic": true,
"jcseg_keepunregword": false
}
# this one is for keywords,keyphrase,sentence,summary extract
# @Note: do not delete this instance if u want jcseg to
# offset u extractor service
,"extractor": {
"jcseg_pptmaxlen": 0,
"jcseg_clearstopword": true,
"jcseg_cnnumtoarabic": false,
"jcseg_cnfratoarabic": false,
"jcseg_keepunregword": false,
"jcseg_ensencondseg": false
}
# well, this one is for NLP only
,"nlp" : {
"jcseg_ensencondseg": false,
"jcseg_cnfratoarabic": true,
"jcseg_cnnumtoarabic": true
}
# add more of yours here
# ,"name": {
# ...
# }
},
# jcseg tokenizer instance setting.
# Your could let the instance service for you by access:
# http://jcseg_server_host:port/tokenizer/instance_name
# instance_name is the name of instance you define here.
"jcseg_tokenizer": {
"master": {
# jcseg tokenizer algorithm, could be:
# 1: SIMPLE_MODE
# 2: COMPLEX_MODE
# 3: DETECT_MODE
# 4: MOST_MODE
# 5: DELIMITER_MODE
# 6: NLP_MODE
# 7: NGRAM_MODE
# see org.lionsoul.jcseg.segmenter.SegmenterConfig for more info
"algorithm": 2,
# dictionary instance name
# choose one of your defines above in the dict scope
"dict": "master",
# JcsegTaskConfig instance name
# choose one of your defines above in the config scope
"config": "master"
}
# this tokenizer instance is for extractor service
# do not delete it if you want jcseg to offset you extractor service
,"extractor": {
"algorithm": 2,
"dict": "master",
"config": "extractor"
}
# this tokenizer instance of for NLP analysis
# keep it for you NLP project
,"nlp" : {
"algorithm": 6,
"dict": "master",
"config": "nlp"
}
# add more of your here
# ,"name": {
# ...
# }
}
}
api地址:http://jcseg_server_host:port/extractor/keywords?text=&number=&autoFilter=true|false
api參數:
text: post或者get過來的文檔文本
number: 要提取的關鍵詞個數
autoFilter: 是否自動過濾掉低分數關鍵字
api返回:
{
//api錯誤代號,0正常,1參數錯誤, -1內部錯誤
"code": 0,
//api返回數據
"data": {
//關鍵字數組
"keywords": [],
//操作耗時
"took": 0.001
}
}
更多配置請參考:org.lionsoul.jcseg.server.controller.KeywordsController
api地址:http://jcseg_server_host:port/extractor/keyphrase?text=&number=
api參數:
text: post或者get過來的文檔文本
number: 要提取的關鍵短語個數
api返回:
{
"code": 0,
"data": {
"took": 0.0277,
//關鍵短語數組
"keyphrase": []
}
}
更多配置請參考:org.lionsoul.jcseg.server.controller.KeyphraseController
api地址:http://jcseg_server_host:port/extractor/sentence?text=&number=
api參數:
text: post或者get過來的文檔文本
number: 要提取的關鍵句子個數
api返回:
{
"code": 0,
"data": {
"took": 0.0277,
//關鍵句子數組
"sentence": []
}
}
更多配置請參考:org.lionsoul.jcseg.server.controller.SentenceController
api地址:http://jcseg_server_host:port/extractor/summary?text=&length=
api參數:
text: post或者get過來的文檔文本
length: 要提取的摘要的長度
api返回:
{
"code": 0,
"data": {
"took": 0.0277,
//文章摘要
"summary": ""
}
}
更多配置請參考:org.lionsoul.jcseg.server.controller.SummaryController
api地址:http://jcseg_server_host:port/tokenizer/tokenizer_instance?text=&ret_pinyin=&ret_pos=...
api參數:
tokenizer_instance: 表示在jcseg-server.properties中定義的分詞實例名稱
text: post或者get過來的文章文本
ret_pinyin: 是否在分詞結果中返回詞條拼音(2.0.1版本后已經取消)
ret_pos: 是否在分詞結果中返回詞條詞性(2.0.1版本后已經取消)
api返回:
{
"code": 0,
"data": {
"took": 0.00885,
//詞條對象數組
"list": [
{
word: "哆啦a夢", //詞條內容
position: 0, //詞條在原文中的索引位置
length: 4, //詞條的詞個數(非字節數)
pinyin: "duo la a meng", //詞條的拼音
pos: "nz", //詞條的詞性標注
entity: null //詞條的實體標注
}
]
}
}
更多配置請參考:org.lionsoul.jcseg.server.controller.TokenizerController
Javadoc參考:Jcseg Javadoc
jcseg.properties查找步驟:
所以,默認情況下可以在jcseg-core-{version}.jar同目錄下來放一份jcseg.properties來自定義配置。
JcsegTaskConfig構造方法如下:
SegmenterConfig(); //不做任何配置文件查找來初始化
SegmenterConfig(boolean autoLoad); //autoLoad=true會自動查找配置來初始化
SegmenterConfig(java.lang.String proFile); //從指定的配置文件中初始化配置對象
SegmenterConfig(InputStream is); //從指定的輸入流中初始化配置對象
demo代碼:
//創建SegmenterConfig使用默認配置,不做任何配置文件查找
SegmenterConfig config=new SegmenterConfig();
//該方法會自動按照上述“jcseg.properties查找步驟”來尋找jcseg.properties并且初始化:
SegmenterConfig config=new SegmenterConfig(true);
//依據給定的jcseg.properties文件創建并且初始化JcsegTaskConfig
SegmenterConfig config=new SegmenterConfig("absolute or relative jcseg.properties path");
//調用SegmenterConfig#load(String proFile)方法來從指定配置文件中初始化配置選項
config.load("absolute or relative jcseg.properties path");
ADictionary構造方法如下:
ADictionary(SegmenterConfig config, java.lang.Boolean sync)
//config:上述的JcsegTaskConfig實例
//sync: 是否創建線程安全詞庫,如果你需要在運行時操作詞庫對象則指定true,
// 如果jcseg.properties中autoload=1則會自動創建同步詞庫
demo代碼:
//Jcseg提供org.lionsoul.jcseg.dic.DictionaryFactory來方便詞庫的創建與往后的兼容
//通常可以通過
// DictionaryFactory#createDefaultDictionary(SegmenterConfig)
// DictionaryFactory.createSingletonDictionary(SegmenterConfig)
//兩方法來創建詞庫對象并且加載詞庫文件,建議使用createSingletonDictionary來創建單例詞庫
//config為上面創建的SegmenterConfig對象.
//如果給定的SegmenterConfig里面的詞庫路徑信息正確
//ADictionary會依據config里面的詞庫信息加載全部有效的詞庫;
//并且該方法會依據config.isAutoload()來決定詞庫的同步性還是非同步性,
//config.isAutoload()為true就創建同步詞庫, 反之就創建非同步詞庫,
//config.isAutoload()對應jcseg.properties中的lexicon.autoload;
//如果config.getLexiconPath()=null,DictionaryFactory會自動加載classpath下的詞庫
//如果不想讓其自動加載lexicon下的詞庫
//可以調用:DictionaryFactory.createSingletonDictionary(config, false)創建ADictionary即可;
ADictionary dic=DictionaryFactory.createSingletonDictionary(config);
//創建一個非同步的按照config.lexPath配置加載詞庫的ADictioanry.
ADictionary dic=DictionaryFactory.createDefaultDictionary(config, false);
//創建一個同步的按照config.lexPath加載詞庫的ADictioanry.
ADictionary dic=DictionaryFactory.createDefaultDictionary(config, true);
//依據 config.isAutoload()來決定同步性,默認按照config.lexPath來加載詞庫的ADictionary
ADictionary dic=DictionaryFactory.createDefaultDictionary(config, config.isAutoload());
//指定ADictionary加載給定目錄下的所有詞庫文件的詞條.
//config.getLexiconPath為詞庫文件存放有效目錄數組.
for ( String path : config.getLexiconPath() ) {
dic.loadDirectory(path);
}
//指定ADictionary加載給定詞庫文件的詞條.
dic.load("/java/lex-main.lex");
dic.load(new File("/java/lex-main.lex"));
//指定ADictionary加載給定輸入流的詞條
dic.load(new FileInputStream("/java/lex-main.lex"));
//閱讀下面的“如果自定義使用詞庫”來獲取更多信息
ISegment接口核心分詞方法:
public IWord next();
//返回下一個切分的詞條
demo代碼:
//依據給定的ADictionary和SegmenterConfig來創建ISegment
//1, 通過ISegment.XX_MODE參數
//ISegment.COMPLEX_MODE表示創建ComplexSeg復雜ISegment分詞對象
//ISegment.SIMPLE_MODE表示創建SimpleSeg簡易Isegmengt分詞對象.
//ISegment.DETECT_MODE表示創建DetectSeg Isegmengt分詞對象.
//ISegment.SEARCH_MODE表示創建SearchSeg Isegmengt分詞對象.
//ISegment.DELIMITER_MODE表示創建DelimiterSeg Isegmengt分詞對象.
//ISegment.NLP_MODE表示創建NLPSeg Isegmengt分詞對象.
//ISegment.NGRAM_MODE表示創建NGramSeg Isegmengt分詞對象.
ISegment seg=ISegment.Type.fromIndex(mode).factory.create(config, dic);
//2, 通過調用直接的模式函數
// ISegment.COMPLEX為指向ComplexSeg的構造器函數接口
// ISegment.SIMPLE為指向ComplexSeg的構造器函數接口
// ISegment.DETECT為指向ComplexSeg的構造器函數接口
// ISegment.MOST為指向ComplexSeg的構造器函數接口
// ISegment.DELIMITER為指向ComplexSeg的構造器函數接口
// ISegment.NLP為指向ComplexSeg的構造器函數接口
// ISegment.NGRAM為指向ComplexSeg的構造器函數接口
ISegment seg=ISegment.COMPLEX.factory.create(config, dic);
//設置要分詞的內容
String str="研究生命起源。";
seg.reset(new StringReader(str));
//獲取分詞結果
IWord word=null;
while ( (word=seg.next()) !=null ) {
System.out.println(word.getValue());
}
//創建SegmenterConfig分詞配置實例,自動查找加載jcseg.properties配置項來初始化
SegmenterConfig config=new SegmenterConfig(true);
//創建默認單例詞庫實現,并且按照config配置加載詞庫
ADictionary dic=DictionaryFactory.createSingletonDictionary(config);
//依據給定的ADictionary和SegmenterConfig來創建ISegment
//為了Api往后兼容,建議使用SegmentFactory來創建ISegment對象
ISegment seg=ISegment.COMPLEX.factory.create(config, dic);
//備注:以下代碼可以反復調用,seg為非線程安全
//設置要被分詞的文本
String str="研究生命起源。";
seg.reset(new StringReader(str));
//獲取分詞結果
IWord word=null;
while ( (word=seg.next()) !=null ) {
System.out.println(word.getValue());
}
從1.9.9版本開始,Jcseg已經默認將jcseg.properties和lexicon全部詞庫打包進了jcseg-core-{version}.jar中,如果是通過SegmenterConfig(true)構造的SegmenterConfig或者調用了SegmenterConfig#autoLoad()方法,在找不到自定義配置文件情況下Jcseg會自動的加載classpath中的配置文件,如果config.getLexiconPath()=null DictionaryFactory默認會自動加載classpath下的詞庫。
//1, 默認構造SegmenterConfig,不做任何配置文件尋找來初始化
SegmenterConfig config=new SegmenterConfig();
//2, 設置自定義詞庫路徑集合
config.setLexiconPath(new String[]{
"relative or absolute lexicon path1",
"relative or absolute lexicon path2"
//add more here
});
//3, 通過config構造詞庫并且DictionaryFactory會按照上述設置的詞庫路徑自動加載全部詞庫
ADictionary dic=DictionaryFactory.createSingletonDictionary(config);
//1, 構造默認的SegmenterConfig,不做任何配置文件尋找來初始化
SegmenterConfig config=new SegmenterConfig();
//2, 構造ADictionary詞庫對象
//注意第二個參數為false,阻止DictionaryFactory自動檢測config.getLexiconPath()來加載詞庫
ADictionary dic=DictionaryFactory.createSingletonDictionary(config, false);
//3, 手動加載詞庫
dic.load(new File("absolute or relative lexicon file path")); //加載指定詞庫文件下全部詞條
dic.load("absolute or relative lexicon file path"); //加載指定詞庫文件下全部詞條
dic.load(new FileInputStream("absolute or relative lexicon file path")); //加載指定InputStream輸入流下的全部詞條
dic.loadDirectory("absolute or relative lexicon directory"); //加載指定目錄下的全部詞庫文件的全部詞條
dic.loadClassPath(); //加載classpath路徑下的全部詞庫文件的全部詞條(默認路徑/lexicon)
TextRankKeywordsExtractor(ISegment seg);
//seg: Jcseg ISegment分詞對象
//1, 創建Jcseg ISegment分詞對象
SegmenterConfig config=new SegmenterConfig(true);
config.setClearStopwords(true); //設置過濾停止詞
config.setAppendCJKSyn(false); //設置關閉同義詞追加
config.setKeepUnregWords(false); //設置去除不識別的詞條
ADictionary dic=DictionaryFactory.createSingletonDictionary(config);
ISegment seg=ISegment.COMPLEX.factory.create(config, dic);
//2, 構建TextRankKeywordsExtractor關鍵字提取器
TextRankKeywordsExtractor extractor=new TextRankKeywordsExtractor(seg);
extractor.setMaxIterateNum(100); //設置pagerank算法最大迭代次數,非必須,使用默認即可
extractor.setWindowSize(5); //設置textRank計算窗口大小,非必須,使用默認即可
extractor.setKeywordsNum(10); //設置最大返回的關鍵詞個數,默認為10
//3, 從一個輸入reader輸入流中獲取關鍵字
String str="現有的分詞算法可分為三大類:基于字符串匹配的分詞方法、基于理解的分詞方法和基于統計的分詞方法。按照是否與詞性標注過程相結合,又可以分為單純分詞方法和分詞與標注相結合的一體化方法。";
List<String> keywords=extractor.getKeywords(new StringReader(str));
//4, output:
//"分詞","方法","分為","標注","相結合","字符串","匹配","過程","大類","單純"
TextRankSummaryExtractor(ISegment seg, SentenceSeg sentenceSeg);
//seg: Jcseg ISegment分詞對象
//sentenceSeg: Jcseg SentenceSeg句子切分對象
//1, 創建Jcseg ISegment分詞對象
SegmenterConfig config=new SegmenterConfig(true);
config.setClearStopwords(true); //設置過濾停止詞
config.setAppendCJKSyn(false); //設置關閉同義詞追加
config.setKeepUnregWords(false); //設置去除不識別的詞條
ADictionary dic=DictionaryFactory.createSingletonDictionary(config);
ISegment seg=ISegment.COMPLEX.factory.create(config, dic);
//2, 構造TextRankSummaryExtractor自動摘要提取對象
SummaryExtractor extractor=new TextRankSummaryExtractor(seg, new SentenceSeg());
//3, 從一個Reader輸入流中獲取length長度的摘要
String str="Jcseg是基于mmseg算法的一個輕量級開源中文分詞器,同時集成了關鍵字提取,關鍵短語提取,關鍵句子提取和文章自動摘要等功能,并且提供了最新版本的lucene,%20solr,%20elasticsearch的分詞接口。Jcseg自帶了一個%20jcseg.properties文件用于快速配置而得到適合不同場合的分詞應用。例如:最大匹配詞長,是否開啟中文人名識別,是否追加拼音,是否追加同義詞等!";
String summary=extractor.getSummary(new StringReader(str), 64);
//4, output:
//Jcseg是基于mmseg算法的一個輕量級開源中文分詞器,同時集成了關鍵字提取,關鍵短語提取,關鍵句子提取和文章自動摘要等功能,并且提供了最新版本的lucene, solr, elasticsearch的分詞接口。
//-----------------------------------------------------------------
//5, 從一個Reader輸入流中提取n個關鍵句子
String str="you source string here";
extractor.setSentenceNum(6); //設置返回的關鍵句子個數
List<String> keySentences=extractor.getKeySentence(new StringReader(str));
TextRankKeyphraseExtractor(ISegment seg);
//seg: Jcseg ISegment分詞對象
//1, 創建Jcseg ISegment分詞對象
SegmenterConfig config=new SegmenterConfig(true);
config.setClearStopwords(false); //設置不過濾停止詞
config.setAppendCJKSyn(false); //設置關閉同義詞追加
config.setKeepUnregWords(false); //設置去除不識別的詞條
config.setEnSecondSeg(false); //關閉英文自動二次切分
ADictionary dic=DictionaryFactory.createSingletonDictionary(config);
ISegment seg=ISegment.COMPLEX.factory.create(config, dic);
//2, 構建TextRankKeyphraseExtractor關鍵短語提取器
TextRankKeyphraseExtractor extractor=new TextRankKeyphraseExtractor(seg);
extractor.setMaxIterateNum(100); //設置pagerank算法最大迭代詞庫,非必須,使用默認即可
extractor.setWindowSize(5); //設置textRank窗口大小,非必須,使用默認即可
extractor.setKeywordsNum(15); //設置最大返回的關鍵詞個數,默認為10
extractor.setMaxWordsNum(4); //設置最大短語詞長,默認為5
//3, 從一個輸入reader輸入流中獲取短語
String str="支持向量機廣泛應用于文本挖掘,例如,基于支持向量機的文本自動分類技術研究一文中很詳細的介紹支持向量機的算法細節,文本自動分類是文本挖掘技術中的一種!";
List<String> keyphrases=extractor.getKeyphrase(new StringReader(str));
//4, output:
//支持向量機, 自動分類
喜歡點個關注,私信回復"jcseg"獲取源碼地址。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。