1. 程式人生 > >tf.contrib.learn.preprocessing.VocabularyProcessor

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>