2017-01-14 107 views
0

我想將某些文本向量化爲相應的整數,然後將這些文本轉換爲其映射的整數,並使用新的輸入整數[2,9,39,46,56,12,89,9]創建新句子。如何使用sklearn的CountVectorizer進行矢量化和devectorize?

我見過一些可以用於此目的的自定義函數,但我想知道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) 

問題的第二部分並不那麼直截了當。 CountVectorizer具有inverse_transform函數用於此功能的稀疏矢量作爲輸入。但是,在您的示例中,您希望創建一個可能出現相同條款的句子,並且該功能不可行。

但是,解決方案是使用詞彙表(字到id)和基於它建立反向詞彙表(id到word)。 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'我不想要稀疏矩陣,而是我想用它的映射整數替換每個單詞。讓我們把'dolor'這個單詞映射到'17',同樣我想用這些整數來替換文本'a'中的每個單詞。其次,它的語句創建考慮了這些輸入input1 = [2,54,9]''input1 = [9,54,2]'我期望代碼保持打印句子的順序,但是兩個輸入序列產生相同的結果數組[u'aliquam',u'commodo',u'magna'],dtype =' Eka

+1

我更新了問題的第一部分以輸出所有單詞的ID。第二部分,從id到words,應該工作和維護順序(該部分用for循環評論爲自定義解決方案)。 –

0

看看預處理在sklearn庫,LabelEncoder和OneHotEncoder通常用於編碼分類變量。但不建議編碼整個文本!

相關問題