日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

WordPiece是如何基于词表对文本进行切分的

發(fā)布時(shí)間:2023/12/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WordPiece是如何基于词表对文本进行切分的 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文從PaddleNLP源碼入手,分析WordPiece是如何基于詞表對(duì)輸入的文本進(jìn)行子詞切分的。

為了更好地閱讀本文,你需要知道子詞切分tokenize相關(guān)的知識(shí),可以參考我之前的文章:

  • tokenizer簡(jiǎn)介
  • tokenizers:BPE算法

WordPiece采用了一種貪心的最長(zhǎng)匹配搜索算法來(lái)將原始文本切分成子詞。

為簡(jiǎn)單起見,假設(shè)詞表中只有三個(gè)子詞:['un', 'aff', 'able'],我們要切分的單詞是“unaffable”。具體做法是,初始化兩個(gè)位置變量(start和end,分別表示最左側(cè)字符的位置和最右側(cè)字符的位置),然后將end逐個(gè)減1,每次移動(dòng)后(包括初始時(shí))都將從start到end的字符拼接起來(lái),并查看它們是否在詞表中。

另外,如果start不為0(即對(duì)應(yīng)的字符不是開頭的字符),那么需要在子詞前面加上##。

本部分代碼如下:

output_tokens = [] for token in whitespace_tokenize(text):# whitespace_tokenize是先將text按照空格切分,這對(duì)于輸入一個(gè)句子的情況下有用# 接下來(lái),把token想象成單詞“unaffable”chars = list(token)if len(chars) > self.max_input_chars_per_word:# 這里做了一個(gè)限制:如果一個(gè)單詞的長(zhǎng)度超過(guò)了設(shè)定值(默認(rèn)是100),那么便被標(biāo)記為預(yù)先定義的字符,一般是`UNK`output_tokens.append(self.unk_token)continueis_bad = Falsestart = 0sub_tokens = []# 初始化了startwhile start < len(chars):end = len(chars)cur_substr = Nonewhile start < end:# 從最后一個(gè)字符逐個(gè)向左遍歷,保證匹配到的子詞是最長(zhǎng)的substr = "".join(chars[start:end])if start > 0: # 添加特殊的連接符substr = "##" + substrif substr in self.vocab: # 姑且把vocab理解為一個(gè)列表或鍵為詞表中單詞的字典cur_substr = substrbreakend -= 1if cur_substr is None:# 這里是一個(gè)否決條件,如果end走了一遍仍沒有找到合適的子詞,那么說(shuō)明當(dāng)前從start到end組成的子詞不在詞表中is_bad = Truebreaksub_tokens.append(cur_substr)start = endif is_bad:# 只有有任意一部分不在詞表中,那么當(dāng)前token就被標(biāo)記為`UNK`output_tokens.append(self.unk_token)else:output_tokens.extend(sub_tokens)

總結(jié)

以上是生活随笔為你收集整理的WordPiece是如何基于词表对文本进行切分的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。