【问题标题】:How to vectorize and devectorize using sklearn's CountVectorizer?如何使用 sklearn 的 CountVectorizer 进行矢量化和去矢量化?
【发布时间】:2017-05-29 17:34:05
【问题描述】:

我想将一些文本矢量化为相应的整数,然后将这些文本转换为其映射的整数,并使用新的输入整数 [2,9,39,46,56,12,89,9] 创建新句子。

我已经看到了一些可以用于此目的的自定义功能,但我想知道 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=

【问题讨论】:

    标签: python scikit-learn sklearn-pandas


    【解决方案1】:

    为了将句子向量化为整数,您可以使用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 函数,其中将特征的稀疏向量作为输入。但是,在您的示例中,您想创建一个可能出现相同术语的句子,并且使用该功能是不可能的。

    但是,解决方案是使用词汇表(word to id)并在此基础上构建逆向词汇表(id to 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']
    

    【讨论】:

    • 感谢您的代码,但我的代码有一些小问题。在mapped_a 中,我不想要稀疏矩阵,而是想用其映射的整数替换每个单词。让我们考虑一下单词dolor 它映射到17 同样我想用这些整数替换文本a 中的每个单词。其次,它的句子创建考虑这些输入input1 = [2,54,9]input1 = [9,54,2] 我希望代码保持打印句子的顺序,但两个输入序列产生相同的结果array([u'aliquam', u'commodo', u'magna'], dtype='<U12')] 没有维护顺序。
    • 我更新了问题的第一部分以输出所有单词的 id。第二部分,从 ids 到单词,应该工作并保持顺序(注释为带有 for 循环的自定义解决方案的部分)。
    【解决方案2】:

    看一下 sklearn 中的预处理库,LabelEncoder 和 OneHotEncoder 通常用于对分类变量进行编码。但是不建议对整个文本进行编码!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2020-08-16
      • 2010-09-29
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多