我使用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
中使用它会产生错误,下面是一个自包含的示例:
当我在标记器的构造函数之外加载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对象,它是在这些作业之间共享的,这就留下了问题:
spacy.load('en')
的spacynlp对象是否可供GridSearchCV中的多个作业使用?在
为网格中的每个参数设置运行Spacy是在浪费时间。内存开销也非常大。您应该通过Spacy运行所有数据一次并将其保存到磁盘上,然后使用一个简化的向量器来读入经过词组化处理的数据。看看}参数。有很多关于堆栈溢出的例子展示了如何构建一个自定义向量器。在
tokenizer
、analyser
和{相关问题 更多 >
编程相关推荐