在學習大語言模型的技術細節時,
弄清楚「輸入文本 Input Text」與「符元化文本 Tokenized Text」之間的差異會很方便[1]。
舉個具體的例子:
輸入文本:Hello, 你好. Obsidian is great!
符元化文本:['Hello', ',', '你好', '.', 'Obsidian', 'is', 'great', '!']
可以看到文本被拆成一塊一塊的,
接著每一塊送進去編碼器,
成為「嵌入向量 Embedding Vector」,
那麼深度學習就可以發揮其作用了!
而怎麼去將一個輸入文本轉為符元化文本呢?
其實可以用「正則表達式 Regular Expression」就能做到簡單的符元化效果。
import re
text = "Hello, 你好. Obsidian is great!"
result = re.split(r'([,.:;?_!"()\']|--|\s)', text)
result = [item.strip() for item in result if item.strip()]
print(result)
第一行的`import re`,
就是呼叫Python中操作正則表達式的模組 re [2]。
第三行的指令`result = re.split(r'([,.:;?_!"()\']|--|\s)', text)`,
是根據指定的標點符號(逗號、句點、冒號、分號、問號、驚嘆號、引號、圓括號)、
兩個短橫線或任何空白字符來分割字串,
並且將這些分隔符也包含在結果中。
這樣可以保留文本中的標點符號和空白字符,方便後續處理。
第四行的指令`result = [item.strip() for item in result if item.strip()]` ,
則是去除每個元素兩端的空白字符,並且只保留非空的元素,
最後得到的效果就是['Hello', ',', '你好', '.', 'Obsidian', 'is', 'great', '!'] 。
原則上,不同的文本,
會需要不同的「符元化方案 Tokenization Scheme」,
來將輸入文本轉為符元化文本,
以更加符合目前有的資料與任務。
Reference
[1] Section 2.2 Tokenizing Text, https://www.manning.com/books/build-a-large-language-model-from-scratch
[2] https://docs.python.org/3/library/re.html