詞彙表構建(Vocabulary Building)是文字資料預處理中的關鍵步驟,涉及從訓練語料中生成一個包含所有可識別單詞、子詞或字元的集合。具體做法如下:
1. 資料收集與清洗
- 資料收集: 收集所有待處理的文字資料,包括訓練集、驗證集和測試集。
- 資料清洗: 在構建詞彙表之前,清洗資料以去除噪聲和不必要的字元(如特殊符號、HTML標籤等)。這一步確保詞彙表包含的都是有用的詞彙。
2. 確定詞彙表的大小
- 設定最大詞彙表大小: 根據任務需求和計算資源,設定一個合理的詞彙表大小限制。過大的詞彙表可能導致計算開銷過高,而過小的詞彙表則可能無法覆蓋所有有用的詞彙。
- 選擇策略: 可以選擇固定大小(如前10,000個最頻繁的詞)或根據具體任務需求動態調整詞彙表大小。
3. 統計詞頻
- 詞頻統計: 統計每個詞(或子詞)的出現頻率。對於所有訓練資料,計算每個詞的出現次數,以決定其是否納入詞彙表。
- 常見工具: 使用工具或庫(如 Python 的
collections.Counter
或NLTK
)來統計詞頻。
4. 選擇詞彙表
- 頻率排序: 按照詞頻從高到低對詞彙進行排序。
- 選擇詞彙: 根據設定的最大詞彙表大小,選擇前 N 個最頻繁的詞(或子詞)作為詞彙表的內容。對於頻率較低的詞,通常用特殊的
<UNK>
標記(未登入詞標記)代替。
5. 構建詞彙表
- 詞到索引的對映: 為詞彙表中的每個詞分配一個唯一的整數索引。通常,特殊標記(如
<PAD>
、<UNK>
、<SOS>
、<EOS>
)會被分配給特定的索引。 - 索引到詞的對映: 建立一個反向對映,用於將索引轉換回詞。
6. 處理未登入詞(OOV)
- 未登入詞標記: 對於訓練資料中未出現的詞或詞彙表外的詞,使用
<UNK>
標記進行替代。這確保了模型在遇到未知詞時不會出錯。 - 預處理階段: 在將文字轉換為模型輸入時,將所有未登入詞對映到
<UNK>
。
7. 儲存和載入詞彙表
- 儲存詞彙表: 將詞彙表(詞到索引的對映)儲存到檔案中,以便在模型訓練和推理階段使用。通常儲存為 JSON、CSV 或二進位制格式。
- 載入詞彙表: 在模型訓練和推理時,從檔案中載入詞彙表,並使用它將文字資料轉換為模型輸入格式。
示例程式碼
以下是 Python 中使用 collections.Counter
構建詞彙表的示例程式碼:
from collections import Counter
import json
# 示例文字資料
texts = ["I love machine learning.", "Deep learning is fascinating.", "I love programming."]
# 資料清洗和分詞(這裡簡化處理)
def tokenize(text):
return text.lower().split()
# 統計詞頻
word_freq = Counter()
for text in texts:
words = tokenize(text)
word_freq.update(words)
# 選擇前 N 個最頻繁的詞作為詞彙表
vocab_size = 10
vocab = [word for word, freq in word_freq.most_common(vocab_size)]
# 新增特殊標記
vocab = ["<PAD>", "<UNK>"] + vocab
# 詞到索引對映
word_to_index = {word: idx for idx, word in enumerate(vocab)}
# 儲存詞彙表
with open('vocab.json', 'w') as f:
json.dump(word_to_index, f)
# 載入詞彙表
with open('vocab.json', 'r') as f:
word_to_index = json.load(f)
print(word_to_index)
總結
詞彙表構建的關鍵在於從訓練資料中提取並儲存最常見的詞彙,處理未登入詞,並將詞彙表對映到索引。在實際應用中,選擇合適的詞彙表大小和處理策略對於模型的效能至關重要。