实体命名识别详解(九)

到本Python文件的最后了。

    # Build and save char vocab
    train = CoNLLDataset(config.filename_train)
    vocab_chars = get_char_vocab(train)
    write_vocab(vocab_chars, config.filename_chars)

看字面意思:建立和存储char词汇???什么狗屁。
还是先来看一下它生成的文件吧。


实体命名识别详解(九)_第1张图片
image.png

这里我们看到,在data下出现了一个chars.txt文件。


实体命名识别详解(九)_第2张图片
image.png

这是啥啊?噢噢,看样子应该是生成字符什么的。
进程序看一下吧。
train = CoNLLDataset(config.filename_train)

这一句没什么好说的,之前有过一句,只不过那时还带有另一个参数processing_word,所以这里也就是建立了一个训练集实例。

   vocab_chars = get_char_vocab(train)
   write_vocab(vocab_chars, config.filename_chars)

紧接着是定义get_char_vocab()函数并使用data_utils.py中的write_vocab()函数来存储vocab_chars。
先来分析data_utils.py --> get_char_vocab(train)

def get_char_vocab(dataset):
    """Build char vocabulary from an iterable of datasets objects

    Args:
        dataset: a iterator yielding tuples (sentence, tags)

    Returns:
        a set of all the characters in the dataset

    """
    vocab_char = set()
    for words, _ in dataset:
        for word in words:
            vocab_char.update(word)

    return vocab_char

传入的参数是一个数据集,看函数介绍,从可迭代的数据集对象构建char词汇表。
参数的类型是 a iterator yielding tuples (sentence, tags),生成(sentence,tags)键值对的迭代器。
返回set类型的数据集中所有char元素。集合(set)是一个无序不重复的元素序列。
 首先建立一个集合类型,然后从一个for循环里提取words(单词)和tags,其中tags我们不需要所以置 _,随后又在一个for循环内,遍历每个单词的每个字母。。。记得我们之前讲过的set类型的addupdate方法吗?add是把str作为一个整体放到set里,而update是把str拆成单个字符放到set里。最后函数返回vocab_char。
接着看data_utils.py --> write_vocab(vocab_chars, config.filename_chars)

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)))

传入的参数是词汇表和文件存储地址。
看介绍,将词汇表写入文件中去,每行一个word。

  • 先打印
  • for循环建立一个enumerate枚举器,然后依次写入。。和我们之前分析过的写入函数一样。

SUMMARY

这就是我们的build_data.py程序,基本上就是建立了词汇表、词向量表,进行数据的预处理,为之后的训练做准备。我们大概讲了有8个小结,这貌似还是最简单的一部分2333,接下来的旅程我们,,,,,,,,,,,,,,,,,,,,,

冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲

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