有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Jupyter Notebook中进行
本篇文章配套的代码资源已经上传
构建语料表,基于词频来进行统计。
比如我现在有一组数据有一万篇文章,这些文章中所有的词出现的次数进行统计,将所有不重复的词统计出来
counter = Counter()
with open('./data/train.txt',encoding='utf-8') as f:
for line in f:
line = line.rstrip()
label, words = line.split('\t')
words = words.split(' ')
counter.update(words)
words = ['' ] + [w for w, freq in counter.most_common() if freq >= 10]
print('Vocab Size:', len(words))
Path('./vocab').mkdir(exist_ok=True)
with open('./vocab/word.txt', 'w',encoding='utf-8') as f:
for w in words:
f.write(w+'\n')
打印结果:
Vocab Size: 20598
这个结果就是表示,最后一共有20598在我们的语料表中,这相当于我们这个任务的词典
打开保存的语料表文件看看:
word2idx = {}
with open('./vocab/word.txt',encoding='utf-8') as f:
for i, line in enumerate(f):
line = line.rstrip()
word2idx[line] = i
得到新的word2id映射表
文本数据,分解为一个一个单词,再根据语料表做成索引,再将索引做成向量,这个过程称为embedding即词嵌入:
在data文件夹中,有3个文件,分别是glove.6B.50d.txt、train.txt、test.txt,其中glove.6B.50d.txt就是上图展示的界面,一共有40万行即40万个词,每个单词都被转换成了向量,这里是一个50维的向量。
所以词嵌入应该就是有一个大表,每个词都有一个对应的向量。
embedding = np.zeros((len(word2idx)+1, 50))
with open('./data/glove.6B.50d.txt',encoding='utf-8') as f:
count = 0
for i, line in enumerate(f):
if i % 100000 == 0:
print('- At line {}'.format(i))
line = line.rstrip()
sp = line.split(' ')
word, vec = sp[0], sp[1:]
if word in word2idx:
count += 1
embedding[word2idx[word]] = np.asarray(vec, dtype='float32')
打印结果:
At line 0
At line 100000
At line 200000
At line 300000
所以这里的embedding 是一个ndarray,需要和word2idx字典配合使用
print("[%d / %d] words have found pre-trained values"%(count, len(word2idx)))
np.save('./vocab/word.npy', embedding)
print('Saved ./vocab/word.npy')
将前面的embedding 保存下来
打印结果:
[19676 / 20598] words have found pre-trained values
Saved ./vocab/word.npy