NLP在线医生(一)
1.1 背景介紹
- 學習目標:
- 了解智能對話系統的相關背景知識.
- 掌握使用Unit對話API.
- 什么是智能對話系統?
- 隨著人工智能技術的發展, 聊天機器人, 語音助手等應用在生活中隨處可見, 比如百度的小度, 阿里的小蜜, 微軟的小冰等等. 其目的在于通過人工智能技術讓機器像人類一樣能夠進行智能回復, 解決現實中的各種問題.
- 從處理問題的角度來區分, 智能對話系統可分為:
- 任務導向型: 完成具有明確指向性的任務, 比如預定酒店咨詢, 在線問診等等.
- 非任務導向型: 沒有明確目的, 比如算算術, 播放音樂, 回答問題.
- 我們的在線醫生項目就是任務導向型的智能對話系統.
1.2 Unit對話API的使用
- 學習目標:
- 了解Unit平臺的相關知識.
- 掌握調用Unit API的實現過程.
- Unit平臺的相關知識:
- Unit平臺是百度大腦開放的智能對話定制與服務平臺, 也是當前最大的中文領域對話開放平臺之一. Unit對注冊用戶提供免費的對話接口服務, 比如中文閑聊API, 百科問答API, 詩句生成API等, 通過這些API我們可以感受一下智能對話的魅力, 同時它也可以作為任務導向型對話系統無法匹配用戶輸入時的最終選擇.
- Unit閑聊API演示:
- 調用Unit API的實現過程:
- 第一步: 注冊登錄百度賬戶, 進入Unit控制臺創建自己的機器人.
- 第二步: 進行相關配置, 獲得請求API接口需要的API Key與Secret Key.
- 第三步: 在服務器上編寫API調用腳本并進行測試.
- 第一步: 注冊登錄百度賬戶, 進入Unit控制臺創建自己的機器人.
ai.baidu.com
- 第二步: 進行相關配置, 獲得請求API接口需要的API Key與Secret Key.
- 點擊獲取API Key進入百度云應用管理頁面.
- 點擊創建應用, 進入應用信息表單填寫頁面.
- 填寫完畢后, 點擊立即創建, 成功后會提示創建完畢.
- 點擊返回應用列表.
- 可以看到創建的API Key和Secret Key, 至此創建流程結束.
- 第三步: 在服務器上編寫API調用腳本并進行測試
- 代碼位置: /data/doctor_online/main_serve/unit.py
- 調用:
- 輸出效果:
-
本章總結:
- 學習了智能對話系統的相關背景知識:
- 什么是智能對話系統
- 從處理問題的目的來區分, 智能對話系統的分類
- 我們的在線醫生項目就是任務導向型的智能對話系統.
- 學習了Unit平臺的相關知識:
- Unit平臺是百度大腦開放的智能對話定制與服務平臺, 也是當前最大的中文領域對話開放平臺之一.
- 學習了調用Unit API的實現過程:
- 第一步: 注冊登錄百度賬戶, 進入Unit控制臺創建自己的機器人.
- 第二步: 進行相關配置, 獲得請求API接口需要的API Key與Secret Key.
- 第三步: 在服務器上編寫API調用腳本并進行測試.
- 學習了智能對話系統的相關背景知識:
2.1 在線醫生的總體架構
- 學習目標:
- 了解在線醫生項目的總體架構
- 項目整體架構圖:
- 架構圖分析:
- 整個項目分為: 在線部分和離線部分
- 在線部分包括: werobot服務模塊, 主要邏輯服務模塊, 句子相關模型服務模塊, 會話管理模塊(redis), 圖數據庫模塊以及規則對話/Unit模塊.
- 離線部分包括: 結構與非結構化數據采集模塊, NER模型使用模塊, 以及實體審核模型使用模塊.
- 在線部分數據流: 從用戶請求開始, 通過werobot服務, 在werobot服務內部請求主服務, 在主服務中將調用會話管理數據庫redis, 調用句子相關模型服務, 以及調用圖數據庫, 最后將查詢結果輸送給對話規則模版或者使用Unit對話API回復.
- 離線部分數據流: 從數據采集開始, 將獲得結構化和非結構化的數據, 對于結構化數據將直接使用實體審核模型進行審核, 然后寫入圖數據庫; 對于非結構化數據, 將使用NER模型進行實體抽取, 然后通過實體審核后再寫入圖數據庫.
2.2 總體架構中的工具介紹
- 學習目標:
- 了解總體架構中使用了哪些工具.
- 掌握總體架構中各個工具的簡介, 作用, 安裝和基本使用方法.
- 總體架構中使用的工具:
- Flask web服務框架
- Redis數據庫
- Gunicorn服務組件
- Supervisor服務監控器
- Neo4j圖數據庫
- Flask web服務框架:
- 簡介:
* Flask框架是當下最受歡迎的python輕量級框架, 也是pytorch官網指定的部署框架. Flask的基本模式為在程序里將一個視圖函數分配給一個URL,每當用戶訪問這個URL時,系統就會執行給該URL分配好的視圖函數,獲取函數的返回值,其工作過程見圖.
- 作用:
* 在項目中, Flask框架是主邏輯服務和句子相關模型服務使用的服務框架.
- 安裝:
- 基本使用方法:
- 代碼位置: /data/doctor_onine/main_serve/app.py
- 啟動服務:
- 啟動效果:
* 通過瀏覽器打開地址http://127.0.0.1:5000/可看見打印了’Hello, World’.
- Redis數據庫:
window下使用redis
先在redis目錄下cmd: redis-server.exe redis.windows.conf 啟動redis服務
再在redis目錄下另開cmd,輸入redis-cli -h 127.0.0.1 -p 6379 -a 密碼
- 簡介:
* Redis(全稱:Remote Dictionary Server 遠程字典服務)是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API.
- 作用:
* 在項目中, Redis用于會話管理數據庫, 保存用戶聊天歷史.
- 安裝:
- 基本使用方法:
* Redis支持四種數據結構的存儲: String(字符串), Hash(散列), List(列表), Set(集合), Sorted Set(有序集合).
* 在這里我們將著重介紹如何在python中使用Hash(散列)進行讀寫.
- 安裝python中的redis驅動:
- 啟動redis服務:
- 在python中使用Hash(散列)進行讀寫:
如果redis 設置了密碼
需要
REDIS_CONFIG = {
‘host’:‘127.0.0.1’,
‘port’:6379,
‘password’:‘123456’
}
否則報錯:Authentication required.
- 輸出效果:
- Gunicorn服務組件:
- 簡介:
* Gunicorn是一個被廣泛使用的高性能的Python WSGI UNIX HTTP服務組件(WSGI: Web Server Gateway Interface),移植自Ruby的獨角獸(Unicorn )項目,具有使用非常簡單,輕量級的資源消耗,以及高性能等特點.
- 作用:
* 在項目中, Gunicorn和Flask框架一同使用, 能夠開啟服務, 處理請求,因其高性能的特點能夠有效減少服務丟包率.
- 安裝:
- 基本使用方法:
- Supervisor服務監控:
- 簡介:
* Supervisor是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具。它可以很方便的監聽、啟動、停止、重啟一個或多個進程, 并守護這些進程。
- 作用:
* 在項目中, Supervisor用于監控和守護主要邏輯服務和redis數據庫服務.
- 安裝:
- 基本使用方法:
- 還可以通過瀏覽器查看可視化監控頁面: http://0.0.0.0:9001
- Neo4j圖數據庫:
- 因為在項目中, Neo4j圖數據庫作為核心的存儲和查詢數據庫, 后續課件中對其進行詳細的介紹.
-
本章總結:
- 學習了架構圖分析:
- 整個項目分為: 在線部分和離線部分
- 在線部分包括: werobot服務模塊, 主要邏輯服務模塊, 句子相關模型服務模塊, 會話管理模塊(redis), 圖數據庫模塊以及規則對話/Unit模塊.
- 離線部分包括: 結構與非結構化數據采集模塊, NER模型使用模塊, 以及實體審核模型使用模塊.
- 學習了總體架構中使用的工具:
- Flask web服務框架
- Redis數據庫
- Gunicorn服務組件
- Supervisor服務監控器
- Neo4j圖數據庫
- Flask web服務框架:
- 作用: 在項目中, Flask框架是主邏輯服務和句子相關模型服務使用的服務框架.
- Redis數據庫:
- 作用: 在項目中, Redis用于會話管理數據庫, 保存用戶聊天歷史.
- Gunicorn服務組件:
- 作用: 在項目中, Gunicorn和Flask框架一同使用, 能夠開啟服務, 處理請求,因其高性能的特點能夠有效減少服務丟包率.
- Supervisor服務監控:
- 作用: 在項目中, Supervisor用于監控和守護主要邏輯服務和redis數據庫服務.
- 學習了架構圖分析:
3.1 neo4j簡介
- 學習目標:
- 了解neo4j圖數據庫的簡介, 版本說明.
- 了解節點, 關系,屬性,標簽的有關概念.
windows 下neo4j
警告: ERROR! Neo4j cannot be started using java version 1.7.0_75
解決: java JDK下載
并重新配置java JDK 環境變量后,可以正常啟動neo4j
瀏覽器登錄http://localhost:7474/browser/ 初始賬號密碼均為:neo4j
若出現問題:“ NotFoundError:無法在’Node’上執行’removeChild’:要刪除的節點不是該節點的子節點?!辈⑶覒贸绦驘o法恢復。 更換chrome或者其他瀏覽器
- neo4j簡介:
- neo4j是由Java實現的開源NoSQL圖數據庫.自從2003年開始研發, 到2007年發布第一版, 最新版本為3.3.5, neo4j現如今已經被各行各業的數十萬家公司和組織采用.
- neo4j實現了專業數據庫級別的圖數據模型的存儲. 與普通的圖處理或內存級數據庫不同, neo4j提供了完整的數據庫特性, 包括ACID事物的支持, 集群支持, 備份與故障轉移等. 這使其適合于企業級生產環境下的各種應用.
- neo4j的版本說明:
- 企業版: 需要高額的付費獲得授權, 提供高可用, 熱備份等性能.
- 社區開源版: 免費使用, 但只能單點運行.
- neo4j圖形數據庫的有關概念:
- 節點
* 節點是主要的數據元素, 節點通過關系連接到其他節點, 節點可以具有一個或多個屬性
(即存儲為鍵/值對的屬性), 節點有一個或多個標簽, 用于描述其在圖表中的作用. 示例: Person>節點.
* 可以將節點類比為關系型數據庫中的表, 對應的標簽可以類比為不同的表名, 屬性就是表中的列.
- 關系
* 關系連接兩個節點, 關系是方向性的, 關系可以有一個或多個屬性(即存儲為鍵/值對的
屬性).
- 屬性
* 屬性是命名值, 其中名稱(或鍵)是字符串, 屬性可以被索引和約束, 可以從多個屬性創
建復合索引.
- 標簽
* 標簽用于組節點到集, 節點可以具有多個標簽, 對標簽進行索引以加速在圖中查找節點.
3.2 neo4j圖數據庫的安裝
- 學習目標:
- 掌握neo4j圖數據庫的安裝流程及其可視化后臺的登陸…
- neo4j圖數據庫的安裝流程:
- 第一步: 將neo4j安裝信息載入到yum檢索列表.
- 第二步: 使用yum install命令安裝.
- 第三步: 修改配置文件內容 /etc/neo4j/neo4j.conf.
- 第四步: 啟動neo4j數據庫.
- 第一步: 將neo4j安裝信息載入到yum檢索列表
- 第二步: 使用yum install命令安裝
- 第三步: 修改配置文件默認在/etc/neo4j/neo4j.conf, 為了方便顯示下面把一些修改顯示在這里
- 第四步: 啟動neo4j數據庫
- neo4j的可視化管理后臺登陸:
- 訪問地址: http://0.0.0.0:7474.
- ConnectURL: bolt://0.0.0.0:7687
- Username: neo4j
- Password: neo4j (默認)
-
小節總結:
- 學習了neo4j圖數據庫的安裝流程:
- 第一步: 將neo4j安裝信息載入到yum檢索列表.
- 第二步: 使用yum install命令安裝.
- 第三步: 修改配置文件內容 /etc/neo4j/neo4j.conf.
- 第四步: 啟動neo4j數據庫.
- 學習了neo4j的可視化管理后臺登陸:
- 訪問地址: http://0.0.0.0:7474.
- ConnectURL: bolt://0.0.0.0:7687
- Username: neo4j
- Password: neo4j (默認)
- 學習了neo4j圖數據庫的安裝流程:
3.3 Cypher介紹與使用
- 學習目標
- 了解Cypher的基本概念.
- 掌握Cypher的基本命令和語法.
- Cypher的基本概念:
- Cypher是neo4j圖數據的查詢語言, 類似于mysql數據庫的sql語句, 但是它允許對圖形進行富有表現力和有效的查詢和更新.
- Cypher的基本命令和語法:
- create命令
- match命令
- merge命令
- relationship關系命令
- where命令
- delete命令
- sort命令
- 字符串函數
- 聚合函數
- index索引命令
- create命令: 創建圖數據中的節點.
- 演示:
- 效果
- match命令: 匹配(查詢)已有數據.
- 演示:
- 效果:
- merge命令: 若節點存在, 則等效與match命令; 節點不存在, 則等效于create命令.
- 演示:
- 效果:
- 然后再次用merge查詢, 發現數據庫中的數據并沒有增加, 因為已經存在相同的數據了, merge匹配成功.
- 演示:
- 效果:
- 使用create創建關系: 必須創建有方向性的關系, 否則報錯.
- 演示:
- 效果:
- 使用merge創建關系: 可以創建有/無方向性的關系.
- 演示:
- 效果:
- where命令: 類似于SQL中的添加查詢條件.
- 演示:
- 效果:
- delete命令: 刪除節點/關系及其關聯的屬性.
- 演示:
- 效果:
- sort命令: Cypher命令中的排序使用的是order by.
- 演示:
- 效果:
- 字符串函數:
- toUpper()函數
- toLower()函數
- substring()函數
- replace()函數
- toUpper()函數: 將一個輸入字符串轉換為大寫字母.
- 演示:
- 效果:
- toLower()函數: 講一個輸入字符串轉換為小寫字母.
- 演示:
- 效果:
- substring()函數: 返回一個子字符串.
- 演示:
- 效果:
- replace()函數: 替換掉子字符串.
- 演示:
- 效果:
- 聚合函數
- count()函數
- max()函數
- min()函數
- sum()函數
- avg()函數
- count()函數: 返回由match命令匹配成功的條數.
- 演示:
- 效果:
- max()函數: 返回由match命令匹配成功的記錄中的最大值.
- 演示:
- 效果:
- min()函數: 返回由match命令匹配成功的記錄中的最小值.
- 演示:
- 效果:
- sum()函數: 返回由match命令匹配成功的記錄中某字段的全部加和值.
- 演示:
- 效果:
- avg()函數: 返回由match命令匹配成功的記錄中某字段的平均值.
- 演示:
- 效果:
- 索引index
- Neo4j支持在節點或關系屬性上的索引, 以提高查詢的性能.
- 可以為具有相同標簽名稱的所有節點的屬性創建索引.
- 創建索引: 使用create index on來創建索引.
- 演示:
- 效果:
- 刪除索引: 使用drop index on來刪除索引.
- 演示:
- 效果:
-
小節總結:
- 學習了Cypher的基本概念:
- Cypher是neo4j圖數據的查詢語言, 類似于mysql數據庫的sql語句, 但是它允許對圖形進行富有表現力和有效的查詢和更新.
- Cypher的基本命令和語法:
- create命令
- match命令
- merge命令
- relationship關系命令
- where命令
- delete命令
- sort命令
- 字符串函數
- 聚合函數
- index索引命令
- create命令: 創建圖數據中的節點.
- CREATE (e:Employee{id:222, name:‘Bob’, salary:6000, deptnp:12})
- match命令: 匹配(查詢)已有數據.
- MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno
- merge命令: 若節點存在, 則等效與match命令; 節點不存在, 則等效于create命令.
- MERGE (e:Employee {id:145, name:‘Lucy’, salary:7500, deptno:12})
- 使用create創建關系: 必須創建有方向性的關系, 否則報錯.
- CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)
- 使用merge創建關系: 可以創建有/無方向性的關系.
- MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)
- where命令: 類似于SQL中的添加查詢條件.
- MATCH (e:Employee) WHERE e.id=123 RETURN e
- delete命令: 刪除節點/關系及其關聯的屬性.
- MATCH (c1:CreditCard)-[r]-(c2:Customer) DELETE c1, r, c2
- sort命令: Cypher命令中的排序使用的是order by.
- MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id
- 字符串函數:
- toUpper()函數
- toLower()函數
- substring()函數
- replace()函數
- toUpper()函數: 將一個輸入字符串轉換為大寫字母.
- MATCH (e:Employee) RETURN e.id, toUpper(e.name), e.salary, e.deptno
- toLower()函數: 講一個輸入字符串轉換為小寫字母.
- MATCH (e:Employee) RETURN e.id, toLower(e.name), e.salary, e.deptno
- substring()函數: 返回一個子字符串.
- MATCH (e:Employee) RETURN e.id, substring(e.name,0,2), e.salary, e.deptno
- replace()函數: 替換掉子字符串.
- MATCH (e:Employee) RETURN e.id, replace(e.name,e.name,e.name + “_HelloWorld”), e.salary, e.deptno
- 聚合函數
- count()函數
- max()函數
- min()函數
- sum()函數
- avg()函數
- count()函數: 返回由match命令匹配成功的條數.
- MATCH (e:Employee) RETURN count( * )
- max()函數: 返回由match命令匹配成功的記錄中的最大值.
- MATCH (e:Employee) RETURN max(e.salary)
- min()函數: 返回由match命令匹配成功的記錄中的最小值.
- MATCH (e:Employee) RETURN min(e.salary)
- sum()函數: 返回由match命令匹配成功的記錄中某字段的全部加和值.
- MATCH (e:Employee) RETURN sum(e.salary)
- avg()函數: 返回由match命令匹配成功的記錄中某字段的平均值.
- MATCH (e:Employee) RETURN avg(e.salary)
- 索引index
- Neo4j支持在節點或關系屬性上的索引, 以提高查詢的性能.
- 可以為具有相同標簽名稱的所有節點的屬性創建索引.
- 創建索引: 使用create index on來創建索引.
- CREATE INDEX ON:Employee(id)
- 刪除索引: 使用drop index on來刪除索引.
- DROP INDEX ON:Employee(id)
- 學習了Cypher的基本概念:
3.4 在Python中使用neo4j
- 學習目標
- 了解python中neo4j-driver的相關知識.
- 掌握neo4j中事務概念和操作方法.
- neo4j-driver簡介:
- neo4j-driver是一個python中的package, 作為python中neo4j的驅動, 幫助我們在python程序中更好的使用圖數據庫.
- neo4j-driver的安裝:
- neo4j-driver使用演示:
config.py
# 設置neo4j圖數據庫的配置信息 NEO4J_CONFIG = {"uri": "bolt://127.0.0.1:7687","auth": ("username", "password"),"encrypted": False } from neo4j import GraphDatabase# 關于neo4j數據庫的用戶名,密碼信息已經配置在同目錄下的config.py文件中 from config import NEO4J_CONFIGdriver = GraphDatabase.driver( **NEO4J_CONFIG)# 直接用python代碼形式訪問節點Company, 并返回所有節點信息 with driver.session() as session:cypher = "CREATE(c:Company) SET c.name='在線醫生' RETURN c.name"record = session.run(cypher)result = list(map(lambda x: x[0], record))print("result:", result)- 輸出效果:
- 事務的概念:
- 如果一組數據庫操作要么全部發生要么一步也不執行,我們稱該組處理步驟為一個事務, 它是數據庫一致性的保證.
- 使用事務的演示:
- 輸出效果:
查詢多個節點多個屬性
match(c:Cat) - [r] - (m:Mouse) return c.name, m.name
-
小節總結:
- 學習了neo4j-driver簡介:
- neo4j-driver是一個python中的package, 作為python中neo4j的驅動, 幫助我們在python程序中更好的使用圖數據庫.
- 學習了neo4j-driver的安裝和使用方法.
- 學習了事務的概念:
- 如果一組數據庫操作要么全部發生要么一步也不執行,我們稱該組處理步驟為一個事務, 它是數據庫一致性的保證.
- 學習了如何使用事務來向圖數據庫中寫入數據.
- 學習了neo4j-driver簡介:
4.1 離線部分簡要分析
- 學習目標:
- 了解離線部分的數據流水線以及組成部分.
- 了解各個組成部分的作用.
- 離線部分架構圖:
- 離線部分架構展開圖:
- 離線部分簡要分析:
- 根據架構展開圖圖,離線部分可分為兩條數據流水線,分別用于處理結構化數據和非結構化數據. 這里稱它們為結構化數據流水線和非結構化數據流水線.
- 結構化數據流水線的組成部分:
- 結構化數據爬蟲: 從網頁上抓取結構化的有關醫學命名實體的內容.
- 結構化數據的清洗: 對抓取的內容進行過濾和清洗, 以保留需要的部分.
- 命名實體審核: 對當前命名實體進行審核, 來保證這些實體符合我們的要求.
- 命名實體寫入數據庫: 將審核后的命名實體寫入數據庫之中, 供在線部分使用.
- 非結構化數據流水線的組成部分:
- 非結構化數據爬蟲: 從網頁上抓取非結構化的包含醫學命名實體的文本.
- 非結構化數據清洗: 對非結構化數據進行過濾和清洗, 以保留需要的部分.
- 命名實體識別: 使用模型從非結構化文本中獲取命名實體.
- 命名實體審核: 對當前命名實體進行審核, 來保證這些實體符合我們的要求.
- 命名實體寫入數據庫: 將審核后的命名實體寫入數據庫之中, 供在線部分使用.
- 說明:
- 因為本項目是以AI為核心的項目, 因為結構化與非結構化的數據爬蟲和清洗部分的內容這里不做介紹, 但同學們要知道我們的數據來源.
4.2 結構化數據流水線
- 學習目標:
- 了解需要進行命名實體審核的數據內容.
- 掌握結構化數據流水線中命名實體審核的過程.
- 掌握結構化數據流水線中命名實體寫入的過程.
- 需要進行命名實體審核的數據內容:
- 每個csv文件的名字都是一種疾病名.
- 文件位置: /data/doctor_offline/structured/noreview/
- 以躁狂癥.csv為例, 有如下內容:
- csv文件的內容是該疾病對應的癥狀, 每種癥狀占一行.
- 文件位置: /data/doctor_offline/structured/noreview/躁狂癥.csv
- 進行命名實體審核:
- 進行命名實體審核的工作我們這里使用AI模型實現, 包括訓練數據集, 模型訓練和使用的整個過程, 因此這里內容以獨立一章的形成呈現給大家, 具體參見[第五章: 命名實體審核任務].
- 刪除審核后的可能存在的空文件:
- 代碼位置: 在/data/doctor_offline/structured/reviewed/目錄下執行.
- 命名實體寫入數據庫:
- 將命名實體寫入圖數據庫的原因:
* 寫入的數據供在線部分進行查詢,根據用戶輸入癥狀來匹配對應疾病.
- 將命名實體寫入圖數據庫代碼:
- 調用:
fileinput UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 2: illegal multibyte sequence
解決:symptom = list(map(lambda x : x.strip(), fileinput.FileInput(os.path.join(path, disease_csv), openhook= fileinput.hook_encoded(‘utf-8’))))
symptom = list(map(lambda x: x.strip(), fileinput.FileInput(os.path.join(path, disease_csv))))
- 輸出效果:
* 通過可視化管理后臺查看寫入效果.
4.3 非結構化數據流水線
- 學習目標:
- 了解需要進行命名實體識別的數據內容.
- 掌握非結構化數據流水線中命名實體識別的過程.
- 掌握非結構化數據流水線中命名實體審核的過程.
- 掌握非結構化數據流水線中命名實體寫入的過程.
- 需要進行命名實體識別的數據內容:
- 每個txt文件的名字都是一種疾病名.
- 文件位置: /data/doctor_offline/unstructured/norecognite/
- 以黑色丘疹性皮膚病.txt為例, 有如下內容:
- txt中是對該疾病癥狀的文本描述.
- 文件位置: /data/doctor_offline/unstructured/norecognite/黑色丘疹性皮膚病.txt
- 進行命名實體識別:
- 進行命名實體識別的工作我們這里使用AI模型實現, 包括模型訓練和使用的整個過程, 因此內容以獨立一章的形成呈現給大家, 具體內容在[第六章: 命名實體識別任務]
- 進行命名實體審核:
- 同4.2 結構化數據流水線中的命名實體審核.
- 命名實體寫入數據庫:
- 同4.2 結構化數據流水線中的命名實體寫入數據庫.
-
本章總結:
- 學習了離線部分的數據流水線以及組成部分.
- 根據架構展開圖圖,離線部分可分為兩條數據流水線,分別用于處理結構化數據和非結構化數據. 這里稱它們為結構化數據流水線和非結構化數據流水線.
- 結構化數據流水線的組成部分:
- 結構化數據爬蟲: 從網頁上抓取結構化的有關醫學命名實體的內容.
- 結構化數據的清洗: 對抓取的內容進行過濾和清洗, 以保留需要的部分.
- 命名實體審核: 對當前命名實體進行審核, 來保證這些實體符合我們的要求.
- 命名實體寫入數據庫: 將審核后的命名實體寫入數據庫之中, 供在線部分使用.
- 非結構化數據流水線的組成部分:
- 非結構化數據爬蟲: 從網頁上抓取非結構化的包含醫學命名實體的文本.
- 非結構化數據清洗: 對非結構化數據進行過濾和清洗, 以保留需要的部分.
- 命名實體識別: 使用模型從非結構化文本中獲取命名實體.
- 命名實體審核: 對當前命名實體進行審核, 來保證這些實體符合我們的要求.
- 命名實體寫入數據庫: 將審核后的命名實體寫入數據庫之中, 供在線部分使用.
- 學習了需要進行命名實體審核的數據內容.
- 學習了結構化/非結構化數據流水線中命名實體審核的過程.
- 學習了結構化/非結構化數據流水線中命名實體寫入的過程.
- 學習了需要進行命名實體識別的數據內容.
- 非結構化數據流水線中命名實體識別的過程.
- 學習了離線部分的數據流水線以及組成部分.
5.1 任務介紹與模型選用
- 學習目標:
- 了解命名實體審核任務的相關知識.
- 了解選用的模型及其原因.
- NE審核任務:
- 一般在實體進入數據庫存儲前, 中間都會有一道必不可少的工序, 就是對識別出來的實體進行合法性的檢驗, 即命名實體(NE)審核任務. 它的檢驗過程不使用上下文信息, 更關注于字符本身的組合方式來進行判斷, 本質上,它是一項短文本二分類問題.
- 選用的模型及其原因:
- 針對短文本任務, 無須捕捉長距離的關系, 因此我們使用了傳統的RNN模型來解決, 性能和效果可以達到很好的均衡.
- 短文本任務往往適合使用字嵌入的方式, 但是如果你的訓練集不是很大,涉及的字數有限, 那么可以直接使用預訓練模型的字向量進行表示即可. 我們這里使用了bert-chinese預訓練模型來獲得中文漢字的向量表示.
5.2 訓練數據集
- 學習目標:
- 了解訓練數據集的樣式及其相關解釋.
- 掌握將數據集加載到內存中的過程.
- 訓練數據集的樣式:
- 數據集的相關解釋:
- 這些訓練集中的正樣本往往是基于人工審核的標準命名實體.
- 數據集中的第一列代表標簽, 1為正標簽, 代表后面的文字是命名實體. 0為負標簽, 代表后面的文字不是命名實體.
- 數據集中的第二列中的命名實體來源于數據庫中的癥狀實體名字, 它是結構化爬蟲抓取的數據. 而非命名實體則是它的字符串反轉.
- 正負樣本的比例是1:1.
- 將數據集加載到內存:
- 代碼位置: /data/doctor_offline/review_model/train.py
- 輸出效果:
- 小節總結:
- 學習了訓練數據集的樣式及其相關解釋.
- 學習了將數據集加載到內存中的過程.
5.3 BERT中文預訓練模型
- 學習目標:
- 了解BERT中文預訓練模型的有關知識和作用.
- 掌握使用BERT中文預訓練模型對句子編碼的過程.
- BERT中文預訓練模型:
- BERT模型整體架構基于Transformer模型架構, BERT中文預訓練模型的解碼器和編碼器具有12層, 輸出層中的線性層具有768個節點, 即輸出張量最后一維的維度是768. 它使用的多頭注意力機制結構中, 頭的數量為12, 模型總參數量為110M. 同時, 它在中文簡體和繁體上進行訓練, 因此適合中文簡體和繁體任務.
- BERT中文預訓練模型作用:
- 在實際的文本任務處理中, 有些訓練語料很難獲得, 他們的總體數量和包含的詞匯總數都非常少, 不適合用于訓練帶有Embedding層的模型, 但這些數據中卻又蘊含這一些有價值的規律可以被模型挖掘, 在這種情況下,使用預訓練模型對原始文本進行編碼是非常不錯的選擇, 因為預訓練模型來自大型語料, 能夠使得當前文本具有意義, 雖然這些意義可能并不針對某個特定領域, 但是這種缺陷可以使用微調模型來進行彌補.
- 使用BERT中文預訓練模型對句子編碼:
bert 預訓練模型地址
- 代碼位置: /data/doctor_offline/review_model/bert_chinese_encode.py
- 輸入參數:
- 調用:
- 輸出效果:
注意:torch.hub.load無法下載時,利用迅雷等通過鏈接中 的地址進行下載model.bin config.json vocab.txt并更改名稱
from transformers import BertModel, BertTokenizer
-
小節總結:
- 學習了BERT中文預訓練模型的有關知識:
- BERT模型整體架構基于Transformer模型架構, BERT中文預訓練模型的解碼器和編碼器具有12層, 輸出層中的線性層具有768個節點, 即輸出張量最后一維的維度是768. 它使用的多頭注意力機制結構中, 頭的數量為12, 模型總參數量為110M. 同時, 它在中文簡體和繁體上進行訓練, 因此適合中文簡體和繁體任務.
- 學習了BERT中文預訓練模型的作用:
- 在實際的文本任務處理中, 有些訓練語料很難獲得, 他們的總體數量和包含的詞匯總數都非常少, 不適合用于訓練帶有Embedding層的模型, 但這些數據中卻又蘊含這一些有價值的規律可以被模型挖掘, 在這種情況下, 使用預訓練模型對原始文本進行編碼是非常不錯的選擇, 因為預訓練模型來自大型語料, 能夠使得當前文本具有意義, 雖然這些意義可能并不針對某個特定領域, 但是這種缺陷可以使用微調模型來進行彌補.
- 學習了使用BERT中文預訓練模型對句子編碼的函數: get_bert_encode_for_single(text)
- 學習了BERT中文預訓練模型的有關知識:
5.4 構建RNN模型
- 學習目標:
- 學習RNN模型的內部結構及計算公式.
- 掌握RNN模型的實現過程.
- 傳統RNN的內部結構圖:
- 結構解釋圖:
- 內部結構分析:
* 我們把目光集中在中間的方塊部分, 它的輸入有兩部分, 分別是h(t-1)以及x(t), 代表上一時間步的隱層輸出, 以及此時間步的輸入, 它們進入RNN結構體后, 會"融合"到一起, 這種融合我們根據結構解釋可知, 是將二者進行拼接, 形成新的張量[x(t), h(t-1)], 之后這個新的張量將通過一個全連接層(線性層), 該層>使用tanh作為激活函數, 最終得到該時間步的輸出h(t), 它將作為下一個時間步的>輸入和x(t+1)一起進入結構體. 以此類推.
- 內部結構過程演示:
- 根據結構分析得出內部計算公式:
- 激活函數tanh的作用:
* 用于幫助調節流經網絡的值, tanh函數將值壓縮在-1和1之間.
- 構建RNN模型的代碼分析:
- torch.cat演示:
- 代碼位置: /data/doctor_offline/review_model/RNN_MODEL.py
- 實例化參數:
- 輸入參數:
- 調用:
- 輸出效果:
- 小節總結:
- 學習了RNN模型的內部結構及計算公式.
- 學習并實現了RNN模型的類: class RNN(nn.Module).
5.5 進行模型訓練
- 學習目標:
- 了解進行模型訓練的步驟.
- 掌握模型訓練中每個步驟的實現過程.
- 進行模型訓練的步驟:
- 第一步: 構建隨機選取數據函數.
- 第二步: 構建模型訓練函數.
- 第三步: 構建模型驗證函數.
- 第四步: 調用訓練和驗證函數.
- 第五步: 繪制訓練和驗證的損失和準確率對照曲線.
- 第六步: 模型保存.
- 第一步: 構建隨機選取數據函數
- 代碼位置: /data/doctor_offline/review_model/train.py
- 輸入參數:
- 調用:
- 輸出效果:
- 第二步: 構建模型訓練函數
- 代碼位置: /data/doctor_offline/review_model/train.py
- 第三步: 模型驗證函數
- 代碼位置: /data/doctor_offline/review_model/train.py
- 第四步: 調用訓練和驗證函數
- 構建時間計算函數:
- 代碼位置: /data/doctor_offline/review_model/train.py
- 輸入參數:
- 調用:
- 輸出效果:
- 調用訓練和驗證函數并打印日志
- 代碼位置: /data/doctor_offline/review_model/train.py
- 輸出效果:
- 第五步: 繪制訓練和驗證的損失和準確率對照曲線
plt.title(“your title name”, y=-0.1)設置y位置可以將title設置在圖像下方
import matplotlib.pyplot as pltplt.figure(0) plt.plot(all_train_losses, label="Train Loss") plt.plot(all_valid_losses, color="red", label="Valid Loss") plt.legend(loc='upper left')plt.savefig("./loss.png")plt.figure(1) plt.plot(all_train_acc, label="Train Acc") plt.plot(all_valid_acc, color="red", label="Valid Acc") plt.legend(loc='upper left')plt.savefig("./acc.png")- 代碼位置: /data/doctor_offline/review_model/train.py
- 訓練和驗證損失對照曲線:
- 訓練和驗證準確率對照曲線:
- 分析:
* 損失對照曲線一直下降, 說明模型能夠從數據中獲取規律,正在收斂, 準確率對照曲線中驗證準確率一直上升,最終維持在0.98左右.
- 第六步: 模型保存
- 代碼位置: /data/doctor_offline/review_model/train.py
- 輸出效果:
* 在/data/doctor_offline/review_model/路徑下生成BERT_RNN.pth文件.
- 小節總結:
- 學習了進行模型訓練的步驟:
- 第一步: 構建隨機選取數據函數.
- 第二步: 構建模型訓練函數.
- 第三步: 構建模型驗證函數.
- 第四步: 調用訓練和驗證函數.
- 第五步: 繪制訓練和驗證的損失和準確率對照曲線.
- 第六步: 模型保存.
- 學習了進行模型訓練的步驟:
5.6 模型使用
- 學習目標:
- 掌握模型預測的實現過程.
- 掌握模型批量預測的實現過程.
- 模型預測的實現過程:
tensor.topk演示:
>>> tr = torch.randn(1, 2) >>> tr tensor([[-0.1808, -1.4170]]) >>> tr.topk(1, 1) torch.return_types.topk(values=tensor([[-0.1808]]), indices=tensor([[0]]))- 代碼位置: /data/doctor_offline/review_model/predict.py
- 輸入參數:
- 調用:
- 輸出效果:
- 模型批量預測的實現過程:
- 代碼位置: /data/doctor_offline/review_model/predict.py
- 輸入參數:
- 調用:
- 輸出效果:
- 在輸出路徑下生成與輸入路徑等數量的同名csv文件, 內部的癥狀實體是被審核的可用實體.
- 小節總結:
- 學習并實現了模型預測的函數: predict(input_line).
- 學習并實現了模型批量預測的函數: batch_predict(input_path, output_path)
總結
以上是生活随笔為你收集整理的NLP在线医生(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动互联网的发展现状和发展趋势
- 下一篇: NICO EXCHANGE NICO 交