【问题标题】:Using spacy as tokenizer in sklearn pipeline在 sklearn 管道中使用 spacy 作为分词器
【发布时间】:2018-12-21 21:43:36
【问题描述】:

我正在尝试在更大的 scikit-learn 管道中使用 spacy 作为标记器,但一直遇到无法将任务发送给工作人员的问题。

小例子:

from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import RandomizedSearchCV
from sklearn.datasets import fetch_20newsgroups
from functools import partial
import spacy


def spacy_tokenize(text, nlp):
    return [x.orth_ for x in nlp(text)]

nlp = spacy.load('en', disable=['ner', 'parser', 'tagger'])
tok = partial(spacy_tokenize, nlp=nlp)

pipeline = Pipeline([('vectorize', CountVectorizer(tokenizer=tok)),
                     ('clf', SGDClassifier())])

params = {'vectorize__ngram_range': [(1, 2), (1, 3)]}

CV = RandomizedSearchCV(pipeline,
                        param_distributions=params,
                        n_iter=2, cv=2, n_jobs=2,
                        scoring='accuracy')

categories = ['alt.atheism', 'comp.graphics']
news = fetch_20newsgroups(subset='train',
                          categories=categories,
                          shuffle=True,
                          random_state=42)

CV.fit(news.data, news.target)

运行这段代码我得到了错误:

PicklingError: Could not pickle the task to send it to the workers.

让我困惑的是:

import pickle
pickle.dump(tok, open('test.pkl', 'wb'))

工作没有问题。

有人知道是否可以将 spacy 与 sklearn 交叉验证一起使用? 谢谢!

【问题讨论】:

    标签: python scikit-learn spacy


    【解决方案1】:

    这不是解决方案,而是解决方法。看起来 spacy 和 joblib 之间存在一些问题:

    如果您可以将标记器作为函数保存在目录中的单独文件中,然后将其导入当前文件,则可以避免此错误。比如:

    • custom_file.py

      import spacy
      nlp = spacy.load('en', disable=['ner', 'parser', 'tagger'])
      
      def spacy_tokenizer(doc):
          return [x.orth_ for x in nlp(doc)]
      
    • .py

      #Other code     
      ...
      ... 
      
      from custom_file import spacy_tokenizer
      
      pipeline = Pipeline([('vectorize', CountVectorizer(tokenizer=spacy_tokenizer)),
                           ('clf', SGDClassifier())])
      
      ...
      ...
      

    【讨论】:

    • 谢谢,为我解决了这个问题!虽然我很困惑为什么它会起作用......如果在某个时候会有一个 spacy/joblib 解决方案会很棒,因为在我看来这应该是一个非常常见的用例。
    • 我没有尝试最新的 spacy-nightly 开发版本,看来问题可能会从您发布的 spacy 问题中解决 (github.com/explosion/spaCy/issues/1669)
    • 抱歉不应该是lemma_ 而不是orth_
    • @Jill-JênnVie 上面的例子只显示了保存一个spacy tokenizer。用户可以按照自己认为合适的方式使用。 orth_ 仅取自问题。如果您有其他用途,请随意使用lemma_
    猜你喜欢
    • 2019-12-12
    • 2020-12-03
    • 2018-10-15
    • 2014-11-07
    • 2022-11-02
    • 2015-03-26
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多