(二)依据词频,构造词汇表(单个字符级)
步骤:
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占一行