tflearn的VocabularyProcessor用法:建立中文词汇表和把文本转为词ID序列
tf.contrib.learn.preprocessing.VocabularyProcessor(max_document_length, min_frequency=0, vocabulary=None, tokenizer_fn=None)
max_document_length: 文档的最大长度。如果文本的长度大于最大长度,那么它会被剪切,反之则用0填充。
min_frequency: 词频的最小值,出现次数小于最小词频则不会被收录到词表中。
vocabulary: CategoricalVocabulary 对象。
tokenizer_fn:分词函数
例:
from jieba import cut
import tensorflow as tf
DOCUMENTS = [
'这是一条测试1',
'这是一条测试2',
'这是一条测试3',
'这是其他测试',
]
def chinese_tokenizer(documents):
"""
把中文文本转为词序列
"""
for document in documents:
# 英文转小写
text = text.lower()
# 分词
yield list(cut(text))
# 序列长度填充或截取到20,删除词频<=2的词
vocab = tf.contrib.learn.preprocessing.VocabularyProcessor(20, 0, tokenizer_fn=chinese_tokenizer)
# 创建词汇表,创建后不能更改
vocab.fit(DOCUMENTS)
# 保存和加载词汇表
#vocab.save('vocab.pickle')
#vocab = VocabularyProcessor.restore('vocab.pickle')
# 文本转为词ID序列,未知或填充用的词ID为0
id_documents = list(vocab.transform(DOCUMENTS))
for id_document in id_documents:
print(id_document)
[1 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 2 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 7 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
for document in vocab.reverse(id_documents):
print(document)
这是 一条 测试 1 <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK>
这是 一条 测试 2 <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK>
这是 一条 测试 3 <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK>
这是 其他 测试 <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK> <UNK>