NLP for human. A fast and easy-to-use natural language processing (NLP) toolkit, satisfying your imagination about NLP.
→ English version

基本介紹• 安裝• 入門指引• 詳細教程• 榮譽獎勵• 如何貢獻代碼• 引用• 致謝
Fancy-NLP是由騰訊商品廣告策略組團隊構建的用於建設商品畫像的文本知識挖掘工具,其支持諸如實體提取、文本分類和文本相似度匹配等多種常見NLP 任務。與當前業界常用框架相比,其能夠支持用戶進行快速的功能實現:既可以滿足高階用戶對模型進行深度定制,也可以讓普通用戶快速利用預訓練的模型快速進行功能實踐。在當前的商品廣告業務場景中,我們利用該工具快速挖掘海量商品數據的特徵,從而支持廣告商品推薦等模塊中。
項目的初衷是希望提供一套易用的NLP工具,其直接面向使用場景,滿足用戶對NLP任務的需求,使得用戶無需處理複雜的預處理等中間過程,直接針對輸入的自然語言文本來完成多種NLP任務,實現所想即所得!
Fancy 是什麼寓意?對於當前眾多的NLP任務,例如實體識別(Named Entity Recognition, NER)、文本分類以及文本相似度匹配(Sentence Pair Matching, SPM),大多數工具的設計都是偏向於模型的訓練和評估。當普通用戶希望將這些模型應用於實際業務場景中時,往往需要進行複雜的預處理和部署配置,這些過程往往和用戶所期望的流程不符。因此Fancy 的寓意為滿足你的想像,你可以在Fancy-NLP 中實現對NLP 任務各個環節的一鍵式處理,高效將模型應用於實際的需求場景中。
Fancy-NLP當前支持在Python 3環境下使用,且在Python 3.6中進行了完整的測試。當前的版本中已全面依賴Tensorflow 2.x ,如果你對模塊的兼容性有所擔憂,我們建議你使用virtualenv 來創建虛擬環境以使用本工具。
Fancy-NLP 支持使用pip來進行一鍵式安裝:
pip install fancy-nlp在入門指引中,我們將使用預訓練模型來帶你快速了解和體驗Fancy-NLP 的基本功能。
注:我們將在隨後不斷優化多種場景(不同標註數據)的實體識別模型,以供用戶直接使用,如果你有相關數據集,也歡迎在issue 中給我們積極反饋
當前版本的Fancy-NLP 可以默認加載使用了MSRA NER 子集數據訓練得到的NER模型,其能夠對中文文本中的組織機構(ORG)、地點(LOC)以及人物(PER)實體進行識別,默認加載的基礎模型是為了便於用戶直接體驗。若想直接使用自己訓練的自定義模型,你可以參照後續詳細教程中的介紹,來構建你的實體提取系統。
> >> from fancy_nlp . applications import NER
> >> ner_app = NER ()第一次運行以上代碼時,會從雲端下載預訓練的NER 模型。
> >> ner_app . analyze ( '同济大学位于上海市杨浦区,校长为陈杰' )
{ 'text' : '同济大学位于上海市杨浦区,校长为陈杰' ,
'entities' : [
{ 'name' : '同济大学' ,
'type' : 'ORG' ,
'score' : 1.0 ,
'beginOffset' : 0 ,
'endOffset' : 4 },
{ 'name' : '上海市' ,
'type' : 'LOC' ,
'score' : 1.0 ,
'beginOffset' : 6 ,
'endOffset' : 9 },
{ 'name' : '杨浦区' ,
'type' : 'LOC' ,
'score' : 1.0 ,
'beginOffset' : 9 ,
'endOffset' : 12 },
{ 'name' : '陈杰' ,
'type' : 'PER' ,
'score' : 1.0 ,
'beginOffset' : 16 ,
'endOffset' : 18 }]} > >> ner_app . restrict_analyze ( '同济大学位于上海市杨浦区,校长为陈杰' )
{ 'text' : '同济大学位于上海市杨浦区,校长为陈杰' ,
'entities' : [
{ 'name' : '同济大学' ,
'type' : 'ORG' ,
'score' : 1.0 ,
'beginOffset' : 0 ,
'endOffset' : 4 },
{ 'name' : '杨浦区' ,
'type' : 'LOC' ,
'score' : 1.0 ,
'beginOffset' : 9 ,
'endOffset' : 12 },
{ 'name' : '陈杰' ,
'type' : 'PER' ,
'score' : 1.0 ,
'beginOffset' : 16 ,
'endOffset' : 18 }]} >>> ner_app.predict('同济大学位于上海市杨浦区,校长为陈杰')
['B-ORG',
'I-ORG',
'I-ORG',
'I-ORG',
'O',
'O',
'B-LOC',
'I-LOC',
'I-LOC',
'B-LOC',
'I-LOC',
'I-LOC',
'O',
'O',
'O',
'O',
'B-PER',
'I-PER']
Fancy-NLP 中默認加載了在當前公開的中文新聞標題分類數據集訓練得到的文本分類模型,其能夠針對新聞標題文本,預測其所屬的新聞類別。
> >> from fancy_nlp . applications import TextClassification
> >> text_classification_app = TextClassification ()第一次運行以上程序時,會從雲端下載預訓練模型。
> >> text_classification_app . predict ( '苹果iOS占移动互联网流量份额逾65% 位居第一' )
'科技' > >> text_classification_app . analyze ( '苹果iOS占移动互联网流量份额逾65% 位居第一' )
( '科技' , 0.9996544 )Fancy-NLP 中默認加載了在當前公開的微眾銀行客服問句匹配數據集訓練得到的文本相似度匹配模型,其能夠針對所提供的文本對,預測其是否表達相同的意圖。
> >> from fancy_nlp . applications import SPM
> >> spm_app = SPM ()第一次運行以上程序時,會從雲端下載預訓練的文本相似度匹配模型。
> >> spm_app . predict (( '未满足微众银行审批是什么意思' , '为什么我未满足微众银行审批' ))
'1'預測結果中, 1表示相同意圖或相似文本, 0表示不同意圖或不相似文本。
> >> spm_app . analyze (( '未满足微众银行审批是什么意思' , '为什么我未满足微众银行审批' ))
( '1' , array ([ 1.6599501e-09 , 1.0000000e+00 ], dtype = float32 ))在詳細教程中,你可以了解如何使用Fancy-NLP 使用你自己的數據集,構建適用於滿足自定義場景的自定義模型,並對Fancy-NLP 的接口有著更加全面的了解。
為了完整的體驗以下教程,你需要下載我們使用的數據集和BERT 模型:
86geqk7e6rb7你可以將下載的數據移動至與examples目錄平級,最終的目錄結構如下:
.
├── datasets
│ ├── ner
│ │ └── msra
│ │ ├── test_data
│ │ └── train_data
│ ├── spm
│ │ └── webank
│ │ ├── BQ_dev.txt
│ │ ├── BQ_test.txt
│ │ └── BQ_train.txt
│ └── text_classification
│ └── toutiao
│ ├── toutiao_cat_data.txt
│ └── toutiao_label_dict.txt
├── examples
│ ├── bert_combination.py
│ ├── bert_fine_tuning.py
│ ├── bert_single.py
│ ├── ner_example.py
│ ├── spm_example.py
│ └── text_classification_example.py
└── pretrained_embeddings
└── chinese_L-12_H-768_A-12
├── bert_config.json
├── bert_model.ckpt.data-00000-of-00001
├── bert_model.ckpt.index
├── bert_model.ckpt.meta
└── vocab.txt
從而你可以直接運行示例程序。例如, python examples/ner_example.py 。
我們依然採用上文提到過的MSRA NER 子集數據為例,來介紹如何使用已有的數據集,來訓練屬於自己的實體識別模型。以下所有代碼片段的完整版,可參考examples/ner_example.py 。
在Fancy-NLP 中,實體識別應用程序支持使用標準的NER 數據集格式,每個待識別的字符和其對應的標籤採用t分隔,句子與句子之間採用空行分隔。標籤的格式可以是BIO 、 BIOES等常見的標準格式。
使用Fancy-NLP 提供的接口,我們可以直接對數據集進行加載,並處理成模型所需要的格式。
from fancy_nlp . applications import NER
ner_app = NER ( use_pretrained = False )
from fancy_nlp . utils import load_ner_data_and_labels
train_data , train_labels = load_ner_data_and_labels ( 'datasets/ner/msra/train_data' )
valid_data , valid_labels = load_ner_data_and_labels ( 'datasets/ner/msra/test_data' ) load_ner_data_and_labels實現了對NER 數據集的有效加載,你可以直接將需要加載的數據(訓練集、驗證集或測試集)文件路徑作為參數,這裡使用了測試集來作為驗證集。實際任務中,你應該具有各自獨立的驗證集和測試集,從而獲得有價值的測試評估結果。
當獲得了有效的數據後,NER 應用程序就可以開始直接進行模型的訓練。
checkpoint_dir = 'pretrained_models'
model_name = 'msra_ner_bilstm_cnn_crf'
ner_app . fit ( train_data , train_labels , valid_data , valid_labels ,
ner_model_type = 'bilstm_cnn' ,
char_embed_trainable = True ,
callback_list = [ 'modelcheckpoint' , 'earlystopping' , 'swa' ],
checkpoint_dir = checkpoint_dir ,
model_name = model_name ,
load_swa_model = True )對於NER 應用程序的fit接口,你需要傳入之前處理過的訓練集和驗證集樣本,其餘參數的含義如下:
ner_model_type : 指明需要使用的模型名稱。本例中使用了bilstm_cnn模型;char_embed_trainable :字向量層是否是可以進行微調(fine tuning)。本例中是將其置為True ,表示可以進行微調;callback_list :需要使用的回調功能名稱。本例中使用的回調功能有:modelcheckpoint :使用模型檢查點功能。在每次迭代後,保存訓練得到的模型;earlystopping :使用提前停止功能。若模型的性能在n 輪迭代(默認n=5)後沒有提升,則結束訓練;swa : SWA表示Stochastic Weight Averaging,是一種常見的模型集成策略,能夠有效提升模型的性能,更多詳情可以參考論文原文中的介紹;checkpoint_dir :保存模型文件的目錄路徑;model_name :模型文件的文件名;load_swa_model :模型訓練完之後,是否加載SWA 模型權重。這裡置為True ,表示使用SWA 模型; test_data , test_labels = load_ner_data_and_labels ( 'datasets/ner/msra/test_data' )
ner_app . score ( test_data , test_labels )這裡依然使用load_ner_data_and_labels來處理測試集數據。得到有效的數據格式後,直接使用NER 應用程序的score接口來獲取模型在測試集中的得分。
在訓練完模型後,需要將任務需要的所有模型相關文件進行保存,以便於在外部其它應用中使用Fancy-NLP 訓練過的模型。
import os
ner_app . save (
preprocessor_file = os . path . join ( checkpoint_dir , f' { model_name } _preprocessor.pkl' ),
json_file = os . path . join ( checkpoint_dir , f' { model_name } .json' )) NER應用程序的save接口可以用來將模型的結構文件(json)以及權重文件(hdf5)和預處理的相關結果(pickle)進行持久化保存:
modelcheckpoint功能,已經將權重文件進行了保存; ner_app . load (
preprocessor_file = os . path . join ( checkpoint_dir , f' { model_name } _preprocessor.pkl' ),
json_file = os . path . join ( checkpoint_dir , f' { model_name } .json' ),
weights_file = os . path . join ( checkpoint_dir , f' { model_name } _swa.hdf5' ))此時的ner_app就已經具有了對樣本進行預測的能力,你就可以完成在入門指引中提到的相關預測功能。例如, analyze 、 restrict_analyze 。
我們依然採用上文提到過的中文新聞標題分類數據集為例,來介紹如何使用已有的數據集,來訓練屬於自己的文本分類模型。以下所有代碼片段的完整版,可參考examples/text_classification_example.py 。
在Fancy-NLP 中,文本分類應用程序支持使用原始文本採用固定分隔符分隔的數據集格式,其可以有多餘的和文本分類任務無關的列,只需要保證標籤列和輸入文本列都處於統一的固定位置即可。
此外,對於分類標籤,還需要準備一份標籤和標籤ID的映射文件,其由兩列組成:第一列為標籤在數據集中的原始名稱,通常為一些編碼的ID;第二列為標籤原始名稱對應的可讀名稱。該文件的對應關係,將用於在模型預測時,直接輸出可讀的標籤名稱。
使用Fancy-NLP 提供的接口,我們可以直接對數據集進行加載,並處理成模型所需要的格式。
from fancy_nlp . applications import TextClassification
text_classification_app = TextClassification ( use_pretrained = False )
data_file = 'datasets/text_classification/toutiao/toutiao_cat_data.txt'
from fancy_nlp . utils import load_text_classification_data_and_labels
train_data , train_labels , valid_data , valid_labels , test_data , test_labels =
load_text_classification_data_and_labels ( data_file ,
label_index = 1 ,
text_index = 3 ,
delimiter = '_!_' ,
split_mode = 2 ,
split_size = 0.3 ) load_ner_data_and_labels實現了對文本分類數據集的有效加載,你可以直接將需要加載的數據(訓練集、驗證集或測試集)文件路徑作為參數,這裡使用了完整的數據來劃分訓練集、驗證集和測試集。除了數據文件,上述其餘參數的具體含義為:
label_index :分類標籤在數據文件中所處的位置(位置編號從0開始);text_index :待分類文本在數據文件中所處的位置;delimiter :數據文件各列之間的分隔符;split_mode :通過改參數來指明如何對原始數據進行劃分。其中:split_size :數據劃分比例。在split_mode=1時,其表示將從原始數據中劃分出split_size比例的數據作為驗證集;在split_mode=2時,其表示將從原始數據中劃分出split_size比例的數據作為驗證集和測試集的總和,其中驗證集和測試集的比例各佔一半。 當獲得了有效的數據後,文本分類應用程序就可以開始直接進行模型的訓練。
dict_file = 'datasets/text_classification/toutiao/toutiao_label_dict.txt'
model_name = 'toutiao_text_classification_cnn'
checkpoint_dir = 'pretrained_models'
text_classification_app . fit (
train_data , train_labels , valid_data , valid_labels ,
text_classification_model_type = 'cnn' ,
char_embed_trainable = True ,
callback_list = [ 'modelcheckpoint' , 'earlystopping' , 'swa' ],
checkpoint_dir = checkpoint_dir ,
model_name = model_name ,
label_dict_file = dict_file ,
max_len = 60 ,
load_swa_model = True )對於文本分類應用程序的fit接口,你需要傳入之前處理過的訓練集和驗證集樣本,其餘參數的含義如下:
text_classification_model_type : 指明需要使用的模型名稱。本例中使用了cnn模型;char_embed_trainable :字向量層是否是可以進行微調(fine tuning)。本例中是將其置為True ,表示可以進行微調;callback_list :需要使用的回調功能名稱。本例中使用的回調功能有:modelcheckpoint :使用模型檢查點功能。在每次迭代後,保存訓練得到的模型;earlystopping :使用提前停止功能。若模型的性能在n 輪迭代(默認n=5)後沒有提升,則結束訓練;swa : SWA表示Stochastic Weight Averaging,是一種常見的模型集成策略,能夠有效提升模型的性能,更多詳情可以參考論文原文中的介紹;checkpoint_dir :保存模型文件的目錄路徑;model_name :模型文件的文件名;label_dict_file :標籤字典文件,其由兩列組成:第一列為標籤在數據集中的原始名稱,通常為一些編碼的ID;第二列為標籤原始名稱對應的可讀名稱;max_len : 對於輸入文本保留的最大長度,超出該長度的文本將被截斷;load_swa_model :模型訓練完之後,是否加載SWA 模型權重。這裡置為True ,表示使用SWA 模型; text_classification_app . score ( test_data , test_labels )這裡可以直接使用文本分類應用程序的score接口來獲取模型在測試集中的得分。
在訓練完模型後,需要將任務需要的所有模型相關文件進行保存,以便於在外部其它應用中使用Fancy-NLP 訓練過的模型。
import os
text_classification_app . save (
preprocessor_file = os . path . join ( checkpoint_dir , f' { model_name } _preprocessor.pkl' ),
json_file = os . path . join ( checkpoint_dir , f' { model_name } .json' ))文本分類應用程序的save接口可以用來將模型的結構文件(json)以及權重文件(hdf5)和預處理的相關結果(pickle)進行持久化保存:
modelcheckpoint功能,已經將權重文件進行了保存。 text_classification_app . load (
preprocessor_file = os . path . join ( checkpoint_dir , f' { model_name } _preprocessor.pkl' ),
json_file = os . path . join ( checkpoint_dir , f' { model_name } .json' ),
weights_file = os . path . join ( checkpoint_dir , f' { model_name } _swa.hdf5' ))此時的text_classification_app就已經具有了對樣本進行預測的能力,你就可以完成在入門指引中提到的相關預測功能。例如, predict 、 analyze 。
我們依然採用上文提到過的微眾銀行客服問句匹配數據集為例,介紹如何使用已有的數據集來訓練屬於自己的文本相似度匹配模型。以下所有代碼片段的完整版,可參考examples/spm_example.py 。
在Fancy-NLP 中,文本相似度匹配任務應用程序支持使用原始文本採用t分隔的數據集格式,其由三列組成:第一列和第二列分別為一組文本對;第三列為樣本的標籤, 1表示文本語義相似, 0表示不相似。
使用Fancy-NLP 提供的接口,我們可以直接對數據集進行加載,並處理成模型所需要的格式。
from fancy_nlp . applications import SPM
spm_app = applications . SPM ( use_pretrained = False )
train_file = 'datasets/spm/webank/BQ_train.txt'
valid_file = 'datasets/spm/webank/BQ_dev.txt'
from fancy_nlp . utils import load_spm_data_and_labels
train_data , train_labels = load_spm_data_and_labels ( train_file )
valid_data , valid_labels = load_spm_data_and_labels ( valid_file ) load_spm_data_and_labels實現了對文本相似度匹配數據集的有效加載,你可以直接將需要加載的數據(訓練集、驗證集或測試集)文件路徑作為參數。
當獲得了有效的數據後,文本相似度匹配應用程序就可以開始直接進行模型的訓練。
model_name = 'spm_siamese_cnn'
checkpoint_dir = 'pretrained_models'
spm_app . fit ( train_data , train_labels , valid_data , valid_labels ,
spm_model_type = 'siamese_cnn' ,
word_embed_trainable = True ,
callback_list = [ 'modelcheckpoint' , 'earlystopping' , 'swa' ],
checkpoint_dir = checkpoint_dir ,
model_name = model_name ,
max_len = 60 ,
load_swa_model = True )對於文本相似度匹配應用程序的fit接口,你需要傳入之前處理過的訓練集和驗證集樣本,其餘參數的含義如下:
spm_model_type : 指明需要使用的模型名稱。本例中使用了siamese_cnn模型;word_embed_trainable :詞向量層是否是可以進行微調(fine tuning)。本例中是將其置為True ,表示可以進行微調;callback_list :需要使用的回調功能名稱。本例中使用的回調功能有:modelcheckpoint :使用模型檢查點功能。在每次迭代後,保存訓練得到的模型;earlystopping :使用提前停止功能。若模型的性能在n 輪迭代(默認n=5)後沒有提升,則結束訓練;swa : SWA表示Stochastic Weight Averaging,是一種常見的模型集成策略,能夠有效提升模型的性能,更多詳情可以參考論文原文中的介紹;checkpoint_dir :保存模型文件的目錄路徑;model_name :模型文件的文件名;max_len : 對於輸入文本保留的最大長度,超出該長度的文本將被截斷;load_swa_model :模型訓練完之後,是否加載SWA 模型權重。這裡置為True ,表示使用SWA 模型; test_file = 'datasets/spm/webank/BQ_test.txt'
test_data , test_labels = load_spm_data_and_labels ( test_file )
spm_app . score ( test_data , test_labels )這裡可以直接使用文本相似度匹配應用程序的score接口來獲取模型在測試集中的得分。
在訓練完模型後,需要將任務需要的所有模型相關文件進行保存,以便於在外部其它應用中使用Fancy-NLP 訓練過的模型。
import os
spm_app . save (
preprocessor_file = os . path . join ( checkpoint_dir , f' { model_name } _preprocessor.pkl' ),
json_file = os . path . join ( checkpoint_dir , f' { model_name } .json' ))文本相似度匹配應用程序的save接口可以用來將模型的結構文件(json)以及權重文件(hdf5)和預處理的相關結果(pickle)進行持久化保存:
modelcheckpoint功能,已經將權重文件進行了保存。 spm_app . load (
preprocessor_file = os . path . join ( checkpoint_dir , f' { model_name } _preprocessor.pkl' ),
json_file = os . path . join ( checkpoint_dir , f' { model_name } .json' ),
weights_file = os . path . join ( checkpoint_dir , f' { model_name } _swa.hdf5' ))此時的spm_app就已經具有了對樣本進行預測的能力,你可以繼續完成在入門指引中提到的相關預測功能。例如, predict 、 analyze 。
Facny-NLP提供了各種使用BERT模型的方法:
要想在Fancy-NLP 中使用BERT,你只需要下載好預訓練的BERT 模型(如穀歌官方提供的中文BERT 模型、百度提供的ERNIE 模型(提取碼:iq74)、哈爾濱工業大學提供的BERT-wwm 模型)。之後就可以在相關應用程序的fit方法中傳入BERT 模型的詞表文件、配置文件、模型文件的路徑。下面以實體識別應用程序為例給出三種使用方法的示範。完整的示例代碼,請參考examples/bert_fine_tuning.py 、 examples/bert_single.py和examples/bert_combination.py 。
注意BERT 模型只能與字符向量共同使用,不能與詞向量共同使用。
import tensorflow as tf
from fancy_nlp . applications import NER
ner_app = NER ( use_pretrained = False )
from fancy_nlp . utils import load_ner_data_and_labels
train_data , train_labels = load_ner_data_and_labels ( 'datasets/ner/msra/train_data' )
valid_data , valid_labels = load_ner_data_and_labels ( 'datasets/ner/msra/test_data' )
ner_app . fit ( train_data , train_labels , valid_data , valid_labels ,
ner_model_type = 'bert' ,
use_char = False ,
use_word = False ,
use_bert = True ,
bert_vocab_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/vocab.txt' ,
bert_config_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/bert_config.json' ,
bert_checkpoint_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/bert_model.ckpt' ,
bert_trainable = True ,
optimizer = tf . keras . optimizers . Adam ( 1e-5 ),
callback_list = [ 'modelcheckpoint' , 'earlystopping' , 'swa' ],
checkpoint_dir = 'pretrained_models' ,
model_name = 'msra_ner_bert_crf' ,
load_swa_model = True )在以上代碼片段中,需要注意的是:
ner_model_type :設置模型的類型為bert ;use_char :設置不使用字符級向量;use_word :設置不使用單詞級向量作為輔助輸入;use_bert :當微調bert模型時,設置只使用BERT 輸入,;bert_vocab_file 、 bert_config_file 、 bert_checkpoint_file :BERT 模型相關文件的路徑bert_trainable :設置BERT 模型參數為可訓練狀態,即微調;optimizer :設置BERT 模型的優化器,在微調BERT 模型中需要將優化器的學習率調整得小一些。 from fancy_nlp . applications import NER
ner_app = NER ( use_pretrained = False )
from fancy_nlp . utils import load_ner_data_and_labels
train_data , train_labels = load_ner_data_and_labels ( 'datasets/ner/msra/train_data' )
valid_data , valid_labels = load_ner_data_and_labels ( 'datasets/ner/msra/test_data' )
ner_app . fit ( train_data , train_labels , valid_data , valid_labels ,
ner_model_type = 'bilstm_cnn' ,
use_char = False ,
use_word = False ,
use_bert = True ,
bert_vocab_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/vocab.txt' ,
bert_config_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/bert_config.json' ,
bert_checkpoint_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/bert_model.ckpt' ,
bert_trainable = False ,
optimizer = 'adam' ,
callback_list = [ 'modelcheckpoint' , 'earlystopping' , 'swa' ],
checkpoint_dir = 'pretrained_models' ,
model_name = 'msra_ner_bilstm_cnn_bert_crf' ,
load_swa_model = True )在以上代碼片段中,需要注意的是:
ner_model_type :設置模型的類型為bilstm_cnn ,這裡需使用非BERT 模型;use_char :設置不使用字符級向量;use_word :設置不使用單詞級向量作為輔助輸入;use_bert :設置只使用BERT 向量作為特徵輸入;bert_vocab_file 、 bert_config_file 、 bert_checkpoint_file :BERT 模型相關文件的路徑bert_trainable :設置BERT 模型參數為不可訓練狀態,這裡設置為True也可以;optimizer :設置優化器,若bert模型可訓練,建議將優化器的學習率調整得小一些。 import tensorflow as tf
from fancy_nlp . applications import NER
ner_app = NER ( use_pretrained = False )
from fancy_nlp . utils import load_ner_data_and_labels
train_data , train_labels = load_ner_data_and_labels ( 'datasets/ner/msra/train_data' )
valid_data , valid_labels = load_ner_data_and_labels ( 'datasets/ner/msra/test_data' )
ner_app . fit ( train_data , train_labels , valid_data , valid_labels ,
ner_model_type = 'bilstm_cnn' ,
use_char = True ,
use_word = False ,
use_bert = True ,
bert_vocab_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/vocab.txt' ,
bert_config_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/bert_config.json' ,
bert_checkpoint_file = 'pretrained_embeddings/chinese_L-12_H-768_A-12/bert_model.ckpt' ,
bert_trainable = True ,
optimizer = tf . keras . optimizers . Adam ( 1e-5 ),
callback_list = [ 'modelcheckpoint' , 'earlystopping' , 'swa' ],
checkpoint_dir = 'pretrained_models' ,
model_name = 'msra_ner_bilstm_cnn_char_bert_crf' ,
load_swa_model = True )在以上代碼片段中,需要注意的是:
ner_model_type :設置模型的類型為bilstm_cnn ,這裡需使用非BERT 模型;use_char :設置使用字符級向量;use_word :設置不使用單詞級向量作為輔助輸入;use_bert :設置使用BERT 向量,這將結合字向量以及BERT 向量作為特徵輸入;bert_vocab_file 、 bert_config_file 、 bert_checkpoint_file :BERT 模型相關文件的路徑bert_trainable :設置BERT 模型參數為可訓練狀態,這裡設置為False也可以;optimizer :設置優化器,若bert模型可訓練,建議將優化器的學習率調整得小一些。 請有意改進Fancy NLP代碼的開發者遵循一下規範來提交Pull requests:
如果你在相關研究過程中使用了Fancy NLP ,你可以將以下內容加入到引用列表中
@misc{tencent2019fancynlp,
title={Fancy-NLP},
author={Li Yang and Shiyao Xu and Shijia E},
howpublished={ url {https://github.com/boat-group/fancy-nlp}},
year={2019}
}▴ 返回頂部
本項目的靈感來自於眾多的優秀的開源項目,尤其是Keras,正如Keras的slogan: Deep learning for human所說,我們希望Fancy NLP 是NLP for human ,尤其在中文領域。