实体命名识别详解(七)

    # 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。


image.png

示例见上。

  • 所以回到之前,这里返回一个单词和序列的键值对,并在一个for循环里分别赋值给变量word 和 i。
    接下来是一个判断,如果i不等于vocab的长度-1(因为i从0计数,所以要减1),那么将word写入并回车,换下一行。最后输出【"- done. {} tokens"】
  • 最后,我们看一下最后输出的结果。
    image.png

    test.txt是训练集和测试集和开发集(这里因为只是做一个小测试,所以就用了一个小文件。)
    test.txt

    总共就100行出头的数据,可怜得让人心疼2333,再看一下我们生成的words.txt文件,这里的是同时出现在test.txt和glove.6B.300d.txt中的word。
    words.txt

    这样。。怎么才23行?因为test.txt有好多word是重复的。可以看到,这里加入了$NUM$$UNK$
    再瞅一眼tags.txt
    tags.txt

你可能感兴趣的:(实体命名识别详解(七))