一、BPE分詞的背景和基本概念
BPE全稱為Byte Pair Encoding,是一種將任意文本編碼為有限詞彙集的壓縮算法。BPE分詞最初是由Philipp Koehn在機器翻譯中引入,後來被機器學習領域廣泛應用於分詞、詞嵌入和語音識別等領域。
BPE分詞首先將原始文本拆分為單詞,然後將單詞拆分為子單元,每次使用BPE都會將出現頻率最高的n-gram合併成一個新的單元,直到達到指定的詞彙表大小或者達到預設的合併次數。
from collections import defaultdict def get_stats(vocab): pairs = defaultdict(int) for word, freq in vocab.items(): symbols = word.split() for i in range(len(symbols)-1): pairs[symbols[i],symbols[i+1]] += freq return pairs
二、BPE分詞和N-gram分詞的比較
相較於傳統N-gram方法和基於詞典的方法,BPE分詞具有更好的可擴展性,可以用於處理未登錄詞,同時也能夠更好地處理一些復義詞的問題。
然而,由於BPE分詞將單詞拆分為子單元,可能會出現諸如「li tle」這樣的分割結果,因此需要進行特殊的拼接方式來還原原始單詞。
def merge_vocab(pair, v_in): v_out = {} bigram = " ".join(pair) for word in v_in: w_out = word.replace(bigram, "".join(pair)) v_out[w_out] = v_in[word] return v_out
三、BPE分詞在深度學習中的應用
在自然語言處理的深度學習任務中,BPE分詞通常被用作詞嵌入的生成方式。具體而言,一般採用基於subword的詞嵌入技術,利用BPE將單詞分為子單元,生成詞向量。該方法能夠克服未登錄詞、低頻詞的問題,同時也能夠更好地捕捉單詞之間的語法和語義信息。
一般地,我們可以使用HuggingFace提供的transformers庫來生成新的BPE Tokenizer,其中包括一系列參數的定義。例如,下面是一個基於BertTokenizer的生成方式示例:
from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-cased') encoded = tokenizer.encode_plus('Hello, world!', add_special_tokens=True, return_tensors='pt')
四、BPE分詞在文本生成中的應用
BPE分詞在文本生成中的應用已經相當成熟,可以用於機器翻譯、文本摘要等NLP任務。在機器翻譯中,BPE分詞超越了傳統的基於詞的方法,並取得了大量的成功。使用BPE分詞的翻譯模型可以更準確地處理長句子以及一些未登錄詞和生僻詞,而且可以很好地平衡輸入和輸出序列長度。
例如,我們可以使用transformers庫中的GPT模型來生成文本,其中tokenizer採用BPE分詞器:
from transformers import GPT2LMHeadModel, GPT2Tokenizer tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = GPT2LMHeadModel.from_pretrained("gpt2") input_ids = tokenizer.encode("Hello, my name is", return_tensors='pt') sample_output = model.generate(input_ids, do_sample=True, max_length=50) output_text = tokenizer.decode(sample_output[0], skip_special_tokens=True)
五、BPE分詞存在的問題及改進
儘管BPE分詞在大多數NLP任務中表現得很好,但它仍然存在兩個主要問題:1)BPE分詞需要大量的計算資源和時間,因為在處理大規模數據集時需要對單詞拆分為詞彙,然後合併為更大的詞彙;2)BPE分詞可能導致模型在處理某些單詞時出現錯誤,例如將「dogs」分解為「dog」和「s」。
為了解決這些問題,有研究人員提出了一些改進的方法,例如使用梯度下降算法在單個模型中聯合學習分詞、詞嵌入和實體識別任務來優化BPE分詞的性能,或使用可逆軟件來避免分割錯誤。
六、結語
BPE分詞是一種廣為應用的分詞方法,它可以在不使用額外詞典的情況下生成分詞結果,具有出色的可擴展性和處理未登錄詞的能力。在實際使用中,我們可以根據不同的應用場景來進行參數優化,生成適用於不同任務的詞嵌入器或分詞器,以達到更好的效果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/282916.html