2017-09-29 7 views
2

TFlearnのVocabularyProcessorを使用してドキュメントを整数配列にマッピングしています。しかし、自分の語彙でVocabularyProcessorを初期化することはできないようです。ドキュメントでは、のようにVocabularyProcessorを作成するときに、私は語彙を提供できることをこう述べています。このようVocabularyProcessorを作成する際に TFlearn - VocabularyProcessorは与えられた語彙の一部を無視します

vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length, vocabulary=vocab) 

は、しかし、私は正しく私の文書を変換することはできません。 は私が値として単語インデックスを使用して、辞書として語彙を提供しています:以下のように

vocab={'hello':3, '.':5, 'world':20} 

文が用意されています

sentences = ['hello summer .', 'summer is here .', ...] 

VocabularyProcessorを変換するために与えられたインデックスを使用していることが非常に重要です各索引が特定の単語埋め込みを参照するためです。

list(vocab_processor.transform(['hello world .', 'hello'])) 

を呼び出す場合、出力は

[array([ 3, 20, 0]), array([3, 0, 0])] 

ので、文章をマッピングして、語彙に従って形質転換されなかった「」であります〜5。 VocabularyProcessorに正しく語彙を提供するにはどうすればよいですか?

答えて

4

次のコードセグメントの出力は、

[array([ 3, 20, 3, 0, 0, 0]), array([3, 0, 0, 0, 0, 0])] 

いる今、あなたはすでに(そのスペースを参照してください(」「)とドットも

vocab={'hello':3, '.':5, 'world':20, '/' : 10} 
sentences= ['hello world ./hello', 'hello'] 

vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length=6, vocabulary=vocab) 
list(vocab_processor.transform(sentences)) 

、のは、あなたの質問に答えるためにいくつかの実験を持ってみましょう'。')、どちらも実際にトークン化されていません。あなたのコードで何が起こるかは、テンソルフローが2つの単語だけを特定し、余分なゼロを埋め込んでmax_document_length=3にすることです。トークン化を実行するには、自分自身でtokenized functionと書くことができます。サンプルコードを以下に示します。

def my_func(iterator): 
    return (x.split(" ") for x in iterator) 

vocab={'hello':3, '.':5, 'world':20, '/' : 10} 
sentences= ['hello world ./hello', 'hello'] 

vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length=6, vocabulary=vocab, tokenizer_fn = my_func) 

list(vocab_processor.transform(sentences)) 

次にコードセグメントの出力は、予想される出力である

[array([ 3, 20, 5, 10, 3, 0]), array([3, 0, 0, 0, 0, 0])] 

ようなものです。これがあなたの混乱をはっきりさせることを願って

次に混乱するのは、デフォルトでトークン化される値です。また、私が指し示すしたい

「独自の関数を記述し、自信を持つことが」あなたは混乱することはできませんように私は、ここに

TOKENIZER_RE = re.compile(r"[A-Z]{2,}(?![a-z])|[A-Z][a-z]+(?=[A-Z])|[\'\w\-]+", 
          re.UNICODE) 
def tokenizer(iterator): 
    """Tokenizer generator. 
    Args: 
    iterator: Input iterator with strings. 
    Yields: 
    array of tokens per each value in the input. 
    """ 
    for value in iterator: 
    yield TOKENIZER_RE.findall(value) 

を元sourceを投稿してみましょうが、私の提案は次のようになります、あなたが逃したならば、ほんの少しのことをしてください(うまくいけば)。 transform()機能を使用している場合、min_frequency引数はデータに適合しないため、機能しません。次のコードで効果を確認しようと、

for i in range(6): 
    vocab_processor = learn.preprocessing.VocabularyProcessor(
     max_document_length=7, min_frequency=i) 
    tokens = vocab_processor.transform(["a b c d e f","a b c d e","a b c" , "a b", "a"]) 
    print(list(vocab_processor.transform(sentences))[0]) 

出力:わずかなコードのために再び

[1 2 3 4 5 6 0] 
[1 2 3 4 5 6 0] 
[1 2 3 4 5 6 0] 
[1 2 3 4 5 6 0] 
[1 2 3 4 5 6 0] 
[1 2 3 4 5 6 0] 

for i in range(6): 
    vocab_processor = learn.preprocessing.VocabularyProcessor(
     max_document_length=7, min_frequency=i) 
    tokens = vocab_processor.fit_transform(["a b c d e f","a b c d e","a b c" , "a b", "a"]) 
    print(list(tokens)[0]) 

出力:

[1 2 3 4 5 6 0] 
[1 2 3 4 5 0 0] 
[1 2 3 0 0 0 0] 
[1 2 0 0 0 0 0] 
[1 0 0 0 0 0 0] 
[0 0 0 0 0 0 0] 
1

これは動作するはず:

processor = learn.preprocessing.VocabularyProcessor(
    max_document_length=4, 
    vocabulary={'hello':2, 'world':20}) 

list(processor.transform(['world hello'])) 
>> [array([20, 2, 0, 0])] 

注このメソッドの出力形状は(1、max_document_length)です。したがって、最後の2つのゼロの埋め込み。

更新: '。あなたのボキャブラリでは、プロセッサのデフォルトのトークナイザによってトークンとして認識されない(したがって0を返す)と思います。デフォルトのtokenizerでは、非常に単純なRegexを使って実際の作業(トークンの特定)を行います。それを参照してくださいhere。この問題を解決するには、4-th argument tokenizer_fnをコンストラクタに指定して、VocabularyProcessorに独自のトークナイザを指定する必要があります。

+0

ですまさに私がやっていること。ただし、vocab = {'hello':3、 '。':5、 'world':20}を使用し、list(processor.transform(['hello world。'、 'hello']))を使用すると、出力は[配列([3、20、0])、配列([3、0、0])]。したがって、文章は、提供された語彙に従って変換されませんでした。 to 5 – Lemon

+0

プロセッサで使用されるデフォルトのトークナイザは、おそらくdotを有効なトークンとして扱いません。それは正常な言葉のために働きますか? – greeness

+0

はい、それは単語のために働く。しかし、私の場合、句読点も「単語」であり、それに応じて扱われるべきです。 – Lemon

関連する問題