Tensorflow使用LSTM实现中文文本分类(二)

前言

内容接上一篇:Tensorflow使用LSTM实现中文文本分类(一)
上一篇中对训练集和测试集完成了中文分词,还要需要两个操作:

  1. 将 词语 转化为 id
    按照 id 查找词语的 embeding
  2. 统计 词频
    词频过低,贡献过少的词语,就直接忽略掉。

代码演示

# -*- 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
============================
由此可见,各个类别在样本数量上,分布非常均匀
'''
上一篇:Gym - 101982F 扫描线+线段树


下一篇:js收藏