(二)依据词频,构造词汇表(单个字符级)

步骤:

1.打开文件test1.txt

2.读取文件

3.筛选test1中高频词(含标点,空格),构成词汇表

代码

import sys
from collections import Counter

import numpy as n

def open_file(filename, mode='r'):
    return open(filename, mode, encoding='utf-8', errors='ignore')


def read_file(filename):
    """读取文件数据"""
    contents, labels = [], []
    with open_file(filename) as f:
        for line in f:
            try:
                label, content = line.strip().split('\t')   # 移除每行头尾空格或换行符,然后根据tab把label和content分到list里
                if content:
                    contents.append(list(content))
                    labels.append(label)
            except:
                pass
    return contents, labels  # labels与contents对应位置上连起来就是一个doc


def build_vocab(train_dir, vocab_dir, vocab_size=5000):
    """根据训练集构建词汇表,存储"""
    data_train, _ = read_file(train_dir)

    all_data = []
    for content in data_train:
        all_data.extend(content)

    counter = Counter(all_data)  # 一个迭代对象all_data生成counter
    count_pairs = counter.most_common(vocab_size - 1)  # 按照counter的计数,降序,返回前vocab_size - 1项组成的list
    # 返回(word,频数)
    words, _ = list(zip(*count_pairs))
    # 添加一个 <PAD> 来将所有文本pad为同一长度
    words = ['<PAD>'] + list(words)
    open_file(vocab_dir, mode='w').write('\n'.join(words) + '\n')   # 以'\n'为分割符,把words列表中的元素连成一个字符串

build_vocab('cnews.test1.txt','cnews.vo1.txt',50)

部分代码及知识点

1、text1.txt文件路径

把text1.txt与test1.py文件放在一个目录中,使用文件名即可读取

2、text1.txt构造(标签Tab文本)如:

体育	马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 来到沈阳,国奥队依然没有摆脱雨水的困扰。

text1可只包括文本(不限行数),只是我的示例文本中含有标签

3、在文本预处理阶段的事情

1.去除每行行首、行尾不必要的空格和换行,并将label和content分开。
label, content = line.strip().split('\t')  # 移除每行头尾空格或换行符,然后根据tab把label和content分开

2.利用Count对象计数
counter = Counter(all_data)  # 一个迭代对象all_data生成counter

3.count_pairs是一个列数为2的list,每行(word,频数),共50行

4.利用<PAD>将字符长度统一

5.词汇表为51*1的list,其中PAD占一行

6.也可以选择所有不同的字符作为词汇表,即k=字符个数

4、调试截图

调试过程中,部分变量变化及其类型

猜你喜欢

转载自blog.csdn.net/HaiYang_Gao/article/details/83348947
今日推荐