2017-01-14 56 views
0

テキストを対応する整数にベクトル化し、それらのテキストをマップされた整数に変換し、新しい入力整数[2,9,39,46,56,12,89,9]を使用して新しい文を作成したいとします。sklearnのCountVectorizerを使用してベクトル化およびデベクトル化する方法は?

私はこの目的で使用できるカスタム関数をいくつか見てきましたが、sklearn自体にこのような関数があるかどうかを知りたいと思っています。

from sklearn.feature_extraction.text import CountVectorizer 

a=["""Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Morbi imperdiet mauris posuere, condimentum odio et, volutpat orci. 
Curabitur sodales vulputate eros eu gravida. Sed pharetra imperdiet nunc et tempor. 
Nullam lectus est, rhoncus vitae lacus at, fermentum aliquam metus. 
Phasellus a sollicitudin tortor, non tempor nulla. 
Etiam mattis felis enim, a malesuada ligula dignissim at. 
Integer congue dolor ut magna blandit, lobortis consequat ante aliquam. 
Nulla imperdiet libero eget lorem sagittis, eget iaculis orci dignissim. 
Phasellus sit amet sodales odio. Pellentesque commodo tempor risus, et tincidunt neque. 
Praesent et sem velit. Maecenas id risus sit amet ex convallis ultrices vel sed purus. 
Sed fringilla, leo quis congue sollicitudin, mauris nunc vehicula mi, et laoreet ligula 
urna et nulla. Nam sollicitudin urna sed dolor vehicula euismod. Mauris bibendum pulvinar 
ornare. In suscipit sed mi ut posuere. 
Proin egestas, nibh ut egestas mattis, ipsum nulla bibendum enim, ac suscipit nisl justo 
id metus. Nam est dui, elementum eget suscipit nec, aliquam in mi. Integer tortor erat, 
aliquet at sapien et, fringilla posuere leo. Praesent non congue est. Vivamus tincidunt 
tellus eu placerat tincidunt. Phasellus convallis lacus vitae ex congue efficitur. 
Sed ut bibendum massa, vitae molestie ligula. Phasellus purus felis, fermentum vitae 
hendrerit vel, vulputate quis metus."""] 


vec = CountVectorizer() 
dtm=vec.fit_transform(a) 
print vec.vocabulary_ 

#convert text to corresponding vectors 
mapped_a= 

#new sentence using below mapped values 
#input [2,9,39,46,56,12,89,9] 
#creating sentence using specific sequence 

new_sentence= 

答えて

3

文を整数にベクトル化する場合は、transform機能を使用できます。この関数の出力は、各項 - 特徴ベクトルのカウントを持つベクトルです。

vec = CountVectorizer() 
vec.fit(a) 
print vec.vocabulary_ 

new_sentence = "dolor nulla enim" 
mapped_a = vec.transform([new_sentence]) 
print mapped_a.toarray() # sparse feature vector 

tokenizer = vec.build_tokenizer() 
# array of words ids 
for token in tokenizer(new_sentence): 
    print vec.vocabulary_.get(token) 

質問の第2部分はあまり簡単ではありません。 CountVectorizerは、この目的のために機能のスパースベクトルを入力として用いてinverse_transformの機能を有する。しかし、あなたの例では、同じ用語が出現する可能性のある文章を作成したいと考えており、その機能では不可能です。

しかし、解決策は、それに基づいて語彙(単語からIDへ)と逆の語彙(IDから単語へ)を使用することです。 CountVectorizerはデフォルトではinverse_vocabularyではないため、vocabularyに基づいて作成する必要があります。

input = [2,9,9] 

# 1. inverse_transform function 
# create sparse vector 
sparse_input = [1 if i in input else 0 for i in range(0, len(vec.vocabulary_))] 
print vec.inverse_transform(sparse_input) 
> ['aliquam', 'commodo'] 


# 2. Inverse vocabulary - custom solution 
terms = np.array(list(vec.vocabulary_.keys())) 
indices = np.array(list(vec.vocabulary_.values())) 
inverse_vocabulary = terms[np.argsort(indices)] 

for i in input: 
    print inverse_vocabulary[i] 
> ['aliquam', 'commodo', 'commodo'] 
+0

コードありがとうございますが、コードに少し問題があります。 'mapped_a'では疎な行列は必要ありませんが、代わりにすべての単語をマップされた整数で置き換えたいと思います。同様に、 'a'というテキストのすべての単語をそれらの整数に置き換えたいと思う' dolor'という単語が '17'にマップされていると考えてみましょう。次に、その文章はこれらの入力を考慮する 'input1 = [2,54,9]' 'input1 = [9,54,2]'私はコードが印刷された文章の順序を維持すると期待していたが、 [u'aliquam '、u'commodo'、u'magna ']、dtype =' Eka

+1

質問の最初の部分をすべての単語のIDを出力するように更新しました。 2番目の部分は、idsから単語まで、注文を処理して維持する必要があります(forループでカスタムソリューションとしてコメントされた部分)。 –

0

sklearnでライブラリを前処理を見て、LabelEncoderとOneHotEncoderは通常、カテゴリー変数をエンコードするために使用されています。しかし、テキスト全体をエンコードすることはお勧めできません!

関連する問題