自然語言處理(二)——PTB數據集的預處理
阿新 • • 發佈:2019-02-20
ESS resize urn rain style nim base64 utf ems
參考書
《TensorFlow:實戰Google深度學習框架》(第2版)
首先按照詞頻順序為每個詞匯分配一個編號,然後將詞匯表保存到一個獨立的vocab文件中。
#!/usr/bin/env python # -*- coding: UTF-8 -*- # coding=utf-8 """ @author: Li Tian @contact: [email protected] @software: pycharm @file: word_deal1.py @time: 2019/2/20 10:42 @desc: 首先按照詞頻順序為每個詞匯分配一個編號,然後將詞匯表保存到一個獨立的vocab文件中。""" import codecs import collections from operator import itemgetter # 訓練集數據文件 RAW_DATA = "./simple-examples/data/ptb.train.txt" # 輸出的詞匯表文件 VOCAB_OUTPUT = "ptb.vocab" # 統計單詞出現的頻率 counter = collections.Counter() with codecs.open(RAW_DATA, "r", "utf-8") as f: for line in f: for word in line.strip().split(): counter[word]+= 1 # 按照詞頻順序對單詞進行排序 sorted_word_to_cnt = sorted(counter.items(), key=itemgetter(1), reverse=True) sorted_words = [x[0] for x in sorted_word_to_cnt] # 稍後我們需要在文本換行處加入句子結束符“<eos>”,這裏預先將其加入詞匯表。 sorted_words = ["<eos>"] + sorted_words # 在後面處理機器翻譯數據時,出了"<eos>",還需要將"<unk>"和句子起始符"<sos>"加入# 詞匯表,並從詞匯表中刪除低頻詞匯。在PTB數據中,因為輸入數據已經將低頻詞匯替換成了 # "<unk>",因此不需要這一步驟。 # sorted_words = ["<unk>", "<sos>", "<eos>"] + sorted_words # if len(sorted_words) > 10000: # sorted_words = sorted_words[:10000] with codecs.open(VOCAB_OUTPUT, ‘w‘, ‘utf-8‘) as file_output: for word in sorted_words: file_output.write(word + "\n")
運行結果:
在確定了詞匯表之後,再將訓練文件、測試文件等都根據詞匯文件轉化為單詞編號。每個單詞的編號就是它在詞匯文件中的行號。
#!/usr/bin/env python # -*- coding: UTF-8 -*- # coding=utf-8 """ @author: Li Tian @contact: [email protected] @software: pycharm @file: word_deal2.py @time: 2019/2/20 11:10 @desc: 在確定了詞匯表之後,再將訓練文件、測試文件等都根據詞匯文件轉化為單詞編號。每個單詞的編號就是它在詞匯文件中的行號。 """ import codecs import sys # 原始的訓練集數據文件 RAW_DATA = "./simple-examples/data/ptb.train.txt" # 上面生成的詞匯表文件 VOCAB = "ptb.vocab" # 將單詞替換成為單詞編號後的輸出文件 OUTPUT_DATA = "ptb.train" # 讀取詞匯表,並建立詞匯到單詞編號的映射。 with codecs.open(VOCAB, "r", "utf-8") as f_vocab: vocab = [w.strip() for w in f_vocab.readlines()] word_to_id = {k: v for (k, v) in zip(vocab, range(len(vocab)))} # 如果出現了被刪除的低頻詞,則替換為"<unk>"。 def get_id(word): return word_to_id[word] if word in word_to_id else word_to_id["<unk"] fin = codecs.open(RAW_DATA, "r", "utf-8") fout = codecs.open(OUTPUT_DATA, ‘w‘, ‘utf-8‘) for line in fin: # 讀取單詞並添加<eos>結束符 words = line.strip().split() + ["<eos>"] # 將每個單詞替換為詞匯表中的編號 out_line = ‘ ‘.join([str(get_id(w)) for w in words]) + ‘\n‘ fout.write(out_line) fin.close() fout.close()
運行結果:
自然語言處理(二)——PTB數據集的預處理