nlp基礎之-詞彙表構建的具體做法

海_纳百川發表於2024-08-09

詞彙表構建(Vocabulary Building)是文字資料預處理中的關鍵步驟,涉及從訓練語料中生成一個包含所有可識別單詞、子詞或字元的集合。具體做法如下:

1. 資料收集與清洗

  • 資料收集: 收集所有待處理的文字資料,包括訓練集、驗證集和測試集。
  • 資料清洗: 在構建詞彙表之前,清洗資料以去除噪聲和不必要的字元(如特殊符號、HTML標籤等)。這一步確保詞彙表包含的都是有用的詞彙。

2. 確定詞彙表的大小

  • 設定最大詞彙表大小: 根據任務需求和計算資源,設定一個合理的詞彙表大小限制。過大的詞彙表可能導致計算開銷過高,而過小的詞彙表則可能無法覆蓋所有有用的詞彙。
  • 選擇策略: 可以選擇固定大小(如前10,000個最頻繁的詞)或根據具體任務需求動態調整詞彙表大小。

3. 統計詞頻

  • 詞頻統計: 統計每個詞(或子詞)的出現頻率。對於所有訓練資料,計算每個詞的出現次數,以決定其是否納入詞彙表。
  • 常見工具: 使用工具或庫(如 Python 的 collections.CounterNLTK)來統計詞頻。

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)

總結

詞彙表構建的關鍵在於從訓練資料中提取並儲存最常見的詞彙,處理未登入詞,並將詞彙表對映到索引。在實際應用中,選擇合適的詞彙表大小和處理策略對於模型的效能至關重要。

相關文章