spaCy和scikitlearn vectoriz

2024-10-04 03:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用spaCy为scikit learn编写了一个引理标记器,基于它们的example,它可以独立工作:

import spacy
from sklearn.feature_extraction.text import TfidfVectorizer

class LemmaTokenizer(object):
    def __init__(self):
        self.spacynlp = spacy.load('en')
    def __call__(self, doc):
        nlpdoc = self.spacynlp(doc)
        nlpdoc = [token.lemma_ for token in nlpdoc if (len(token.lemma_) > 1) or (token.lemma_.isalnum()) ]
        return nlpdoc

vect = TfidfVectorizer(tokenizer=LemmaTokenizer())
vect.fit(['Apples and oranges are tasty.'])
print(vect.vocabulary_)
### prints {'apple': 1, 'and': 0, 'tasty': 4, 'be': 2, 'orange': 3}

但是,在GridSearchCV中使用它会产生错误,下面是一个自包含的示例:

^{pr2}$

当我在标记器的构造函数之外加载spacy时,不会出现错误,GridSearchCV运行:

spacynlp = spacy.load('en')
    class LemmaTokenizer(object):
        def __call__(self, doc):
            nlpdoc = spacynlp(doc)
            nlpdoc = [token.lemma_ for token in nlpdoc if (len(token.lemma_) > 1) or (token.lemma_.isalnum()) ]
            return nlpdoc

但这意味着来自GridSearchCV的每个n_jobs都将访问并调用同一个spacynlp对象,它是在这些作业之间共享的,这就留下了问题:

  1. 来自spacy.load('en')的spacynlp对象是否可供GridSearchCV中的多个作业使用?在
  2. 这是在scikit learn的标记器中实现对spacy的调用的正确方法吗?在

Tags: 标记selftokendocspacydefloadscikit
1条回答
网友
1楼 · 发布于 2024-10-04 03:23:59

为网格中的每个参数设置运行Spacy是在浪费时间。内存开销也非常大。您应该通过Spacy运行所有数据一次并将其保存到磁盘上,然后使用一个简化的向量器来读入经过词组化处理的数据。看看tokenizeranalyser和{}参数。有很多关于堆栈溢出的例子展示了如何构建一个自定义向量器。在

相关问题 更多 >