【问题标题】:Pass tokens to CountVectorizer将令牌传递给 CountVectorizer
【发布时间】:2016-06-22 09:42:56
【问题描述】:

我有一个文本分类问题,我有两种类型的特征:

  • n-gram 特征(由 CountVectorizer 提取)
  • 其他文本特征(例如,存在来自给定词典的单词)。这些特征与 n-gram 不同,因为它们应该是从文本中提取的任何 n-gram 的一部分。

这两种类型的特征都是从文本的标记中提取的。我只想运行一次标记化,然后将这些标记传递给 CountVectorizer 和其他存在特征提取器。所以,我想将一个标记列表传递给 CountVectorizer,但它只接受一个字符串作为某个样本的表示形式。有没有办法传递一个令牌数组?

【问题讨论】:

    标签: scikit-learn tokenize


    【解决方案1】:

    总结@user126350和@miroli以及这个link的答案:

    from sklearn.feature_extraction.text import CountVectorizer
    
    def dummy(doc):
        return doc
    
    cv = CountVectorizer(
            tokenizer=dummy,
            preprocessor=dummy,
        )  
    
    docs = [
        ['hello', 'world', '.'],
        ['hello', 'world'],
        ['again', 'hello', 'world']
    ]
    
    cv.fit(docs)
    cv.get_feature_names()
    # ['.', 'again', 'hello', 'world']
    

    要记住的一件事是在调用 transform() 函数之前将新的标记化文档包装到一个列表中,以便将其作为单个文档处理,而不是将每个标记解释为一个文档:

    new_doc = ['again', 'hello', 'world', '.']
    v_1 = cv.transform(new_doc)
    v_2 = cv.transform([new_doc])
    
    v_1.shape
    # (4, 4)
    
    v_2.shape
    # (1, 4)
    

    【讨论】:

      【解决方案2】:

      类似于 user126350 的回答,但更简单的是,这就是我所做的。

      def do_nothing(tokens):
          return tokens
      
      pipe = Pipeline([
          ('tokenizer', MyCustomTokenizer()),
          ('vect', CountVectorizer(tokenizer=do_nothing,
                                   preprocessor=None,
                                   lowercase=False))
      ])
      
      doc_vects = pipe.transform(my_docs)  # pass list of documents as strings
      

      【讨论】:

        【解决方案3】:

        一般情况下,您可以将自定义tokenizer 参数传递给CountVectorizer。标记器应该是一个函数,它接受一个字符串并返回其标记的数组。但是,如果您已经在数组中有标记,则可以简单地使用任意键创建标记数组的字典,并让标记器从该字典返回。然后,当您运行 CountVectorizer 时,只需传递您的字典键。例如,

         # arbitrary token arrays and their keys
         custom_tokens = {"hello world": ["here", "is", "world"],
                          "it is possible": ["yes it", "is"]}
        
         CV = CountVectorizer(
              # so we can pass it strings
              input='content',
              # turn off preprocessing of strings to avoid corrupting our keys
              lowercase=False,
              preprocessor=lambda x: x,
              # use our token dictionary
              tokenizer=lambda key: custom_tokens[key])
        
         CV.fit(custom_tokens.keys())
        

        【讨论】:

          猜你喜欢
          • 2019-09-21
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-03
          • 2018-10-23
          • 2018-08-06
          • 2018-03-03
          相关资源
          最近更新 更多