https://gitee.com/paddlepaddle/PaddleNLP/tree/develop/examples/lexical_analysis/#1-%E7%AE%80%E4%BB%8B
詞法分析
1. 簡介
詞法分析任務的輸入是一個字符串(我們后面使用『句子』來指代它),而輸出是句子中的詞邊界和詞性、實體類別。序列標注是詞法分析的經典建模方式,我們使用基于 GRU 的網絡結構學習特征,將學習到的特征接入 CRF 解碼層完成序列標注。模型結構如下所示:GRU
-CRF
-MODEL輸入采用 one
-hot 方式表示,每個字以一個 id 表示
one
-hot 序列通過字表,轉換為實向量表示的字向量序列;
字向量序列作為雙向 GRU 的輸入,學習輸入序列的特征表示,得到新的特性表示序列,我們堆疊了兩層雙向 GRU 以增加學習能力;
CRF 以 GRU 學習到的特征為輸入,以標記序列為監督信號,實現序列標注。
快速開始
數據準備
我們提供了少數樣本用以示例輸入數據格式。執行以下命令,下載并解壓示例數據集:python download
.py
--data_dir
./
訓練使用的數據可以由用戶根據實際的應用場景,自己組織數據。除了第一行是 text_a\tlabel 固定的開頭,后面的每行數據都是由兩列組成,以制表符分隔,第一列是 utf
-8 編碼的中文文本,以 \
002 分割,第二列是對應每個字的標注,以 \
002 分隔。我們采用 IOB2 標注體系,即以 X
-B 作為類型為 X 的詞的開始,以 X
-I 作為類型為 X 的詞的持續,以 O 表示不關注的字(實際上,在詞性、專名聯合標注中,不存在 O )。示例如下:除\
002了\
002他\
002續\
002任\
002十\
002二\
002屆\
002政\
002協\
002委\
002員\
002,\
002馬\
002化\
002騰\
002,\
002雷\
002軍\
002,\
002李\
002彥\
002宏\
002也\
002被\
002推\
002選\
002為\
002新\
002一\
002屆\
002全\
002國\
002人\
002大\
002代\
002表\
002或\
002全\
002國\
002政\
002協\
002委\
002員 p
-B\
002p
-I\
002r
-B\
002v
-B\
002v
-I\
002m
-B\
002m
-I\
002m
-I\
002ORG
-B\
002ORG
-I\
002n
-B\
002n
-I\
002w
-B\
002PER
-B\
002PER
-I\
002PER
-I\
002w
-B\
002PER
-B\
002PER
-I\
002w
-B\
002PER
-B\
002PER
-I\
002PER
-I\
002d
-B\
002p
-B\
002v
-B\
002v
-I\
002v
-B\
002a
-B\
002m
-B\
002m
-I\
002ORG
-B\
002ORG
-I\
002ORG
-I\
002ORG
-I\
002n
-B\
002n
-I\
002c
-B\
002n
-B\
002n
-I\
002ORG
-B\
002ORG
-I\
002n
-B\
002n
-I
其中詞性和專名類別標簽集合如下表,包含詞性標簽
24 個(小寫字母),專名類別標簽
4 個(大寫字母)。這里需要說明的是,人名、地名、機構名和時間四個類別,存在(PER
/ LOC
/ ORG
/ TIME 和 nr
/ ns
/ nt
/ t)兩套標簽,被標注為第二套標簽的詞,是模型判斷為低置信度的人名、地名、機構名和時間詞。開發者可以基于這兩套標簽,在四個類別的準確、召回之間做出自己的權衡。標簽 含義 標簽 含義 標簽 含義 標簽 含義
n 普通名詞 f 方位名詞 s 處所名詞 t 時間
nr 人名 ns 地名 nt 機構名 nw 作品名
nz 其他專名 v 普通動詞 vd 動副詞 vn 名動詞
a 形容詞 ad 副形詞 an 名形詞 d 副詞
m 數量詞 q 量詞 r 代詞 p 介詞
c 連詞 u 助詞 xc 其他虛詞 w 標點符號
PER 人名 LOC 地名 ORG 機構名 TIME 時間
模型訓練
單卡訓練
啟動方式如下:python train
.py \
--data_dir
./lexical_analysis_dataset_tiny \
--model_save_dir
./save_dir \
--epochs
10 \
--batch_size
32 \
--device gpu \#
--init_checkpoint
./save_dir
/final
其中參數釋義如下:data_dir
: 數據集所在文件夾路徑
.
model_save_dir
: 訓練期間模型保存路徑。
epochs
: 模型訓練迭代輪數。
batch_size
: 表示每次迭代每張卡上的樣本數目。
device
: 訓練使用的設備
, 'gpu'表示使用GPU
, 'xpu'表示使用百度昆侖卡
, 'cpu'表示使用CPU。
init_checkpoint
: 模型加載路徑,通過設置init_checkpoint可以啟動增量訓練。
多卡訓練
啟動方式如下:python
-m paddle
.distributed
.launch
--gpus
"0,1" train
.py \
--data_dir
./lexical_analysis_dataset_tiny \
--model_save_dir
./save_dir \
--epochs
10 \
--batch_size
32 \
--device gpu \#
--init_checkpoint
./save_dir
/final
模型評估
通過加載訓練保存的模型,可以對測試集數據進行驗證,啟動方式如下:python eval
.py
--data_dir
./lexical_analysis_dataset_tiny \
--init_checkpoint
./save_dir
/model_100
.pdparams \
--batch_size
32 \
--device gpu
其中
./save_dir
/model_100
.pdparams是訓練過程中保存的參數文件,請更換為實際得到的訓練保存路徑。模型導出
使用動態圖訓練結束之后,還可以將動態圖參數導出成靜態圖參數,具體代碼見export_model
.py。靜態圖參數保存在output_path指定路徑中。運行方式:python export_model
.py
--data_dir
=./lexical_analysis_dataset_tiny
--params_path
=./save_dir
/model_100
.pdparams
--output_path
=./infer_model
/static_graph_params
其中
./save_dir
/model_100
.pdparams是訓練過程中保存的參數文件,請更換為實際得到的訓練保存路徑。params_path是指動態圖訓練保存的參數路徑
output_path是指靜態圖參數導出路徑。
導出模型之后,可以用于部署,deploy
/python
/predict
.py文件提供了python部署預測示例。運行方式:python deploy
/python
/predict
.py
--model_file
=infer_model
/static_graph_params
.pdmodel
--params_file
=infer_model
/static_graph_params
.pdiparams
模型預測
對無標簽數據可以啟動模型預測:python predict
.py
--data_dir
./lexical_analysis_dataset_tiny \
--init_checkpoint
./save_dir
/model_100
.pdparams \
--batch_size
32 \
--device gpu
得到類似以下輸出:
(大學
, n
)(學籍
, n
)(證明
, n
)(怎么
, r
)(開
, v
)
(電車
, n
)(的
, u
)(英文
, nz
)
(什么
, r
)(是
, v
)(司法
, n
)(鑒定人
, vn
)
預訓練模型
如果您希望使用已經預訓練好了的LAC模型完成詞法分析任務,請參考:Lexical Analysis of ChinesePaddleHub分詞模型
如果您希望使用已經預訓練好了的LAC模型完成詞法分析任務,請參考:
https://github.com/baidu/lac
工具介紹
LAC全稱Lexical Analysis of Chinese,是百度自然語言處理部研發的一款聯合的詞法分析工具,實現中文分詞、詞性標注、專名識別等功能。該工具具有以下特點與優勢:效果好:通過深度學習模型聯合學習分詞、詞性標注、專名識別任務,詞語重要性,整體效果F1值超過
0.91,詞性標注F1值超過
0.94,專名識別F1值超過
0.85,效果業內領先。
效率高:精簡模型參數,結合Paddle預測庫的性能優化,CPU單線程性能達
800QPS,效率業內領先。
可定制:實現簡單可控的干預機制,精準匹配用戶詞典對模型進行干預。詞典支持長片段形式,使得干預更為精準。
調用便捷:支持一鍵安裝,同時提供了Python、Java和C
++調用接口與調用示例,實現快速調用和集成。
支持移動端
: 定制超輕量級模型,體積僅為
2M,主流千元手機單線程性能達
200QPS,滿足大多數移動端應用的需求,同等體積量級效果業內領先。
安裝與使用
在此我們主要介紹Python安裝與使用,其他語言使用:C
++
JAVA
Android
安裝說明
代碼兼容Python2
/3全自動安裝
: pip install lac半自動下載:先下載http
://pypi
.python
.org
/pypi
/lac
/,解壓后運行 python setup
.py install安裝完成后可在命令行輸入lac或lac
--segonly
,lac
--rank啟動服務,進行快速體驗。國內網絡可使用百度源安裝,安裝速率更快:pip install lac
-i https
://mirror
.baidu
.com
/pypi
/simple功能與使用
分詞
代碼示例:
from LAC import LAC# 裝載分詞模型
lac
= LAC(mode
='seg')# 單個樣本輸入,輸入為Unicode編碼的字符串
text
= u
"LAC是個優秀的分詞工具"
seg_result
= lac
.run(text
)# 批量樣本輸入
, 輸入為多個句子組成的list,平均速率會更快
texts
= [u
"LAC是個優秀的分詞工具", u
"百度是一家高科技公司"]
seg_result
= lac
.run(texts
)
輸出:
【單樣本】:seg_result
= [LAC
, 是
, 個
, 優秀
, 的
, 分詞
, 工具
]
【批量樣本】:seg_result
= [[LAC
, 是
, 個
, 優秀
, 的
, 分詞
, 工具
], [百度
, 是
, 一家
, 高科技
, 公司
]]
詞性標注與實體識別
代碼示例:
from LAC import LAC# 裝載LAC模型
lac
= LAC(mode
='lac')# 單個樣本輸入,輸入為Unicode編碼的字符串
text
= u
"LAC是個優秀的分詞工具"
lac_result
= lac
.run(text
)# 批量樣本輸入
, 輸入為多個句子組成的list,平均速率更快
texts
= [u
"LAC是個優秀的分詞工具", u
"百度是一家高科技公司"]
lac_result
= lac
.run(texts
)
輸出:
每個句子的輸出其切詞結果word_list以及對每個單詞的標注tags_list,其格式為(word_list
, tags_list
)【單樣本】: lac_result
= ([百度
, 是
, 一家
, 高科技
, 公司
], [ORG
, v
, m
, n
, n
])
【批量樣本】:lac_result
= [([百度
, 是
, 一家
, 高科技
, 公司
], [ORG
, v
, m
, n
, n
]),([LAC
, 是
, 個
, 優秀
, 的
, 分詞
, 工具
], [nz
, v
, q
, a
, u
, n
, n
])]
詞性和專名類別標簽集合如下表,其中我們將最常用的
4個專名類別標記為大寫的形式:標簽 含義 標簽 含義 標簽 含義 標簽 含義
n 普通名詞 f 方位名詞 s 處所名詞 nw 作品名
nz 其他專名 v 普通動詞 vd 動副詞 vn 名動詞
a 形容詞 ad 副形詞 an 名形詞 d 副詞
m 數量詞 q 量詞 r 代詞 p 介詞
c 連詞 u 助詞 xc 其他虛詞 w 標點符號
PER 人名 LOC 地名 ORG 機構名 TIME 時間
詞語重要性
代碼示例:
from LAC import LAC# 裝載詞語重要性模型
lac
= LAC(mode
='rank')# 單個樣本輸入,輸入為Unicode編碼的字符串
text
= u
"LAC是個優秀的分詞工具"
rank_result
= lac
.run(text
)# 批量樣本輸入
, 輸入為多個句子組成的list,平均速率會更快
texts
= [u
"LAC是個優秀的分詞工具", u
"百度是一家高科技公司"]
rank_result
= lac
.run(texts
)
輸出:
【單樣本】:rank_result
= [['LAC', '是', '個', '優秀', '的', '分詞', '工具'], [nz
, v
, q
, a
, u
, n
, n
],[3, 0, 0, 2, 0, 3, 1]]
【批量樣本】:rank_result
= [(['LAC', '是', '個', '優秀', '的', '分詞', '工具'], [nz
, v
, q
, a
, u
, n
, n
], [3, 0, 0, 2, 0, 3, 1]), (['百度', '是', '一家', '高科技', '公司'], [ORG
, v
, m
, n
, n
], [3, 0, 2, 3, 1])]
詞語重要性各類別標簽集合如下表,我們使用
4-Level梯度進行分類:標簽 含義 常見于詞性
0 query中表述的冗余詞 p
, w
, xc
...
1 query中限定較弱的詞 r
, c
, u
...
2 query中強限定的詞 n
, s
, v
...
3 query中的核心詞 nz
, nw
, LOC
...
定制化功能
在模型輸出的基礎上,LAC還支持用戶配置定制化的切分結果和專名類型輸出。當模型預測匹配到詞典的中的item時,會用定制化的結果替代原有結果。為了實現更加精確的匹配,我們支持以由多個單詞組成的長片段作為一個item。我們通過裝載詞典文件的形式實現該功能,詞典文件每行表示一個定制化的item,由一個單詞或多個連續的單詞組成,每個單詞后使用
'/'表示標簽,如果沒有
'/'標簽則會使用模型默認的標簽。每個item單詞數越多,干預效果會越精準。詞典文件示例這里僅作為示例,展現各種需求情況下的結果。后續還將開放以通配符配置詞典的模式,敬請期待。春天
/SEASON
花
/n 開
/v
秋天的風
落 陽
代碼示例
from LAC import LAC
lac
= LAC()# 裝載干預詞典
, sep參數表示詞典文件采用的分隔符,為None時默認使用空格或制表符
'\t'
lac
.load_customization('custom.txt', sep
=None
)# 干預后結果
custom_result
= lac
.run(u
"春天的花開秋天的風以及冬天的落陽")
以輸入“春天的花開秋天的風以及冬天的落陽”為例,原本輸出結果為:
春天
/TIME 的
/u 花開
/v 秋天
/TIME 的
/u 風
/n 以及
/c 冬天
/TIME 的
/u 落陽
/n
添加示例中的詞典文件后的結果為:
春天
/SEASON 的
/u 花
/n 開
/v 秋天的風
/n 以及
/c 冬天
/TIME 的
/u 落
/n 陽
/n
增量訓練
我們也提供了增量訓練的接口,用戶可以使用自己的數據,進行增量訓練,首先需要將數據轉換為模型輸入的格式,并且所有數據文件均為
"UTF-8"編碼:
1. 分詞訓練
數據樣例與大多數開源分詞數據集格式一致,使用空格作為單詞切分標記,如下所示:LAC 是 個 優秀 的 分詞 工具 。
百度 是 一家 高科技 公司 。
春天 的 花開 秋天 的 風 以及 冬天 的 落陽 。
代碼示例
from LAC import LAC# 選擇使用分詞模型
lac
= LAC(mode
= 'seg')# 訓練和測試數據集,格式一致
train_file
= "./data/seg_train.tsv"
test_file
= "./data/seg_test.tsv"
lac
.train(model_save_dir
='./my_seg_model/',train_data
=train_file
, test_data
=test_file
)# 使用自己訓練好的模型
my_lac
= LAC(model_path
='my_seg_model')
2. 詞法分析訓練
樣例數據在分詞數據的基礎上,每個單詞以“
/type”的形式標記其詞性或實體類別。值得注意的是,詞法分析的訓練目前僅支持標簽體系與我們一致的數據。后續也會開放支持新的標簽體系,敬請期待。LAC
/nz 是
/v 個
/q 優秀
/a 的
/u 分詞
/n 工具
/n 。
/w
百度
/ORG 是
/v 一家
/m 高科技
/n 公司
/n 。
/w
春天
/TIME 的
/u 花開
/v 秋天
/TIME 的
/u 風
/n 以及
/c 冬天
/TIME 的
/u 落陽
/n 。
/w
代碼示例
from LAC import LAC# 選擇使用默認的詞法分析模型
lac
= LAC()# 訓練和測試數據集,格式一致
train_file
= "./data/lac_train.tsv"
test_file
= "./data/lac_test.tsv"
lac
.train(model_save_dir
='./my_lac_model/',train_data
=train_file
, test_data
=test_file
)# 使用自己訓練好的模型
my_lac
= LAC(model_path
='my_lac_model')
文件結構
.
├── python # Python調用的腳本
├── c
++ # C
++調用的代碼
├── java # Java調用的代碼
├── Android # Android調用的示例
├── README
.md # 本文件
└── CMakeList
.txt # 編譯C
++和Java調用的腳本
在論文中引用LAC
如果您的學術工作成果中使用了LAC,請您增加下述引用。我們非常欣慰LAC能夠對您的學術工作帶來幫助。@article
{jiao2018LAC
,title
={Chinese Lexical Analysis with Deep Bi
-GRU
-CRF Network
},author
={Jiao
, Zhenyu
and Sun
, Shuqi
and Sun
, Ke
},journal
={arXiv preprint arXiv
:1807.01882},year
={2018},url
={https
://arxiv
.org
/abs
/1807.01882}
}
PaddleHub分詞模型
https://www.paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis
便捷地獲取PaddlePaddle生態下的預訓練模型,完成模型的管理和一鍵預測。配合使用Fine
-tune API,可以基于大規模預訓練模型快速完成遷移學習,讓預訓練模型能更好地服務于用戶特定場景的應用
PaddleHub 首頁文本
- 詞法分析lac
lac
類別文本
- 詞法分析
網絡BiGRU
+CRF
數據集百度自建數據集
模型概述
Lexical Analysis of Chinese,簡稱 LAC,是一個聯合的詞法分析模型,能整體性地完成中文分詞、詞性標注、專名識別任務。在百度自建數據集上評測,LAC效果:Precision
=88.0%,Recall
=88.7%,F1
-Score
=88.4%。該PaddleHub Module支持預測。
選擇模型版本進行安裝
$ hub install lac
==2.2.0LAC模型框架圖更多詳情請參考LAC論文命令行預測示例
$ hub run lac
--input_text
"今天是個好日子"
$ hub run lac
--input_file test
.txt
--user_dict user
.dict
test
.txt 存放待分詞文本, 如:今天是個好日子
今天天氣晴朗
user
.dict為用戶自定義詞典,可以不指定,當指定自定義詞典時,可以干預默認分詞結果。詞典文件每行表示一個定制化的item,由一個單詞或多個連續的單詞組成,每個單詞后使用
'/'表示標簽,如果沒有
'/'標簽則會使用模型默認的標簽。每個item單詞數越多,干預效果會越精準。春天
/SEASON
花
/n 開
/v
秋天的風
落 陽
Note該PaddleHub Module使用詞典干預功能時,依賴于第三方庫pyahocorasick,請自行安裝
請不要直接復制示例文本使用,復制后的格式可能存在問題
LAC API 說明
__init__(user_dict
=None
)
構造LAC對象參數
user_dict(str
): 自定義詞典路徑。如果需要使用自定義詞典,則可通過該參數設置,否則不用傳入該參數。
cut(text
, use_gpu
=False
, batch_size
=1, return_tag
=True
)
lac預測接口,預測輸入句子的分詞結果參數
text(str
or list
): 待預測數據,單句預測數據(str類型)或者批量預測(list,每個元素為str
use_gpu(bool): 是否使用GPU預測,如果使用GPU預測,則在預測之前,請設置CUDA_VISIBLE_DEVICES環境變量,否則不用設置
batch_size(int): 批處理大小
return_tag(bool): 預測結果是否需要返回分詞標簽結果
lexical_analysis(texts
=[], data
={}, use_gpu
=False
, batch_size
=1, return_tag
=True
)
該接口將會在未來版本被廢棄,如有需要,請使用cut接口預測lac預測接口,預測輸入句子的分詞結果參數
texts(list
): 待預測數據,如果使用texts參數,則不用傳入data參數,二選一即可
data(dict
): 預測數據,key必須為text,value是帶預測數據。如果使用data參數,則不用傳入texts參數,二選一即可。建議使用texts參數,data參數后續會廢棄。
use_gpu(bool): 是否使用GPU預測
batch_size(int): 批處理大小
return_tag(bool): 預測結果是否需要返回分詞標簽結果
返回
results(list
): 分詞結果
context(trainable
=False
)
獲取lac的預訓練program以及program的輸入輸出變量參數
trainable(bool): trainable
=True表示program中的參數在Fine
-tune時需要微調,否則保持不變
返回
inputs(dict
): program的輸入變量
outputs(dict
): program的輸出變量
main_program(Program
): 帶有預訓練參數的program
set_user_dict(dict_path
)
加載用戶自定義詞典參數
dict_path(str
): 自定義詞典路徑
del_user_dict()
刪除自定義詞典
get_tags()
獲取lac的標簽返回
tag_name_dict(dict
): lac的標簽
get_vocab_path()
獲取預訓練時使用的詞匯表返回
vocab_path(str
): 詞匯表路徑
代碼示例import paddlehub as hublac
= hub
.Module(name
="lac")
test_text
= ["今天是個好日子", "天氣預報說今天要下雨", "下一班地鐵馬上就要到了"]results
= lac
.cut(text
=test_text
, use_gpu
=False
, batch_size
=1, return_tag
=True
)for result in results
:print(result
['word'])print(result
['tag'])
LAC 服務部署
PaddleHub Serving可以部署一個在線詞法分析服務,可以將此接口用于詞法分析、在線分詞等在線web應用。第一步:啟動PaddleHub Serving
運行啟動命令:$ hub serving start
-c serving_config
.json
serving_config
.json的內容如下:
{"modules_info": {"lac": {"init_args": {"version": "2.2.0""user_dict": "./test_dict.txt"}}},"port": 8866,"use_singleprocess": false,"workers": 2
}
其中user_dict含義為自定義詞典路徑,如果不使用lac自定義詞典功能,則可以不填入。這樣就完成了一個詞法分析服務化API的部署,默認端口號為
8866。NOTE
: 如使用GPU預測,則需要在啟動服務之前,請設置CUDA_VISIBLE_DEVICES環境變量,否則不用設置。第二步:發送預測請求
配置好服務端,以下數行代碼即可實現發送預測請求,獲取預測結果import request
import json# 待預測數據
text
= ["今天是個好日子", "天氣預報說今天要下雨"]# 設置運行配置
# 對應本地預測lac
.cut(text
=text
, batch_size
=1)
data
= {"text": text
, "batch_size": 1}# 指定預測方法為lac并發送post請求,content
-type類型應指定json方式
# HOST_IP為服務器IP
url
= "http://HOST_IP:8866/predict/lac"
headers
= {"Content-Type": "application/json"}
r
= requests
.post(url
=url
, headers
=headers
, data
=json
.dumps(data
))# 打印預測結果
print(json
.dumps(r
.json(), indent
=4, ensure_ascii
=False
))
關于PaddleHub Serving更多信息參考服務部署
總結
以上是生活随笔為你收集整理的1词法分析PaddleNLP / examples / lexical_analysis的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。