用spacy覆盖scikitlearn vectorizer的标记器

时间:2018-01-26 11:28:03

标签: python scikit-learn spacy tfidfvectorizer

我想用Spacy包实现词形还原。 这是我的代码:

regexp = re.compile( '(?u)\\b\\w\\w+\\b' )
en_nlp = spacy.load('en')
old_tokenizer = en_nlp.tokenizer
en_nlp.tokenizer = lambda string: old_tokenizer.tokens_from_list(regexp.findall(string))

def custom_tokenizer(document):
    doc_spacy = en_nlp(document)
    return [token.lemma_ for token in doc_spacy]

lemma_tfidfvect = TfidfVectorizer(tokenizer= custom_tokenizer,stop_words = 'english')

但是当我运行该代码时出现了此错误消息。

C:\Users\yu\Anaconda3\lib\runpy.py:193: DeprecationWarning: Tokenizer.from_list is now deprecated. Create a new Doc object instead and pass in the strings as the `words` keyword argument, for example:
from spacy.tokens import Doc
doc = Doc(nlp.vocab, words=[...])
  "__main__", mod_spec)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

要自定义spaCy的标记生成器,您需要向其传递一个字典列表,这些字典指定需要自定义标记的单词以及应分割成的标记。以下是docs的示例代码:

from spacy.attrs import ORTH, LEMMA
case = [{"don't": [{ORTH: "do"}, {ORTH: "n't", LEMMA: "not"}]}]
tokenizer.add_special_case(case)

如果您这样做是因为您想要制作自定义 lemmatizer ,那么您最好直接创建自定义引理列表。您必须修改spaCy本身的语言数据,但格式非常简单:

"dustiest": ("dusty",),
"earlier": ("early",),
"earliest": ("early",),
"earthier": ("earthy",),
...

这些文件以here为英文。

答案 1 :(得分:0)

我认为您的代码运行正常,您只是获得DeprecationWarning,这实际上并不是错误。

根据警告提供的建议,我认为您可以修改代码

en_nlp.tokenizer = lambda string: Doc(en_nlp.vocab, words = regexp.findall(string))

这应该可以正常运行而没有警告(今天在我的机器上运行)。