構建詞匯表:自然語言處理中的關鍵步驟
在自然語言處理(NLP)任務中,詞匯表(Vocabulary)是文本數據預處理的核心組件之一。它將文本中的單詞或字符映射為數值索引,從而讓計算機能夠理解和處理語言數據。本文將詳細介紹如何使用 Python 構建一個基于字符的詞匯表,并通過一個具體的例子展示其過程。
1. 詞匯表的作用
在 NLP 中,文本數據通常是通過詞匯表進行編碼的。詞匯表的作用是將文本中的每個單詞或字符轉換為一個唯一的數值索引,這樣計算機就可以處理這些數據。例如,假設我們有一個詞匯表:
{'今': 0, '天': 1, '氣': 2, '真': 3, '好': 4, '<UNK>': 5, '<PAD>': 6}
那么,文本 “今天天氣真好” 可以被編碼為 [0, 1, 2, 3, 4]
。如果文本中出現詞匯表中不存在的字符,如 “明”,則可以用 <UNK>
(未知字符)來代替,即索引 5。
2. 構建詞匯表的步驟
2.1 準備數據
假設我們有一個 CSV 文件 simplifyweibo_4_moods.csv
,其中包含了一些文本數據。文件的格式可能如下:
id,text
1,今天天氣真好
2,我咁要去打球
3,明天會下雨
我們的目標是從這些文本中提取字符,統計它們的頻率,并構建一個詞匯表。
2.2 編寫代碼
以下是構建詞匯表的完整代碼:
from tqdm import tqdm
import pickle as pkl# 定義全局變量
MAX_VOCAB_SIZE = 4760 # 詞表長度限制
UNK, PAD = '<UNK>', '<PAD>' # 未知字,padding符號def build_vocab(file_path, max_size, min_freq):"""構建詞匯表函數:param file_path: 輸入文件路徑:param max_size: 詞匯表的最大大小:param min_freq: 單詞的最小出現頻率:return: 構建好的詞匯表(字典形式)"""# 定義分詞器,將輸入字符串逐字分割為字符列表tokenizer = lambda x: [y for y in x]# 初始化詞匯表字典vocab_dic = {}# 打開文件并逐行讀取with open(file_path, 'r', encoding='UTF-8') as f:i = 0 # 初始化計數器,用于跳過文件的第一行for line in tqdm(f): # 使用tqdm顯示進度條if i == 0: # 跳過文件的第一行(通常是表頭)i += 1continuelin = line[2:].strip() # 去掉每行的前兩個字符,并去掉行首行尾的多余空格if not lin: # 如果處理后的行為空,則跳過continue# 對當前行進行分字處理,并統計每個字符的出現頻率for word in tokenizer(lin):vocab_dic[word] = vocab_dic.get(word, 0) + 1# 按照字符的出現頻率從高到低排序,并過濾掉出現頻率小于min_freq的字符# 只保留前max_size個字符vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] > min_freq], key=lambda x: x[1], reverse=True)[:max_size]# 重新構建詞匯表字典,將字符映射為索引值vocab_dic = {word_count[0]: idx for idx, word_count in enumerate(vocab_list)}# 將特殊符號UNK和PAD添加到詞匯表中,并分配索引值vocab_dic.update({UNK: len(vocab_dic), PAD: len(vocab_dic) + 1})# 打印構建好的詞匯表(可選,用于調試)print(vocab_dic)# 將詞匯表保存為一個.pkl文件,方便后續使用pkl.dump(vocab_dic, open('simplifyweibo_4_moods.pkl', 'wb'))# 打印詞匯表的大小print(f"Vocab size: {len(vocab_dic)}")return vocab_dic # 返回構建好的詞匯表if __name__ == "__main__":# 調用build_vocab函數,構建詞匯表vocab = build_vocab('simplifyweibo_4_moods.csv', MAX_VOCAB_SIZE, 3)# 打印字符串'vocab',確認函數運行完成print('vocab')
2.3 代碼解析
- 分詞器:
tokenizer
是一個簡單的函數,將輸入字符串逐字分割為字符列表。 - 統計頻率:逐行讀取文件內容,統計每個字符的出現頻率。
- 過濾和排序:過濾掉出現頻率小于
min_freq
的字符,并按頻率從高到低排序,只保留前max_size
個字符。 - 構建詞匯表:將字符映射為索引值,并添加特殊符號
<UNK>
和<PAD>
。 - 保存詞匯表:將詞匯表保存為
.pkl
文件,方便后續加載和使用。
2.4 運行結果
輸入文件 simplifyweibo_4_moods.csv
的內容如下:
運行代碼后,輸出如下:
同時,詞匯表會被保存為 simplifyweibo_4_moods.pkl
文件。
3. 詞匯表的應用
構建好的詞匯表可以用于多種 NLP 任務,例如:
- 文本分類:將文本編碼為數值序列,輸入到分類模型中。
- 情感分析:分析文本的情感傾向。
- 機器翻譯:將源語言文本編碼為數值序列,翻譯為目標語言。
4. 總結
構建詞匯表是 NLP 中的一個重要步驟。通過統計字符頻率、過濾低頻字符并映射為索引值,我們可以高效地處理文本數據。本文通過一個具體的例子展示了如何使用 Python 構建詞匯表,并保存為 .pkl
文件以便后續使用。希望這篇文章對你有所幫助!