2017-01-14 110 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通常用于编码分类变量。但不建议编码整个文本!

相关问题