前言
内容接上一篇:Tensorflow使用LSTM实现中文文本分类(一)
上一篇中对训练集和测试集完成了中文分词,还要需要两个操作:
- 将 词语 转化为 id
按照 id 查找词语的 embeding - 统计 词频
词频过低,贡献过少的词语,就直接忽略掉。
代码演示
# -*- coding:utf-8 -*-
'''
中文分词
词语 转化为 id embeding
matrix 1维度:词表大小 2维度:embeding_size
词语A-> id(5)
label -> id
'''
import sys
import os
import jieba
# 输入文件
train_file = './news_data/cnews.train.txt'
val_file = './news_data/cnews.val.txt'
test_file = './news_data/cnews.test.txt'
# 分词结果
seg_train_file = './news_data/cnews.train.seg.txt'
seg_val_file = './news_data/cnews.val.seg.txt'
seg_test_file = './news_data/cnews.test.seg.txt'
# 词语 和 label到id 的 映射
vocab_file = './news_data/cnews.vocab.txt'
category_file = './news_data/cnews.category.txt'
def generate_vocab_file(input_seg_file, output_vocab_file):
'''
:param input_seg_file: 已经分词的文件
:param output_vocab_file: 输出的词表
:return:
'''
with open(input_seg_file, 'r') as f:
lines = f.readlines()
word_dict = {} # 统计 词频 信息,因为 我们只需要 关注的 是词频
for line in lines:
label, content = line.strip('\n').split('\t')
for word in content.split(' '):
word_dict.setdefault(word, 0) # 如果 没有这个 词语,就把给词语的默认值设为 0
word_dict[word] += 1
# dict.item() 将字典转化为列表
# 详情参考:http://www.runoob.com/python/att-dictionary-items.html
sorted_word_dict = sorted(word_dict.items(), key=lambda d:d[1], reverse=True)
# 现在sorted_word_dict的格式为: [(word, frequency).....(word, frequency)]
with open(output_vocab_file, 'w') as f:
f.write('<UNK>\t1000000\n') # 因为不是所有词汇都有的,对于一些没有的词汇,就用 unk 来代替
for item in sorted_word_dict:
f.write('%s\t%d\n'%(item[0], item[1]))
#generate_vocab_file(seg_train_file, vocab_file) # 从训练集中 统计 词表
def generate_category_dict(input_file, category_file):
with open(input_file, 'r') as f:
lines = f.readlines()
category_dict = {}
for line in lines:
label, content = line.strip('\n').split('\t')
category_dict.setdefault(label, 0)
category_dict[label] += 1
category_number = len(category_dict)
with open(category_file, 'w') as f:
for category in category_dict:
line = '%s\n' % category # 现在才知道,原来遍历字典,原来默认查出的是key
print('%s\t%d' % (category, category_dict[category]))
f.write(line)
generate_category_dict(train_file, category_file)
'''
输出结果:
===========================
家居 5000
教育 5000
娱乐 5000
时政 5000
科技 5000
时尚 5000
体育 5000
游戏 5000
财经 5000
房产 5000
============================
由此可见,各个类别在样本数量上,分布非常均匀
'''