整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JCSHOP 一個企業級的B2B2C電商平臺解決方案

          JCSHOP 一個企業級的B2B2C電商平臺解決方案

          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商城

          小程序端

          常情況下,程序的執行順序是自上而下,逐條掃描執行的。STL指令集中有一類跳轉指令,可以中斷程序的這種線性執行流,跳轉到指定的位置繼續執行。



          一、 跳轉標簽

          跳轉的"目標"地址由"標簽"來指定,該標簽稱之為"跳轉標簽"。跳轉標簽最多4個字符,且第一個字符必須為字母。跳轉標簽后必須帶有冒號":" ,且在行中必須位于程序語句之前。

          二、 跳轉指令

          跳轉指令根據"跳轉"的機理,首先可分為"無條件跳轉"和"條件跳轉",除此之外,還有一個特殊的跳轉指令,可實現分支跳轉。

          1、 無條件跳轉指令JU



          程序在執行時,遇到JU指令,無條件的跳轉到其"標簽"所指示的代碼行繼續執行。跳轉指令和跳轉目標必須在同一個塊內。

          需要注意的是:理論上,JU指令允許向前跳,也允許向后跳。向后跳屬于常規用法,一般沒什么問題。但向前跳,容易形成死循環,因此,一般不建議使用JU命令向前跳。

          2、 有條件跳轉指令

          顧名思義,與無條件跳轉不同,有條件跳轉指令中斷原程序邏輯流,發生跳轉是需要條件的,根據跳轉條件的不同,它們又有不同的分類。

          (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的不同狀態,來決定相應的跳轉指令是否具備跳轉條件,如下表所示:



          3、 分支跳轉指令JL

          在語句表的指令集中,還有一條特殊的跳轉指令,它能夠實現向多路分支跳轉的功能,它就是分支跳轉指令JL,其執行流程如下圖所示。



          JL指令根據累加器1(ACCU1)的低字節中的數值大小來決定程序"沿著"哪一條分支執行。由于一個字節的數值范圍為0~255,因此,JL指令最多可管理多達256條分支的程序。

          JL指令一般要與無條件跳轉指令JU配合使用,其指令的格式如下:


          詳見《PLC語句表編程:“跳轉指令”特輯》

          cseg是基于mmseg算法的一個輕量級中文分詞器,同時集成了關鍵字提取,關鍵短語提取,關鍵句子提取和文章自動摘要等功能,并且提供了一個基于Jetty的web服務器,方便各大語言直接http調用,同時提供了最新版本的lucene, solr, elasticsearch的分詞接口!Jcseg自帶了一個 jcseg.properties文件用于快速配置而得到適合不同場合的分詞應用,例如:最大匹配詞長,是否開啟中文人名識別,是否追加拼音,是否追加同義詞等!

          Jcseg核心功能:

          • 中文分詞:mmseg算法 + Jcseg 獨創的優化算法,七種切分模式。
          • 關鍵字提取:基于textRank算法。
          • 關鍵短語提取:基于textRank算法。
          • 關鍵句子提取:基于textRank算法。
          • 文章自動摘要:基于BM25+textRank算法。
          • 自動詞性標注:基于詞庫+(統計歧義去除計劃),目前效果不是很理想,對詞性標注結果要求較高的應用不建議使用。
          • 命名實體標注:基于詞庫+(統計歧義去除計劃),電子郵件,網址,大陸手機號碼,地名,人名,貨幣,datetime時間,長度,面積,距離單位等。
          • Restful api:嵌入jetty提供了一個絕對高性能的server模塊,包含全部功能的http接口,標準化json輸出格式,方便各種語言客戶端直接調用。

          Jcseg中文分詞:

          七種切分模式:

          • 簡易模式:FMM算法,適合速度要求場合。
          • 復雜模式:MMSEG四種過濾算法,具有較高的歧義去除,分詞準確率達到了98.41%。
          • 檢測模式:只返回詞庫中已有的詞條,很適合某些應用場合。
          • 最多模式:細粒度切分,專為檢索而生,除了中文處理外(不具備中文的人名,數字識別等智能功能)其他與復雜模式一致(英文,組合詞等)。
          • 分隔符模式:按照給定的字符切分詞條,默認是空格,特定場合的應用。
          • NLP模式:繼承自復雜模式,更改了數字,單位等詞條的組合方式,增加電子郵件,大陸手機號碼,網址,人名,地名,貨幣等以及無限種自定義實體的識別與返回。
          • n-gram模式:CJK和拉丁系字符的通用n-gram切分實現。
          1. 支持自定義詞庫。在lexicon文件夾下,可以隨便添加/刪除/更改詞庫和詞庫內容,并且對詞庫進行了分類。
          2. 支持詞庫多目錄加載. 配置lexicon.path中使用';'隔開多個詞庫目錄.
          3. 詞庫分為簡體/繁體/簡繁體混合詞庫: 可以專門適用于簡體切分, 繁體切分, 簡繁體混合切分, 并且可以利用下面提到的同義詞實現,簡繁體的相互檢索, Jcseg同時提供了詞庫兩個簡單的詞庫管理工具來進行簡繁體的轉換和詞庫的合并。
          4. 中英文同義詞追加/同義詞匹配 + 中文詞條拼音追加.詞庫整合了《現代漢語詞典》和cc-cedict辭典中的詞條,并且依據cc-cedict詞典為詞條標上了拼音,依據《中華同義詞詞典》為詞條標上了同義詞(尚未完成)。更改jcseg.properties配置文檔可以在分詞的時候加入拼音和同義詞到分詞結果中。
          5. 中文數字和中文分數識別,例如:"一百五十個人都來了,四十分之一的人。"中的"一百五十"和"四十分之一"。并且 Jcseg會自動將其轉換為阿拉伯數字加入到分詞結果中。如:150, 1/40。
          6. 支持中英混合詞和英中混合詞的識別(維護詞庫可以識別任何一種組合)。例如:B超, x射線, 卡拉ok, 奇都ktv, 哆啦a夢。
          7. 更好的英文支持,電子郵件,域名,小數,分數,百分數,字母和標點組合詞(例如C++, c#)的識別。
          8. 自定義切分保留標點. 例如: 保留&, 就可以識別k&r這種復雜詞條。
          9. 復雜英文切分結果的二次切分: 可以保留原組合,同時可以避免復雜切分帶來的檢索命中率下降的情況,例如QQ2013會被切分成: qq2013/ qq/ 2013, chenxin619315@gmail.com會被切分成: chenxin619315@gmail.com/ chenxin/ 619315/ gmail/ com。
          10. 支持阿拉伯數字/小數/中文數字基本單字單位的識別,例如2012年,1.75米,38.6℃,五折,并且 Jcseg會將其轉換為“5折”加入分詞結果中。
          11. 智能圓角半角, 英文大小寫轉換。
          12. 特殊字母識別:例如:Ⅰ,Ⅱ;特殊數字識別:例如:①,⑩。
          13. 配對標點內容提取:例如:最好的Java書《java編程思想》,‘暢想杯黑客技術大賽’,被《,‘,“,『標點標記的內容。(1.6.8版開始支持)。
          14. 智能中文人名/外文翻譯人名識別。中文人名識別正確率達94%以上。(中文人名可以維護lex-lname.lex,lex-dname-1.lex,lex-dname-2.lex來提高準確率),(引入規則和詞性后會達到98%以上的識別正確率)。
          15. 自動中英文停止詞過濾功能(需要在jcseg.properties中開啟該選項,lex-stopwords.lex為停止詞詞庫)。
          16. 詞庫更新自動加載功能, 開啟一個守護線程定時的檢測詞庫的更新并且加載(注意需要對應詞庫目錄下的的lex-autoload.todo文件的寫入權限)。
          17. 自動詞性標注(目前基于詞庫)。
          18. 自動實體的識別,默認支持:電子郵件,網址,大陸手機號碼,地名,人名,貨幣等;詞庫中可以自定義各種實體并且再切分中返回。

          Jcseg快速體驗:

          終端測試:

          1. cd到 Jcseg根目錄。
          2. ant all(或者使用maven編譯)
          3. 運行:java -jar jcseg-core-{version}.jar
          4. 你將看到如下的終端界面
          5. 在光標處輸入文本開始測試(輸入:seg_mode參數切換可以體驗各種切分算法)
          +--------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

          Jcseg Maven倉庫:

          • jcseg-core:
          <dependency>
              <groupId>org.lionsoul</groupId>
              <artifactId>jcseg-core</artifactId>
              <version>2.6.2</version>
          </dependency>
          
          • jcseg-analyzer (lucene或者solr):
          <dependency>
              <groupId>org.lionsoul</groupId>
              <artifactId>jcseg-analyzer</artifactId>
              <version>2.6.2</version>
          </dependency>
          • jcseg-elasticsearch
          <dependency>
              <groupId>org.lionsoul</groupId>
              <artifactId>jcseg-elasticsearch</artifactId>
              <version>2.6.2</version>
          </dependency>
          • jcseg-server (獨立的應用服務器)
          <dependency>
              <groupId>org.lionsoul</groupId>
              <artifactId>jcseg-server</artifactId>
              <version>2.6.2</version>
          </dependency>

          Jcseg lucene分詞接口:

          1. 導入jcseg-core-{version}.jar和jcseg-analyzer-{version}.jar
          2. demo代碼:
          //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

          Jcseg solr分詞接口:

          1. 將jcseg-core-{version}.jar和jcseg-analyzer-{version}.jar 復制到solr 的類庫目錄中。
          2. 在solr的scheme.xml加入如下兩種配置之一:
          <!-- 復雜模式分詞: -->
          <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>

          備注:

          1. 如果使用的是solr-4.x版本,請下載v1.9.7-release tag下的源碼編譯得到對應的jar,然后將上述xml中的v5x改成v4x即可。
          2. 如果是使用的是solr-6.3.0以下版本,JcsegTokenizerFactory包名路徑為:org.lionsoul.jcseg.analyzer.v5x.JcsegTokenizerFactory
          3. tokenizer定義中可以使用jcseg.properties中定義的任何配置來自定義配置,區別就是將配置名稱的"."替換成"_"即可,開啟同義詞:
          <fieldtype name="textComplex" class="solr.TextField">
              <analyzer>
                  <tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="complex" jsceg_loadsyn="1"/>
              </analyzer>
          </fieldtype>

          Jcseg elasticsearch接口:

          elasticsearch.version < 2.x (Not sure)
          1. 下載最新版本的 Jcseg源碼。
          2. 使用maven或者ant編譯打包得到 Jcseg的系列jar包(建議使用maven,ant需要自己下載對應的依賴包)。
          3. 拷貝jcseg-analyzer-{version}.jar,jcseg-core-{version}.jar,jcseg-elasticsearch-{version}.jar到{ES_HOME}/plugins/analysis-jcseg目錄下(自己建立該文件夾,如果不存在)。
          4. 拷貝一份jcseg.properties到{ES_HOME}/config/jcseg目錄下(自己建立該文件夾,如果不存在)。
          5. 配置好jcseg.properties,尤其是配置lexicon.path指向正確的詞庫(或者將jcseg目錄下的lexicon文件夾拷貝到{ES_HOME}/plugins/jcseg目錄下)。
          6. 參考下載的源碼中的 jcseg-elasticsearch 項目下的 config/elasticsearch.yml 配置文件,將對應的配置加到{ES_HOME}/config/elasticsearch.yml中去。
          7. 配置elasticsearch.yml或者mapping來使用 Jcseg分詞插件(或者在query中指定)。
          elasticsearch.version >=2.x
          1. 下載最新版本的 Jcseg源碼。
          2. 使用maven或者ant編譯打包得到 Jcseg的系列jar包(建議使用maven,ant需要自己下載對應的依賴包)。
          3. 拷貝jcseg-analyzer-{version}.jar,jcseg-core-{version}.jar,jcseg-elasticsearch-{version}.jar到{ES_HOME}/plugins/jcseg目錄下(自己建立該文件夾,如果不存在)。
          4. 拷貝一份jcseg.properties到{ES_HOME}/plugins/jcseg目錄下(自己建立該文件夾,如果不存在)。
          5. 拷貝一份jcseg-elasticsearch/plugin/plugin-descriptor.properties到{ES_HOME}/plugins/jcseg目錄下(自己建立該文件夾,如果不存在)。
          6. 配置好jcseg.properties,尤其是配置lexicon.path指向正確的詞庫(或者將jcseg目錄下的lexicon文件夾拷貝到{ES_HOME}/plugins/jcseg目錄下)。
          7. 參考下載的源碼中的 jcseg-elasticsearch 項目下的 config/elasticsearch.yml 配置文件,將對應的配置加到{ES_HOME}/config/elasticsearch.yml中去。
          8. 配置elasticsearch.yml或者mapping來使用 Jcseg分詞插件(或者在query中指定)。
          elasticsearch.version >=5.1.1
          1. 下載最新版本的 Jcseg源碼。
          2. 使用maven或者ant編譯打包得到 Jcseg的系列jar包(建議使用maven,ant需要自己下載對應的依賴包)。
          3. 拷貝jcseg-analyzer-{version}.jar,jcseg-core-{version}.jar,jcseg-elasticsearch-{version}.jar到{ES_HOME}/plugins/jcseg目錄下(自己建立該文件夾,如果不存在)。
          4. 拷貝一份jcseg.properties到{ES_HOME}/plugins/jcseg目錄下(自己建立該文件夾,如果不存在)。
          5. 拷貝一份jcseg-elasticsearch/plugin/plugin-descriptor.properties到{ES_HOME}/plugins/jcseg目錄下(自己建立該文件夾,如果不存在)。
          6. 配置好jcseg.properties,尤其是配置lexicon.path指向正確的詞庫(或者將jcseg目錄下的lexicon文件夾拷貝到{ES_HOME}/plugins/jcseg目錄下)。
          7. mapping指定來使用 Jcseg分詞插件(或者在query中指定)。

          可選的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分詞服務器:

          jcseg-server模塊嵌入了jetty,實現了一個絕對高性能的服務器,給jcseg的全部Api功能都加上了restful接口,并且標準化了api結果的json輸出格式,各大語言直接使用http客戶端調用即可。

          編譯jcseg:

          2.3.0之前的版本:
          1. maven編譯jcseg,得到jcseg-server-{version}.jar, maven已經將依賴的jar包一起編譯進去了,如果是ant編譯運行時請將依賴包載入。
          2. 啟動jcseg server:
          # 在最后傳入jcseg-server.properties配置文件的路徑
          java -jar jcseg-server-{version}.jar ./jcseg-server.properties
          2.3.0之后的版本:
          1. maven編譯jcseg,jcseg會在jcseg-server/target/jcseg-server目錄下打包一個完整的項目,目錄結構如下:
          01, config: 配置目錄,jcseg-server.properties管理服務器和詞庫的配置,jvm.options管理jvm的參數,例如內存分配等,默認1.5G
          02, lib: 全部依賴的jar包目錄
          03, lexicon: jcseg詞庫目錄,在此更改管理詞庫即可
          04, jcseg-server: 啟動管理腳本, 僅限linux 增加-d參數可以后臺啟動
          1. 啟動jcseg server:
          # 將jcseg-server/target/jcseg-server整個目錄拷貝到安裝目錄,設為$JS_DIR
          
          cd $JS_DIR
          
          # 初次運行給jcseg-server增加+x權限
          # 同步運行
          ./jcseg-server
          
          # 后臺運行
          ./jcseg-server -d

          jcseg-server.properties:

          懶得翻譯了,默默的多念幾遍就會了!

          # 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": {
                  #   ...
                  # }
              }
          }

          restful api:

          1. 關鍵字提取:

          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

          2. 關鍵短語提取:

          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

          3. 關鍵句子提取:

          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

          4. 文章摘要提取:

          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

          5. 文章自動分詞:

          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

          Jcseg二次開發:

          1. Jcseg中文分詞Api:

          Javadoc參考:Jcseg Javadoc

          (1). 創建JcsegTaskConfig配置對象:

          jcseg.properties查找步驟:

          • 1,尋找jcseg-core-{version}.jar目錄下的jcseg.properties
          • 2,如果沒找到繼續尋找classpath下的jcseg.properties(默認已經打包了)
          • 3,如果沒找到繼續尋找user home下的jcseg.properties(除非把classpath下的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");
          (2). 創建ADictionary詞庫對象:

          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"));
          
          //閱讀下面的“如果自定義使用詞庫”來獲取更多信息
          (3). 創建ISegment分詞實例:

          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());
          }
          (4). 一個完整的例子:
          //創建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());
          }
          (5). 如何自定義使用詞庫:

          從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設置詞庫路徑:
          //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);
          • 2),通過ADictionary手動加載詞庫:
          //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)

          2. Jcseg關鍵字提取Api:

          • 1),TextRankKeywordsExtractor構造方法:
          TextRankKeywordsExtractor(ISegment seg);
          //seg: Jcseg ISegment分詞對象
          • 2),demo代碼:
          //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:
          //"分詞","方法","分為","標注","相結合","字符串","匹配","過程","大類","單純"
          • 3),測試源碼參考:org.lionsoul.jcseg.test.KeywordsExtractorTest源碼

          3. Jcseg自動摘要/關鍵句子提取Api:

          • 1),TextRankSummaryExtractor構造方法:
          TextRankSummaryExtractor(ISegment seg, SentenceSeg sentenceSeg);
          //seg: Jcseg ISegment分詞對象
          //sentenceSeg: Jcseg SentenceSeg句子切分對象
          • 2),demo代碼:
          //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));
          • 3),測試源碼參考:org.lionsoul.jcseg.test.SummaryExtractorTest源碼

          4. Jcseg關鍵短語提取Api:

          • 1),TextRankKeyphraseExtractor構造方法:
          TextRankKeyphraseExtractor(ISegment seg);
          //seg: Jcseg ISegment分詞對象
          • 2),demo代碼:


          //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:
          //支持向量機, 自動分類
          • 3),測試源碼參考:org.lionsoul.jcseg.test.KeyphraseExtractorTest源碼

          喜歡點個關注,私信回復"jcseg"獲取源碼地址。


          主站蜘蛛池模板: 无码人妻久久一区二区三区免费| 亚洲av无码一区二区乱子伦as| 国产剧情国产精品一区| 高清一区二区三区日本久| 精品国产一区二区三区不卡 | 国精产品一区一区三区免费视频| 国产视频一区在线观看| 精品人妻码一区二区三区| 午夜一区二区在线观看| 中文字幕一区日韩在线视频| 久久人做人爽一区二区三区| 国产一区美女视频| 日本一区二区在线| 最新中文字幕一区二区乱码| 一区二区三区四区在线播放| 午夜影视日本亚洲欧洲精品一区 | 日韩免费一区二区三区在线播放 | 国产精品一区二区三区99| 无码少妇一区二区| 国模吧一区二区三区精品视频| 久久国产三级无码一区二区| 亚洲第一区二区快射影院| 鲁大师成人一区二区三区| 无码免费一区二区三区免费播放| 风间由美在线亚洲一区| 一区二区三区在线免费看| 一区精品麻豆入口| 日韩中文字幕一区| 美女啪啪一区二区三区| 国产亚洲福利一区二区免费看| 久久久久久免费一区二区三区| 国产精品一区二区在线观看| 无码人妻一区二区三区免费n鬼沢| 波多野结衣一区二区三区高清在线 | 国产主播在线一区| 亚洲毛片αv无线播放一区 | 日本一区频道在线视频| 日韩免费视频一区二区| 国产伦精品一区二区三区无广告 | 欲色影视天天一区二区三区色香欲| 久久久久人妻精品一区|