一款基於SVM算法的分佈式法律助手
- 2020 年 4 月 8 日
- 筆記
一. 項目簡介 與 使用說明
體驗網站(適配手機端): http://www.zhuchangwu.com
項目基於 Spring Cloud 、Vue 構建,平台針對需要維權的用戶而設計,主要提供如下三個功能模塊。
-
一、提供問答服務模塊。
用戶可以在本模塊中描述一句簡短的話,系統將為用戶推送出與用戶描述相似的問題及答案。
-
二、罪名推斷模塊。
用戶可以輸入一個場景,系統將給用戶推送出此場景可能觸發的罪名,量刑區間,以及可能觸發的法律法規。
-
三、相似判決文書查詢模塊。
用戶可以將自己的判決文書輸入到系統中,系統將會為用戶推送相似的判決文書。
主頁
問答服務 – 支持前綴匹配,全文檢索
罪名推斷:
點擊主頁的案情推斷,輸入一段場景
點擊搜索:得出如下響應
相似文書查詢:
將您的文書拷貝進文書查詢模塊,點擊搜索,系統將推送給您往年相似的判決文書
結果如下:
二. 主要技術點
- 前後端分離架構,前端Vue + 後端SpringCloud。
- 基於 ElasticSearch 的搜索提示及全文檢索功能為用戶提供問答服務。
- 集成機器學習分類算法模型 SVM, 文本分類,推斷相關罪名。
- 基於simhash算法,實現相似文本檢查。
- Java 與 Python 使用Apache Thrift完成異構RPC調用。
- 使用Docker將SVM模型容器化,可移植性很強。
- 項目部署:靜態資源服務器 Nginx。
三. 環境搭建
3.1 後端
- 後端SpringCloud版本:Finchley.SR2
- 開發工具: IDEA
- Maven版本: 3.3.9
同學們自行將本項目clone到本地導入idea即可使用。
3.2 前端
前端github地址: https://github.com/zhuchangwu/lawyer-lover-vue-frontend
nodejs版本: v10.14.1
安裝命令:
npm install serve
前端代碼精簡,如果感興趣可以拉取下來自行開發
鳴謝: 前端貢獻者 ‘集智慧與美貌於一身’的:CamWang
3.3 SVM算法-Docker鏡像
推薦: 使用我封裝好的SVM算法模型的Docker鏡像,目前已經打包發佈在雲上, 優點如下:
- 基於Docker構建,可移植性很好,同學們可以直接拉取到自己服務器的Docker上,開箱即用。
- 添加了ApacheThrift 依賴,將算法模型封裝成了 Thrift – Server ,實現了和 Java-SpringCloud 的異步RPC通信。
如何拉取鏡像:
### 1. 啟動docker ### 2. 拉取鏡像 sudo docker pull registry.cn-beijing.aliyuncs.com/changwu/lawyer:release
使用鏡像
# 1. 啟動鏡像: docker run --name [指定容器名] -i -t -p 9998:9998 -d [ImageId] # 2. 進入容器: docker container exec -it [指定的容器名或者容器的ID] /bin/bash # 3. 啟動模型: docker run # 4. 切入目錄 cd /home/lawer # 5. 使用tmux使py在後台運行 , 在bash輸入如下命令 tmux # 6. 進入tmux,在tmux中啟動程序 ,模型需要加載大約30s完成啟動,在控制台可以看到啟動日誌 python thrift_server.py # 7. 模型啟動後,可以退出鏡像 `exit` 或者直接關閉ssh終端, 模型都會正常運行 # 8. 重新ssh上去之後,執行如下命令,可以看到python程序還在正常執行 tmux attach
鳴謝:liuhuanyong教授: 算法模型來源
3.4 Nginx相關配置
同學們在上線當前項目時推薦使用Nginx服務器代理靜態資源 。
當前項目使用Nginx做了如下幾點工作,同學們自行可以參照提供的配置項做適當修改。
- Nginx代理Vue打包生成的靜態資源。
- 解決前段端的跨域配置。
- 將用戶在前端請求轉發到後端SpringCloud網關。
nginx相關配置文件路徑: /reources/nginx-conf 。
四. ElasticSearch相關
4.1 版本:
推薦使用 6.2.4
因為我針對法律主題,做了的分詞器定製化( 拓展了詞庫 ), 下文有提及。
至於ES的安裝本文不再展開了,同學們可以自行百度安裝。
4.2 創建Index:實體類->Index
- 問答模塊index的建立腳本
PUT /ai_answer_question { "mappings": { "answer_question" : { "properties" : { "title" : { "type": "text", "analyzer": "ik_max_word", "fields": { // 添加搜索推薦 suggest "suggest" : { "type" : "completion", // 特定的類型 "analyzer": "ik_max_word" // 指定分詞器 } } }, "content": { "type": "text", "analyzer": "ik_max_word" } } } } }
另外兩個模塊的測試類像下面這樣寫測試類,通過Template無腦創建就行
@RunWith(SpringRunner.class) @SpringBootTest public class CrimeTest { @Autowired ElasticsearchTemplate template; @Autowired CrimeRepository repository; @Test public void deleteIndex(){ template.deleteIndex(Crime.class); } @Test public void testCreateIndexAndMapping() { template.createIndex(Crime.class); template.putMapping(Crime.class); } }
4.3 Ik分詞器
推薦我提供的IK分詞器: 路徑: /resource/ik
原因:
- 拓展中文詞庫。
- 加入了法律相關的專有名詞,提高專業名詞的得分率和召回率。
-
加入了停用詞(問候詞)
- 這麼設計的初衷是考慮到項目中的搜索提供功能, 比如用戶輸入了 房產XXX ,那麼我們將為其進行搜索並提示他有哪些以用戶輸入關鍵字開頭的詞條。
- 如果用戶僅僅是輸入了: 你好,請問 這類詞語將被ES過濾掉,而不理會。
- 如果你覺得不合理,可以去ik/conf中修改相關配置。
五. 數據
下面三個模塊的數據挺大的, 就不上傳到github了,同學搭建項目時如果需要如下三個模塊的測試數據 , 可以掃描下面二維碼關注,回復:data 領取後,自行導入ES即可。
-
相似文書模塊依賴的數據:
-
罪名推斷模塊依賴的數據:
-
問答模塊依賴的數據:
導入罪名模塊測試的方法
@Test public void add() { File file = new File("F:\新建文件夾\crime.json"); try { Set<Crime> set = new TreeSet<Crime>(new Comparator<Crime>() { @Override public int compare(Crime o1, Crime o2) { //字符串,則按照asicc碼升序排列 return o1.getCrimeName().compareTo(o2.getCrimeName()); } }); BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); String result = null; while (((result = bufferedReader.readLine()) != null)) { Crime crime = JsonUtils.jsonToPojo(result, Crime.class); set.add(crime); } System.out.println(set.size()); for (Crime crime : set) { repository.save(crime); } } catch (Exception e) { e.printStackTrace(); } }
六. 聯繫
可以通過博客聯繫我:
https://www.cnblogs.com/ZhuChangwu/
歡迎關注微信公眾號領取數據,(公共號剛起步,後續會分享整理的面試題) :