Pytorch——Tokenizers相關使用


   在NLP項目中,我們常常會需要對文本內容進行編碼,所以會采tokenizer這個工具,他可以根據詞典,把我們輸入的文字轉化為編碼信息,例如我們本文信息是“我愛你”將轉化為[2,10,3],其中”我“在字典里對應數字2,”愛“在字典里對應數字10,經過轉化之后的文本,就可以作為模型的輸入了。因此我們可以知道如果字典不同,那意味着同一句話編碼出來的數字也就是不同的,所以對於一個訓練好的NLP模型,基本都是有着自己tokenizer工具的,比如BertTokenizer(BERT模型的),ErnieGramTokenizer(百度飛槳的ernie模型),他們這個tokenizer的使用方式大同小異,因此我們就個根據BertTokenizer這里類進行講解和使用。

加載並使用tokenizer

1、載入預訓練模型的詞典

  我們可以使用以下代碼加載BERT預訓練模型的詞典,其實我們只需要config.json和vocab.txt這兩個文件就可以初始化一個BertTokenizer,因此我們需要傳入這兩個文件所在的目錄地址即可。

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(r'./bert-base-uncased')

  這里的'./bert-base-uncased'是包含有config.json和vocab.txt這兩個文件的目錄地址,而這兩個文件可以從官方網站下載。當然如果你在第2行代碼中直接傳入’bert-base-uncased‘,他會自動下載相關模型的文件到默認的地方。(我這里沒有閱讀源碼所以也不清楚另外的tokenizer.json用來干嘛)

   完成上面的步驟之后你就得到了一個BERT的tokenizer了,下面我們來嘗試使用這個tokenizer對我們的語句進行編碼。

2、使用tokenizer

  剛才說到我們使用tokenizer的目的是將我們的語句編碼成數字,我們可以直接傳入一個句話或者一個列表的話,那么最后出來的就是編碼后的語句了。直接看例子。

   如果傳入單句話輸出的結果是一個字典,其中'input_ids'就是這句話編碼后的結果,可能有部分同學會有疑問,為什么”我愛你“3個字會編碼出來5個數字額,不應該是3個么?其實着是跟你的模型有關的,BERT模型任務中需要在每一句話句首加入[CLS]符號,句尾加[SEP]符號,因此編碼會增加2個,大家可以查看vocab.txt這個文件中的第102行和103行(因為編碼是從0開始所以對應的是文件的102行和103行)是不是就是這兩個字符。至於后面的鍵值對什么意思,大家可以參看BERT論文來了解。

  下面我們查看如果是使用列表來傳入句子該怎么操作。

   可以看到返回的依然是鍵值對,其中'input_ids'也是個列表,每個元素對應的就是相應的句子得到的編碼。

  其實作為NLP模型的輸入,對於一些長句子我們還需要對齊進行padding使得每個batch的句子長度應該是一致的,這個過程tokenizer也可以幫我們完成,下面我們看看tokenizer的其他參數,可以參見文檔了解更多,常使用的參數如下:

  • padding:給序列補全到一定長度,True or ‘longest’: 是補全到batch中的最長長度,max_length’:補到給定max-length或沒給定時,補到模型能接受的最長長度。
  • truncation:截斷操作,true or ‘longest_first’:給定max_length時,按照max_length截斷,沒給定max_lehgth時,達到模型接受的最長長度后截斷,適用於所有序列(單或雙)。‘only_first’:這個只針對第一個序列。’only_second’:只針對第二個序列。
  • max_length:控制padding和truncation的長度。
  • return_tensors:返回數據的類型,可選’tf’,‘pt’, ‘np’ ,分別表示tf.constant, torch.Tensor或np.ndarray類型。
  • return_token_type_ids :默認返回token_type_id(屬於哪個句子)。
  • return_attention_mask :默認返回attention_mask(是否參與attention計算)。

  我們看一看例子。

  可以看到現在每個句子的編碼長度都變成了12,響應的其他鍵值對也跟着在變化。

 3、一些其他的tokenizer方法

   tokenizer還包含有其他的一些方法,比如,

  • tokenizer.convert_tokens_to_ids(tokens):可以把tokens映射為數字id。
  • tokenizer.decode(ids):可以把數字id映射回字符串。
  • tokenizer.tokenize(sequence):把一句話進行分詞變成一個一個字符。
tokens = tokenizer.tokenize('我愛中華大地')
print(tokens)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(ids)
sentence = tokenizer.decode(ids)
print(sentence)

  輸出結果:

   這里的[UNK]字符說明這個字(華)在字典中是不存在的因此采用這個字符來占位。

訓練自己的tokenizer

  如果我自己存在一個語料,我們能不能自己訓練一個模型,並且對應有一個tokenizer呢?其實是可以的,具體步驟可以參看參考網頁4,其實最主要的就是采用了tokenizers模塊把文本進行編碼。

 

參考網頁:

pytorch:Transformers入門(二) - 簡書 (jianshu.com)

3-3 Transformers Tokenizer API 的使用 - 知乎 (zhihu.com)

tokenizers · PyPI

手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型 - 雲+社區 - 騰訊雲 (tencent.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM