BPE演算法理解

2021-09-26 16:26:14 字數 1577 閱讀 2109

原理(英文為例):

1.把每個單詞都拆成單個字母,在單詞結尾加上結束符,並標記上這個詞出現的頻率

2.(以2-gram為例)把連續相鄰的2個字母,進行組合,比如a b c-->ab bc  ,同樣標記上這個詞出現的頻率

3.統計不同兩個字母組合的最大頻率,並選出最大字母組合。

4.用選出的最大字母組合替換掉第一步中拆開的 兩個字母 比如用ab 去替換掉 每個單詞**現的a b

5.替換結束後。重新從第二步開始進行迴圈 。得到最後的新詞典

code:

import re

def process_raw_words(words, endtag='-'):

'''把英文單詞分成每個字母,然後每個單詞最後加上結束符,這裡結束符-'''

vocabs = {}

for word, count in words.items():

# 加上空格

word = re.sub(r'([a-za-z])', r' \1', word)

word += ' ' + endtag

vocabs[word] = count

return vocabs

def get_symbol_pairs(vocabs):

''' 組合連續 相鄰的兩個字母,並統計出現的頻率

args:

vocabs: 單詞dict,(word, count)單詞的出現頻率。單詞已經被分割成字母

returns:

pairs: dict,

'''#pairs = collections.defaultdict(int)

pairs = dict()

for word, freq in vocabs.items():

symbols = word.split()

for i in range(len(symbols) - 1):

p = (symbols[i], symbols[i + 1])

pairs[p] = pairs.get(p, 0) + freq # 累加相同字母組合的頻率

return pairs

def merge_symbols(symbol_pair, vocabs):

'''把vocabs中的所有單詞中的'a b'字串用'ab'替換

args:

symbol_pair: (a, b) 兩個元素

vocabs: dict,(word:count)。其中word使用空格分割

returns:

vocabs_new: 替換'a b'為'ab'後的新詞表

'''vocabs_new = {}

raw = ' '.join(symbol_pair)

merged = ''.join(symbol_pair)

# 把非字母和數字做轉義

bigram = re.escape(raw)

p = re.compile(r'(?輸出結果:

A 演算法理解

廣度優先 bfs 和深度優先 dfs 搜尋 深度優先搜尋,用俗話說就是不見棺材不回頭。演算法會朝乙個方向進發,直到遇到邊界或者障礙物,才回溯。一般在實現的時候,我們採用遞迴的方式來進行,也可以採用模擬壓棧的方式來實現。如下圖,s代表起點,e代表終點。我們如果按照右 下 左 上這樣的擴充套件順序的話,...

BPE演算法之我見

bpe演算法本質是基於合併的,而不是基於切分的,理解這一點很重要。在bpe整個迭代的過程中,是基於 詞表 的,但是最後要生成的是 子詞表 拿來用的也是 子詞表 拿 裡的例子來說,最開始詞表長這樣 l o w 5 l o w e r 2 w i d e s t 6 n e w e s t 3 如果你不...

dijkstra 演算法理解

求有向圖中乙個源點到其他頂點的最短距離 自己的理解 剛開始的時候相當於有三個集合 v 頂點集合 s 已求得的最短距離頂點集合,假設求a到其他頂點的最短距離 s 剩餘頂點集合 d 儲存的是最短距離值 求一維陣列中的最小值的下標,這個陣列不包含已經求得的頂點 找出最小值下標後,放入到s中,然後求剩餘頂點...