<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          當(dāng)Bert遇到未登錄詞?也許你應(yīng)該這樣做!

          共 6067字,需瀏覽 13分鐘

           ·

          2022-09-29 14:04


          作者簡介




          作者:楊夕

          推薦系統(tǒng) 百面百搭地址:

          https://github.com/km1994/RES-Interview-Notes

          NLP 百面百搭地址:

          https://github.com/km1994/NLP-Interview-Notes

          個人筆記:

          https://github.com/km1994/nlp_paper_study


          關(guān)注公眾號 【關(guān)于NLP那些你不知道的事】 加入 【NLP && 推薦學(xué)習(xí)群】一起學(xué)習(xí)?。?!

          NLP && 推薦學(xué)習(xí)群【人數(shù)滿了,加微信 blqkm601】



          一、動機

          • 中文預(yù)訓(xùn)練BERT 對于 英文單詞覆蓋不全問題。由于  中文預(yù)訓(xùn)練BERT 主要針對中文,所以詞表中英文單詞比較少,但是一般英文單詞如果簡單的直接使用tokenize函數(shù),往往在一些序列預(yù)測問題上存在一些對齊問題,或者很多不存在的單詞或符號沒辦法處理而直接使用 unk 替換了,某些英文單詞或符號失去了單詞的預(yù)訓(xùn)練效果;
          • 專業(yè)領(lǐng)域(如醫(yī)療、金融)用詞或中文偏僻詞問題。NLP經(jīng)常會用到預(yù)訓(xùn)練的語言模型,小到word2vector,大到bert。現(xiàn)在bert之類的基本都用char級別來訓(xùn)練,然而由于 Bert 等預(yù)訓(xùn)練模型都是采用開放域的語料進行預(yù)訓(xùn)練,所以對詞匯覆蓋的更多是日常用詞,專業(yè)用詞則覆蓋不了,這時候該怎么處理?
              ...
          print(tokenizer.tokenize('骨骺'))
          >>>
          ['骨', '[UNK]']
          • 英文預(yù)訓(xùn)練BERT(bert-base-uncased 和 bert-base-cased)詞語被自動拆成詞根詞綴問題。英文預(yù)訓(xùn)練BERT 以詞為單位。社會生活中總是會有新詞產(chǎn)生,而且在專業(yè)領(lǐng)域(如醫(yī)療、金融)有一些不常用的詞語是 英文預(yù)訓(xùn)練BERT 沒有涵蓋到的,可能詞語會被自動拆成詞根詞綴;
              ...
          print(tokenizer.tokenize('COVID'))
          >>>
          ['co', '##vi', '##d']

          二、處理方法

          2.1 直接在 BERT 詞表 vocab.txt 中替換 [unused]

          1. 找到pytorch版本的 bert-base-cased 的文件夾中的vocab.txt文件;
          2. 最前面的100行都是[unused]([PAD]除外),直接用需要添加的詞替換進去;

          注:這里我們 加入 骺 和 COVID 兩個新詞

          1. 查詢 運行 之前實例,效果如下:
              ...
          print(tokenizer.tokenize('骨骺'))
          >>>
          ['骨', '骺']
              ...
          print(tokenizer.tokenize('COVID'))
          >>>
          ['covid']

          2.2 通過重構(gòu)詞匯矩陣來增加新詞

          1. 如果 覺得 修改 vocab.txt文件 會干擾到 其他項目,那么通過重構(gòu)BERT初始權(quán)重矩陣的方式將他們加入詞表;
              new_tokens = ['COVID', '骨骺']
          num_added_toks = tokenizer.add_tokens(new_tokens)
          print(tokenizer.tokenize('骨骺'))
          print(tokenizer.tokenize('COVID'))
          >>>
          ['骨骺']
          ['covid']

          注:num_added_toks返回一個數(shù),表示加入的新詞數(shù)量,在這里是2

          1. resize_token_embeddings輸入的參數(shù)是tokenizer的新長度
              model.resize_token_embeddings(len(tokenizer))
          1. 添加后的詞匯,通過model.resize_token_embeddings方法,隨機初始化了一個權(quán)重。
              tokenizer.save_pretrained("Pretrained_LMs/bert-base-cased")

          2.3 添加特殊占位符號 add_special_tokens

          1. 動機

          前面兩個是往 詞典中 添加未登錄詞,那么如何往分詞器tokenizer中添加新的特殊占位符呢?

          1. 方法介紹

          add_special_tokens :往分詞器tokenizer中添加新的特殊占位符

              tokenizer.add_special_tokens({'additional_special_tokens':["<e>"]})

          注:往additional_special_tokens這一類tokens中添加特殊占位符

          1. 測試
              ...
          text = " I love <e> ! "
          # 對于一個句子,首尾分別加[CLS]和[SEP]。
          text = "[CLS] " + text + " [SEP]"
          # 然后進行分詞
          print("普通 分詞效果:")
          tokenized_text1 = tokenizer.tokenize(text)
          print(tokenized_text1)
          indexed_tokens1 = tokenizer.convert_tokens_to_ids(tokenized_text1)
          # 分詞結(jié)束后獲取BERT模型需要的tensor
          segments_ids1 = [1] * len(tokenized_text1)
          tokens_tensor1 = torch.tensor([indexed_tokens1]) # 將list轉(zhuǎn)為tensor
          segments_tensors1 = torch.tensor([segments_ids1])
          # 獲取所有詞向量的embedding
          word_vectors1 = bertmodel(tokens_tensor1, segments_tensors1)[0]
          # 獲取句子的embedding
          sentenc_vector1 = bertmodel(tokens_tensor1, segments_tensors1)[1]
          tokenizer.add_special_tokens({'additional_special_tokens':["<e>"]})
          print("添加特殊占位符 后 的分詞效果:")
          print(tokenizer.additional_special_tokens) # 查看此類特殊token有哪些
          print(tokenizer.additional_special_tokens_ids) # 查看其id
          tokenized_text1 = tokenizer.tokenize(text)
          print(tokenized_text1)
          >>>
          普通 分詞效果:
          ['[CLS]', 'i', 'love', '<', 'e', '>', '!', '[SEP]']

          添加特殊占位符 后 的分詞效果:
          ['<e>']
          [21128]
          ['[CLS]', 'i', 'love', '<e>', '!', '[SEP]']

          三、方法對比

          • 方法一:
            • 優(yōu)點:如果存在大量領(lǐng)域內(nèi)專業(yè)詞匯,而且已經(jīng)整理成詞表,可以利用該方法批量添加;
            • 缺點:因為 方法1 存在 未登錄詞數(shù)量限制(eg:cased模型只有99個空位,uncased模型有999個空位),所以當(dāng) 未登錄詞 太多時,將不適用;
          • 方法二:
            • 優(yōu)點:不存在 方法1 的 未登錄詞數(shù)量限制 問題;
          • 方法三:
            • 優(yōu)點:對于一些 占位符(eg:),方法一和方法二可能都無法生效,因為 <, e, >和均存在于 vocab.txt,但前三者的優(yōu)先級高于,而 add_special_tokens會起效,卻會使得詞匯表大小增大,從而需另外調(diào)整模型size。但是,如果同時在詞匯表vocab.txt中替換[unused],同時 add_special_tokens,則新增詞會起效,同時詞匯表大小不變。

          參考

          1. NLP | How to add a domain-specific vocabulary (new tokens) to a subword tokenizer already trained like BERT WordPiece | by Pierre Guillou | Medium
          2. 如何向BERT詞匯表中添加token,新增特殊占位符
          3. 在BERT模型中添加自己的詞匯(pytorch版)

          所有文章

          五谷雜糧

          NLP百面百搭

          NLP論文學(xué)習(xí)篇


          推薦系統(tǒng) 百面百搭

          torch 學(xué)習(xí)篇

          Rasa 對話系統(tǒng)


          知識圖譜入門


          轉(zhuǎn)載記錄



          瀏覽 312
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美口爆视频 | 丁香五月婷婷色综合 | 操学生妹在线播放 | 国产字幕在线观看 | 夜夜爽夜夜高潮夜夜爽 |