如许的前提概率固然好求,然则会损掉大年夜量的前面的词典信息,有时会对结不雅产生不良影响。是以若何选择一个有效的n,使得既能简化计算,又能保存大年夜部分的高低文信息。
以上均是传统说话模型的描述。如不雅不太深究细节,我们的义务就是,知道前面n个词,来计算下一?词出现的概率。并且应用说话模型来生成新的文本。
在本文中,我们加倍存眷的是,若何应用RNN来推想下一?词。
数据预备 TensorFlow的官方文档应用的是Mikolov预备好的PTB数据集。我们可以将其下载并解压出来:获得:
- f = _read_words('simple-examples/data/ptb.train.txt')
- print(f[:20])
构建词汇表,词与id互转:
- ['aer', 'banknote', 'berlitz', 'calloway', 'centrust', 'cluett', 'fromstein', 'gitano', 'guterman', 'hydro-quebec', 'ipo', 'kia', 'memotec', 'mlx', 'nahb', 'punts', 'rake', 'regatta', 'rubens', 'sim']
- def _build_vocab(filename):
- data = _read_words(filename)
- counter = Counter(data)
- count_pairs = sorted(counter.items(), key=lambda x: -x[1])
- words, _ = list(zip(*count_pairs))
- word_to_id = dict(zip(words, range(len(words))))
- return words, word_to_id
输出:
- words, words_to_id = _build_vocab('simple-examples/data/ptb.train.txt')
- print(words[:10])
- print(list(map(lambda x: words_to_id[x], words[:10])))
部分数据如下,不常用的词转换成了<unk>标记,数字转换成了N:
- $ wget http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz
- $ tar xvf simple-examples.tgz
将一个文件转换为id表示:
- ('the', '<unk>', '<eos>', 'N', 'of', 'to', 'a', 'in', 'and', "'s")
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
词汇表已根据词频进行排序,因为第一句话非英文,所以id靠后。
- words_in_file = _file_to_word_ids('simple-examples/data/ptb.train.txt', words_to_id)
- print(words_in_file[:20])