【问题标题】:How to use custom text data format for sklearn's CountVectorizer()?如何为 sklearn 的 CountVectorizer() 使用自定义文本数据格式?
【发布时间】:2017-07-12 18:22:28
【问题描述】:

有一个不错的introduction on how to use sklearn for text analytics

但是在上面的教程中,他们将 sklearn 的数据集与未详细指定的“bunch”对象一起使用,因此我很难将我的数据放入所需的形式以在其上使用 sklearn 方法。 我想在我的文本数据上使用CountVectorizer() 进行进一步处理,但调用 CountVectorizer.fit_transform(my_string_array) 总是会引发一些错误:

AttributeError: 'list' 对象没有属性 'lower'

到目前为止,我已经尝试过初始化以下 numpy 数组类型并将我的字符串加载到它们中,但它们都不起作用:

  1. np.chararray(形状)
  2. np.empty(shape, dtype = str/obj)

【问题讨论】:

    标签: text scikit-learn


    【解决方案1】:

    CountVectorizer 需要一个序列或字符串列表来处理为mentioned here

    输入:字符串{‘文件名’、‘文件’、‘内容’}

    如果是“文件名”,则作为参数传递给 fit 的序列应该是需要读取以获取要分析的原始内容的文件名列表。

    如果是“文件”,则序列项必须有一个“读取”方法(类似文件的对象),该方法被调用以获取内存中的字节。

    否则输入应为序列字符串或字节项应直接分析。

    您提供的是[['string1', 'string2', ....], ['string1', 'string2', ....]。外面是一个数组,所以这个需求是完整的。

    然后 CountVectorizer() 迭代您提供的列表的元素。

    它期望:object of type string,并在其上调用lower()(制作小写字符串)。 它得到:['string1', 'string2', ....] 这是一个列表,显然 没有 lower() 方法。因此出现错误。

    解决方案: 在我看来,如果不是字符串列表,而是只使用一个传递给 CountVectorizer() 的列表,它不会改变结果。

    通过执行以下操作将字符串的内部列表(您正在使用的每个文档列表)创建一个字符串:

    data = [" ".join(x) for x in data]

    data 是您的字符串数据,其中包含字符串列表。

    假设您的数据是:

    data = [['yo', 'dude'],['how','are', 'you']]
    data = [" ".join(x) for x in data]
    

    输出:

    ['yo dude', 'how are you']
    

    这现在可以毫无错误地传递给 CountVectorizer。

    【讨论】:

      【解决方案2】:

      一个简化的例子:

      from sklearn.feature_extraction.text import CountVectorizer
      
      docs = ['This is the first document', 'This is the second document']
      count_vect = CountVectorizer()
      X_train_counts = count_vect.fit_transform(docs)
      

      docs 应该是字符串的集合,即列表、numpy 数组等。

      如果文本已经被标记,那么你需要告诉CountVectorizer它不需要拆分字符串:

      from sklearn.feature_extraction.text import CountVectorizer
      
      docs = [['This', 'is', 'the', 'first', 'document'], 
              ['This', 'is', 'the', 'second', 'document']]
      count_vect = CountVectorizer(tokenizer=lambda text: text)
      X_train_counts = count_vect.fit_transform(docs)
      

      【讨论】:

      • 问题是我的数据是一个字符串数组,即。 [['string1', 'string2', ....], ['string1', 'string2', ....], .... ]
      • @ben0it8,好的,为什么您的数据是 2D 而不是 1D(文档集合)?您是否已经对文档进行了标记?
      • 是的,我数组中的每个元素都对应一个文档的字符串。
      • @ben0it8 为什么是 2D 而不是 1D?它已经被标记化了吗?请查看我的编辑或添加一个示例,说明您的数据在不起作用时的样子。
      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2019-08-29
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2016-11-11
      • 1970-01-01
      相关资源
      最近更新 更多