tf.contrib.learn.preprocessing.VocabularyProcessor
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>