自然語言處理(二)——PTB數據集的預處理


參考書

《TensorFlow:實戰Google深度學習框架》(第2版)

首先按照詞頻順序為每個詞匯分配一個編號,然后將詞匯表保存到一個獨立的vocab文件中。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# coding=utf-8 

"""
@author: Li Tian
@contact: 694317828@qq.com
@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: 694317828@qq.com
@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()

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM