# Save vocab
write_vocab(vocab, config.filename_words)
write_vocab(vocab_tags, config.filename_tags)
这两句主要是存储之前建立好的vocab(经过去重的并且存在于glove向量集的test.txt数据集)和vocab_tags(经过去重的并且存在于test.txt数据集中的标签)
- 我们先看一下write_vocab()函数。
def write_vocab(vocab, filename):
"""Writes a vocab to a file
Writes one word per line.
Args:
vocab: iterable that yields word
filename: path to vocab file
Returns:
write a word per line
"""
print("Writing vocab...")
with open(filename, "w") as f:
for i, word in enumerate(vocab):
if i != len(vocab) - 1:
f.write("{}\n".format(word))
else:
f.write(word)
print("- done. {} tokens".format(len(vocab)))
函数介绍:将vocab写入文件,一行一个单词。
参数:vocab:word迭代器,这里指的是set类型。
filename:要存入的文件地址。
没有返回值。
接下来,以写入方式打开filename,然后跟一个for循环,enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
这是enumerate()的使用方法。
enumerate(sequence, [start=0])
sequence是一个序列,然后start确定下标起始位置,默认是0。
示例见上。
- 所以回到之前,这里返回一个单词和序列的键值对,并在一个for循环里分别赋值给变量word 和 i。
接下来是一个判断,如果i不等于vocab的长度-1(因为i从0计数,所以要减1),那么将word写入并回车,换下一行。最后输出【"- done. {} tokens"】 - 最后,我们看一下最后输出的结果。
test.txt是训练集和测试集和开发集(这里因为只是做一个小测试,所以就用了一个小文件。)
总共就100行出头的数据,可怜得让人心疼2333,再看一下我们生成的words.txt文件,这里的是同时出现在test.txt和glove.6B.300d.txt中的word。
这样。。怎么才23行?因为test.txt有好多word是重复的。可以看到,这里加入了$NUM$和$UNK$。
再瞅一眼tags.txt。